diff --git a/.github/ISSUE_TEMPLATE/community_submission.md b/.github/ISSUE_TEMPLATE/community_submission.md deleted file mode 100644 index 3860bc80..00000000 --- a/.github/ISSUE_TEMPLATE/community_submission.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -name: Community submission -about: Submit a benchmark result to the AccelMark leaderboard -title: "[Submission] " -labels: community-submission ---- - - - -```json -(paste the full contents of results/community//result.json here) -``` \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 1501a5c0..87fd51de 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1,8 +1,8 @@ blank_issues_enabled: false contact_links: - name: Live leaderboard - url: https://juhaoliang1997.github.io/AccelMark + url: https://freedomintelligence.github.io/AccelMark about: View all submitted benchmark results - name: Contributing guide - url: https://github.com/JuhaoLiang1997/AccelMark/blob/main/CONTRIBUTING.md + url: https://github.com/FreedomIntelligence/AccelMark/blob/main/CONTRIBUTING.md about: How to run and submit a benchmark diff --git a/.github/ISSUE_TEMPLATE/new_suite.md b/.github/ISSUE_TEMPLATE/new_suite.md index 4c358a18..d3104b71 100644 --- a/.github/ISSUE_TEMPLATE/new_suite.md +++ b/.github/ISSUE_TEMPLATE/new_suite.md @@ -14,7 +14,7 @@ assignees: '' merging. Full walk-through: DEVELOPMENT.md "Adding a new suite" - https://github.com/JuhaoLiang1997/AccelMark/blob/main/DEVELOPMENT.md + https://github.com/FreedomIntelligence/AccelMark/blob/main/DEVELOPMENT.md --> ## Why this suite? diff --git a/.github/workflows/process_submissions.yml b/.github/workflows/process_submissions.yml deleted file mode 100644 index 2a0077a1..00000000 --- a/.github/workflows/process_submissions.yml +++ /dev/null @@ -1,265 +0,0 @@ -name: Process Community Submission - -# Triggered when an issue is labeled "community-submission" -# (The OpenClaw Skill creates issues with this label) -on: - issues: - types: [labeled] - -jobs: - process: - name: Extract and validate submission from issue - # Only run for the specific label - if: github.event.label.name == 'community-submission' - runs-on: ubuntu-latest - permissions: - contents: write - issues: write - pull-requests: write - - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Set up Python 3.11 - uses: actions/setup-python@v5 - with: - python-version: '3.11' - - - name: Install dependencies - run: pip install jsonschema numpy --quiet - - - name: Extract result JSON from issue body - id: extract - uses: actions/github-script@v7 - with: - script: | - const body = context.payload.issue.body; - const issueNumber = context.payload.issue.number; - - // Extract JSON from code block in issue body - const match = body.match(/```json\n([\s\S]*?)\n```/); - if (!match) { - core.setFailed('No JSON code block found in issue body'); - return; - } - - let result; - try { - result = JSON.parse(match[1]); - } catch (e) { - core.setFailed(`Invalid JSON in issue: ${e.message}`); - return; - } - - // Use run_name from result.json - computed deterministically by benchmark_runner. - // Falls back to constructing from parts for older results that predate this field. - let dirName = result.meta?.run_name; - if (!dirName) { - const chip = (result.chip?.name || 'unknown') - .toLowerCase() - .replace(/[^a-z0-9]+/g, '_') - .replace(/^_|_$/g, ''); - const count = result.chip?.count || 1; - const suite = result.suite_id || 'unknown'; - const runner = result.implementation_id || 'unknown'; - const runId = result.meta?.run_id || 'unknown'; - dirName = `${chip}x${count}_${suite}_${runner}_${runId}`; - } - - core.setOutput('dir_name', dirName); - core.setOutput('issue_number', issueNumber); - core.setOutput('result_json', JSON.stringify(result)); - core.setOutput('run_id', result.meta?.run_id || ''); - - console.log(`Submission directory: ${dirName}`); - - - name: Check for duplicate submission - id: duplicate_check - run: | - RUN_ID="${{ steps.extract.outputs.run_id }}" - - if [ -z "$RUN_ID" ] || [ "$RUN_ID" = "unknown" ]; then - echo "No run_id in submission - skipping duplicate check" - echo "is_duplicate=false" >> $GITHUB_OUTPUT - exit 0 - fi - - # Search all existing community result.json files for same run_id - # NOTE: runs BEFORE Write result files so $DIR does not exist yet - EXISTING="" - for f in $(find results/community -name "result.json" 2>/dev/null); do - MATCH=$(python3 -c "import json,sys; r=json.load(open(sys.argv[1])); print('yes' if r.get('meta',{}).get('run_id')=='$RUN_ID' else '')" "$f" 2>/dev/null || echo "") - if [ "$MATCH" = "yes" ]; then - EXISTING="$f" - break - fi - done - - if [ -n "$EXISTING" ]; then - echo "Found existing result with run_id=$RUN_ID at: $EXISTING" - echo "existing_path=$EXISTING" >> $GITHUB_OUTPUT - echo "is_duplicate=true" >> $GITHUB_OUTPUT - else - echo "No duplicate found for run_id=$RUN_ID" - echo "is_duplicate=false" >> $GITHUB_OUTPUT - fi - - - name: Handle duplicate submission - if: steps.duplicate_check.outputs.is_duplicate == 'true' - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - EXISTING="${{ steps.duplicate_check.outputs.existing_path }}" - ISSUE="${{ steps.extract.outputs.issue_number }}" - EXISTING_DIR=$(dirname "$EXISTING") - - # New scenarios from step output (file not written yet) - NEW_SCENARIOS=$(python3 -c "import json,sys; r=json.loads(sys.argv[1]); s=sorted(r.get('task',{}).get('scenarios_run',[])); print(','.join(s) if s else 'none')" '${{ steps.extract.outputs.result_json }}' 2>/dev/null || echo "unknown") - - OLD_SCENARIOS=$(python3 -c "import json,sys; r=json.load(open(sys.argv[1])); s=sorted(r.get('task',{}).get('scenarios_run',[])); print(','.join(s) if s else 'none')" "$EXISTING" 2>/dev/null || echo "unknown") - - echo "Existing scenarios: $OLD_SCENARIOS" - echo "New scenarios: $NEW_SCENARIOS" - - if [ "$NEW_SCENARIOS" = "$OLD_SCENARIOS" ]; then - gh issue comment "$ISSUE" \ - --body "Duplicate submission detected. A result with the same hardware, software, suite, and submitter already exists at \`${EXISTING_DIR}\` with scenarios: \`${OLD_SCENARIOS}\`. If this is intentional (e.g. after a framework update), update \`meta.framework_version\` in your result.json and resubmit." - echo "Rejected: duplicate with same scenarios" - exit 1 - else - gh issue comment "$ISSUE" \ - --body "Note: An existing result with the same run_id was found at \`${EXISTING_DIR}\` (scenarios: \`${OLD_SCENARIOS}\`). This new submission has scenarios: \`${NEW_SCENARIOS}\`. Continuing - this looks like an update." - fi - - - name: Write result files - run: | - DIR="results/community/${{ steps.extract.outputs.dir_name }}" - mkdir -p "$DIR" - - # Write result.json, set meta.log_file to null (local artifact, not submitted) - echo '${{ steps.extract.outputs.result_json }}' | python -m json.tool > "$DIR/result.json" - python3 -c "import json; f=open('$DIR/result.json'); r=json.load(f); f.close(); r.get('meta',{}).update({'log_file':None}); open('$DIR/result.json','w').write(json.dumps(r,indent=2))" - echo "meta.log_file set to null" - - # Create env_info.json - extract from environment block if present, else reconstruct - python3 -c " - import json, sys - - with open('$DIR/result.json') as f: - result = json.load(f) - - chip = result.get('chip', {}) - software = result.get('software', {}) - - env = result.get('environment') - if not env: - # fallback for old results without environment block - env = { - 'collected_at': result.get('meta', {}).get('date', '2026-01-01') + 'T00:00:00Z', - 'accelerators': [{ - 'index': 0, - 'name': chip.get('name', 'Unknown'), - 'memory_gb': chip.get('memory_gb', 0), - 'driver_version': software.get('driver_version', 'unknown'), - 'firmware_version': None, - }], - 'accelerator_topology': None, - 'cpu': { - 'model': 'unknown', - 'physical_cores': 1, - 'logical_cores': 1, - 'numa_nodes': 1, - }, - 'system_memory_gb': 0, - 'pcie_generation': 'unknown', - 'cpu_accelerator_bandwidth_gbs': None, - 'network_interfaces': None, - 'kernel_version': 'unknown', - 'runtime_version': software.get('runtime_version', 'unknown'), - } - print('env_info.json reconstructed from chip data') - else: - print('env_info.json extracted from result.json') - - with open('$DIR/env_info.json', 'w') as f: - json.dump(env, f, indent=2) - - # Create accuracy/accuracy.json from the accuracy block in result.json - import os - acc = result.get('accuracy') - if acc: - os.makedirs('$DIR/accuracy', exist_ok=True) - with open('$DIR/accuracy/accuracy.json', 'w') as f: - json.dump(acc, f, indent=2) - print('accuracy/accuracy.json created') - else: - print('No accuracy block in result.json - skipping accuracy.json') - - " - - - name: Run validation - id: validate - run: | - DIR="results/community/${{ steps.extract.outputs.dir_name }}" - if python runners/validate_submission.py --dir "$DIR"; then - echo "valid=true" >> $GITHUB_OUTPUT - else - echo "valid=false" >> $GITHUB_OUTPUT - fi - - - name: Commit files and create PR - if: steps.validate.outputs.valid == 'true' - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - DIR="results/community/${{ steps.extract.outputs.dir_name }}" - BRANCH="submission/${{ steps.extract.outputs.dir_name }}" - ISSUE="${{ steps.extract.outputs.issue_number }}" - - # Configure git - git config user.name "github-actions[bot]" - git config user.email "github-actions[bot]@users.noreply.github.com" - - # Create and switch to submission branch - git checkout -b "$BRANCH" - - # Stage the result files written in the previous step - # Note: run.log is gitignored intentionally - not committed - git add "$DIR/result.json" "$DIR/env_info.json" - # accuracy/accuracy.json may exist if accuracy data was in result.json - [ -f "$DIR/accuracy/accuracy.json" ] && git add "$DIR/accuracy/accuracy.json" || true - - # Commit - git commit -m "community: add submission from issue #${ISSUE}" - - # Delete remote branch if it exists from a previous failed run, then push fresh - git push origin --delete "$BRANCH" 2>/dev/null || true - git push origin "$BRANCH" - - # Generate summary table and build PR body file - python3 runners/gen_pr_summary.py "$DIR/result.json" > /tmp/pr_summary.md - - printf "Auto-generated from Issue #%s\n\n## Submission summary\n\n" "$ISSUE" > /tmp/pr_body.md - cat /tmp/pr_summary.md >> /tmp/pr_body.md - printf "\nCloses #%s" "$ISSUE" >> /tmp/pr_body.md - - # Create PR (or get existing one if already created) - PR_URL=$(gh pr create \ - --title "[community] ${{ steps.extract.outputs.dir_name }}" \ - --body-file /tmp/pr_body.md \ - --base main \ - --head "$BRANCH" 2>/dev/null) || \ - PR_URL=$(gh pr view "$BRANCH" --json url -q .url) - - # Comment on the issue with PR link - gh issue comment "$ISSUE" --body "Validation passed. PR created: ${PR_URL} - your result will appear on the leaderboard after the PR is reviewed and merged." - - - - name: Comment failure on issue - if: steps.validate.outputs.valid == 'false' - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - gh issue comment "${{ steps.extract.outputs.issue_number }}" \ - --body "Validation failed. See the [workflow run](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}) for details. Fix the errors and ask a maintainer to re-apply the community-submission label to retry." \ No newline at end of file diff --git a/.github/workflows/validate_pr.yml b/.github/workflows/validate_pr.yml index 541af133..6ffe949f 100644 --- a/.github/workflows/validate_pr.yml +++ b/.github/workflows/validate_pr.yml @@ -14,6 +14,12 @@ on: - 'README.md' - 'leaderboard/site/**' +# Lock the default GITHUB_TOKEN down to read-only on repo contents for every +# job (GitHub's hardening recommendation for OSS repos). Jobs that need more +# (e.g. posting a PR comment) opt in explicitly via their own `permissions:`. +permissions: + contents: read + jobs: validate-runners: name: Validate runner folders @@ -116,6 +122,13 @@ jobs: validate: name: Validate result submissions runs-on: ubuntu-latest + # Needs pull-requests:write to post the validation summary comment + # via actions/github-script. After the FreedomIntelligence transfer + # the default GITHUB_TOKEN is read-only on issues/pull-requests, so + # this must be granted explicitly. + permissions: + contents: read + pull-requests: write steps: - name: Checkout PR diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index 354654ba..a476a44e 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -75,7 +75,7 @@ appointed representative at an online or offline event. Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the project maintainers by opening a confidential security -advisory at +advisory at or, when GitHub access is not available, by emailing the maintainer listed in the repository profile. All complaints will be reviewed and investigated promptly and fairly. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index a3044cdc..b582f8cb 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -36,8 +36,6 @@ gh pr create # or open the PR via the GitHub web UI That's it. CI validates the result automatically; merging the PR publishes it to the leaderboard. -> _Prefer not to use git?_ Open a [Community Submission issue](https://github.com/JuhaoLiang1997/AccelMark/issues/new?template=community_submission.md), paste your `result.json`, and the CI bot will draft the PR on your behalf. - --- ## One-time setup @@ -335,23 +333,13 @@ python -m http.server -d leaderboard/site 8000 # serve the static site Both `leaderboard.js` and `leaderboard/site/api/` are gitignored — the GitHub Actions workflow regenerates them on every merge to `main`. -### Alternative: open a submission issue (no git required) - -If you'd rather not use git, paste your `result.json` into a -[Community Submission issue](https://github.com/JuhaoLiang1997/AccelMark/issues/new?template=community_submission.md). -A bot will validate the JSON, draft a PR with the files in the right place, -and link it back to your issue. You don't need to touch git or fork the repo. - -> **Why paste instead of attach?** The bot reads `result.json` directly from -> the issue body. File attachments are not accessible to GitHub Actions. - --- ## Leaderboard tiers | Tier | How to get it | Leaderboard placement | |------|--------------|----------------------| -| **community** | Submit a PR (or issue → bot-drafted PR) and pass CI validation | Community tab | +| **community** | Submit a PR and pass CI validation | Community tab | | **verified** | Independently reproduced on the same hardware/runner within 5% | Main leaderboard | To promote a community result to **verified**, anyone with the same hardware diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md index 98cddbca..990f73bc 100644 --- a/DEVELOPMENT.md +++ b/DEVELOPMENT.md @@ -1134,6 +1134,6 @@ python runners/validate_submission.py --dir /tmp/accelmark_test/ ## Questions and Support - **Bug in LoadGen or schema:** Open a GitHub Issue -- **New suite proposal:** Open a GitHub Issue with the [**Propose a new suite**](https://github.com/JuhaoLiang1997/AccelMark/issues/new?template=new_suite.md) template +- **New suite proposal:** Open a GitHub Issue with the [**Propose a new suite**](https://github.com/FreedomIntelligence/AccelMark/issues/new?template=new_suite.md) template - **New platform support:** Open a PR with a working platform script and at least one verified result - **Leaderboard question:** Check `leaderboard/generate.py` — it's well-commented \ No newline at end of file diff --git a/NOTICE b/NOTICE index d904b638..a0181123 100644 --- a/NOTICE +++ b/NOTICE @@ -2,7 +2,7 @@ AccelMark Copyright 2024-2026 Juhao Liang and The AccelMark Contributors This product includes software developed as part of the AccelMark project -(https://github.com/JuhaoLiang1997/AccelMark). +(https://github.com/FreedomIntelligence/AccelMark). Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/README.md b/README.md index 5fb2f691..c7a18a3e 100644 --- a/README.md +++ b/README.md @@ -10,16 +10,16 @@

- Live Leaderboard + Live Leaderboard License: Apache 2.0 Contributions welcome

- → Live Leaderboard · + → Live Leaderboard · Contributing · Suites · - Discussions · + Discussions · Development

@@ -49,7 +49,7 @@ ```bash # 1. Clone and install -git clone https://github.com/JuhaoLiang1997/AccelMark.git +git clone https://github.com/FreedomIntelligence/AccelMark.git cd AccelMark pip install -e . # installs framework dependencies (Python >=3.10 required) pip install -r runners/nvidia_vllm_47f5d58e/requirements.txt # installs runner dependencies @@ -70,7 +70,7 @@ python run.py --runner nvidia_vllm_47f5d58e --suite suite_A # your result.json and env_info.json; no manual file moves are needed. ``` -See [CONTRIBUTING.md](CONTRIBUTING.md) for the full guide. If you'd rather skip the PR workflow, [open a submission issue](https://github.com/JuhaoLiang1997/AccelMark/issues/new?template=community_submission.md) instead and a bot will draft the PR for you. +See [CONTRIBUTING.md](CONTRIBUTING.md) for the full guide. --- @@ -100,7 +100,7 @@ See [suites/README.md](suites/README.md) for full specs, time budgets, SLA defin width="980">

-A snapshot of accelerators that have at least one submission on the leaderboard. Tile size is proportional to submission count; colour denotes vendor. See the [**live leaderboard**](https://juhaoliang1997.github.io/AccelMark) for current rankings, per-suite breakdowns, and the underlying `result.json` files. +A snapshot of accelerators that have at least one submission on the leaderboard. Tile size is proportional to submission count; colour denotes vendor. See the [**live leaderboard**](https://freedomintelligence.github.io/AccelMark) for current rankings, per-suite breakdowns, and the underlying `result.json` files. --- @@ -136,7 +136,7 @@ Adding a new runner? See [CONTRIBUTING.md#adding-a-new-runner](CONTRIBUTING.md#a | Tier | How | Where | |------|-----|-------| -| **community** | Submitted by anyone via PR (or issue → bot-drafted PR) and passes CI validation | Community tab | +| **community** | Submitted by anyone via PR and passes CI validation | Community tab | | **verified** | Independently reproduced on the same hardware/runner and matches the original within 5% | Main leaderboard | Community results are fully visible and comparable — they just haven't been independently reproduced yet. Anyone with the listed hardware can promote a community result to verified by submitting a reproduction PR. @@ -150,8 +150,8 @@ The most valuable contribution is running the benchmark on hardware not yet in t - **Submit a result** → [Submitting a result](CONTRIBUTING.md#submitting-a-result) - **Add a new runner** → [Adding a new runner](CONTRIBUTING.md#adding-a-new-runner) - **Add a new accelerator family** → [Platform plug-in guide](runners/README.md#adding-a-new-accelerator-family) -- **Report a bug** → [Open an issue](https://github.com/JuhaoLiang1997/AccelMark/issues/new?template=bug_report.md) -- **Ask a question / share results** → [Discussions](https://github.com/JuhaoLiang1997/AccelMark/discussions) +- **Report a bug** → [Open an issue](https://github.com/FreedomIntelligence/AccelMark/issues/new?template=bug_report.md) +- **Ask a question / share results** → [Discussions](https://github.com/FreedomIntelligence/AccelMark/discussions) - **Extend the leaderboard** → [Development guide](DEVELOPMENT.md) > _Optional:_ AccelMark also ships a small voice-driven launcher for the [OpenClaw](https://clawhub.ai) ecosystem — see [`openclaw_skill/`](openclaw_skill/README.md). It's not required to run, contribute, or submit results. @@ -167,7 +167,7 @@ If you use AccelMark results in research, please cite: title = {Beyond NVIDIA! A Multi-Regime Framework for Benchmarking Heterogeneous AI Accelerators}, author = {Liang, Juhao and Zhang, Zhiyuan and Li, Siyu and Lin, Zhihang and Yu, Minchen and Zeng, Li and Chen, Zizhong and Sun, Ruoyu and Wang, Benyou}, year = {2026}, - url = {https://github.com/JuhaoLiang1997/AccelMark} + url = {https://github.com/FreedomIntelligence/AccelMark} } ``` diff --git a/SECURITY.md b/SECURITY.md index 67be232b..11d96f5b 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -40,7 +40,7 @@ providing an initial assessment. We aim to publish a fix and credit the reporter within **30 days** of acknowledgement; if a fix is going to take longer we will say so in the response. -[advisory]: https://github.com/JuhaoLiang1997/AccelMark/security/advisories/new +[advisory]: https://github.com/FreedomIntelligence/AccelMark/security/advisories/new When reporting, please include: diff --git a/leaderboard/generate.py b/leaderboard/generate.py index 4a9ac5ab..bf35de21 100644 --- a/leaderboard/generate.py +++ b/leaderboard/generate.py @@ -273,8 +273,8 @@ def extract_impl(result: dict) -> dict | None: "created": meta.get("created"), "supersedes_chain": meta.get("supersedes_chain"), "deprecated_by": meta.get("deprecated_by"), - "github_url": f"https://github.com/JuhaoLiang1997/AccelMark/tree/main/runners/{impl_id}", - "runner_url": f"https://github.com/JuhaoLiang1997/AccelMark/blob/main/runners/{impl_id}/runner.py", + "github_url": f"https://github.com/FreedomIntelligence/AccelMark/tree/main/runners/{impl_id}", + "runner_url": f"https://github.com/FreedomIntelligence/AccelMark/blob/main/runners/{impl_id}/runner.py", } diff --git a/leaderboard/site/assets/js/modal.js b/leaderboard/site/assets/js/modal.js index a52a3e1f..3461dbbf 100644 --- a/leaderboard/site/assets/js/modal.js +++ b/leaderboard/site/assets/js/modal.js @@ -306,7 +306,7 @@ function _fillModal(row) { const impl = row.impl || {}; let scriptUrl = null; if (d.meta_reproduce_script) { - scriptUrl = `https://github.com/JuhaoLiang1997/AccelMark/blob/main/${d.meta_reproduce_script}`; + scriptUrl = `https://github.com/FreedomIntelligence/AccelMark/blob/main/${d.meta_reproduce_script}`; // If the result references an old (superseded) runner path, point to // the current runner.py instead. if (impl.supersedes_chain && Array.isArray(impl.supersedes_chain)) { diff --git a/leaderboard/site/assets/js/views/home.js b/leaderboard/site/assets/js/views/home.js index 32744317..94602437 100644 --- a/leaderboard/site/assets/js/views/home.js +++ b/leaderboard/site/assets/js/views/home.js @@ -107,11 +107,8 @@ export function render({ el }) {

diff --git a/leaderboard/site/assets/js/views/suites.js b/leaderboard/site/assets/js/views/suites.js index 15e22ae4..f1177b65 100644 --- a/leaderboard/site/assets/js/views/suites.js +++ b/leaderboard/site/assets/js/views/suites.js @@ -7,7 +7,7 @@ import { } from "../data.js"; import { esc, fmtNum, buildHash, shortModel } from "../utils.js"; -const GH_BASE = "https://github.com/JuhaoLiang1997/AccelMark"; +const GH_BASE = "https://github.com/FreedomIntelligence/AccelMark"; // One concrete finding per suite, distilled from the paper. Kept short // enough to fit inside a single card but specific enough to be useful. diff --git a/leaderboard/site/index.html b/leaderboard/site/index.html index 10013843..3ccc2802 100644 --- a/leaderboard/site/index.html +++ b/leaderboard/site/index.html @@ -46,7 +46,7 @@