用于收集和整理 Ascend C / CANN 相关仓库语料的工具集,目标是把多平台代码仓库转换为适合大模型预训练的结构化 JSONL 语料。
详细运行说明见:
docs/5-minute-onboarding.mddocs/runbook.mddocs/schema-gap-analysis.mddocs/codebase-interpretation.md
当前实现覆盖:
- GitCode、Gitee、GitHub 的仓库发现与 API 采集
- 本地
git clone/fetch后的源码、文档、commit history 抽取 code/doc/issue/pull_request/commit/branch六类语料输出- 官方文档页与 toolkit 下载页的手工来源补充
- 增量写出的
manifest.json、index/repos.json、index/shards.json - 逐仓阶段状态、断点续做与实时状态看板
- 基础统计与详细分析脚本
当前重要约定:
- 现在的正式输出结构是
data/raw+data/normalized - 默认不做训练前内容去重
- 默认分支会优先处理,但不会丢掉其他分支
asc-data/
config.yaml
repos/
<platform>/
<org_name>/<repo>/
_misc/<owner>--<repo>/
data/
raw/
<snapshot>/
api/
docs/
toolkit/
discovery/
status/
normalized/
<snapshot>/
repos/
index/
manifest.json
docs/
runbook.md
schema-gap-analysis.md
scripts/
build_corpus.py
stats.py
analyze_corpus.py
sources/
ascend_language_sources.yaml
src/
目录说明:
repos/: 跨 snapshot 复用的 Git 缓存,正式布局为repos/<platform>/<bucket>/<repo_key>/- 如果旧版本运行留下了本应属于核心 org 的
_misc/<owner>--<repo>/,优先运行scripts/reorganize_repo_cache.py重组缓存,而不是直接删除全部产物 data/raw/<snapshot>/: 当前 snapshot 的原始抓取结果data/raw/<snapshot>/status/: 当前 snapshot 的任务状态与实时看板data/normalized/<snapshot>/: 当前 snapshot 的结构化语料与索引docs/runbook.md: 最详细的运行手册docs/5-minute-onboarding.md: 新同学 5 分钟上手说明docs/schema-gap-analysis.md: 当前 schema 与 The Stack v2 的差异分析docs/codebase-interpretation.md: 当前代码仓库结构与数据流解读
推荐环境:
- Python
3.11 - Conda 环境:
dev-py311
安装依赖:
conda create -n dev-py311 python=3.11 -y
conda run -n dev-py311 pip install -r requirements.txt新环境建议先做一轮 CLI 自检:
conda run -n dev-py311 python scripts/build_corpus.py --help
conda run -n dev-py311 python scripts/show_run_status.py --help
conda run -n dev-py311 python scripts/stats.py --help
conda run -n dev-py311 python scripts/analyze_corpus.py --help建议配置:
GITCODE_TOKENGITEE_TOKENGITHUB_TOKEN
可以二选一:
方式 1:直接在 shell 里导出
export GITCODE_TOKEN="your_gitcode_token"
export GITEE_TOKEN="your_gitee_token"
export GITHUB_TOKEN="your_github_token"方式 2:在项目根目录创建 .env
cp .env.example .env然后编辑 .env:
GITCODE_TOKEN=your_gitcode_token
GITEE_TOKEN=your_gitee_token
GITHUB_TOKEN=your_github_token当前加载规则:
config.yaml中的${...}同时支持 shell 环境变量和项目根目录.env- 如果 shell 环境变量和
.env同时存在,优先使用.env
conda run -n dev-py311 python scripts/build_corpus.py --config config.yaml --discover-only发现结果会写到:
data/raw/<snapshot>/discovery/discovered_repos.json
conda run -n dev-py311 python scripts/build_corpus.py --config config.yaml --repo-limit 10补充说明:
seed_repos现在会严格按config.yaml中的书写顺序优先处理- 在默认配置下,
--repo-limit 1会先处理seed_repos.gitcode里的第一个核心仓,也就是cann/ops-nn - 如果你想做“只跑一个指定仓”的隔离测试,最稳妥的方式仍然是临时复制一份配置,只保留该仓并清空
seed_orgs与search_keywords
conda run -n dev-py311 python scripts/build_corpus.py --config config.yaml如果你只想跑部分任务,可以用阶段筛选:
conda run -n dev-py311 python scripts/build_corpus.py --config config.yaml --only-stages clone,code,commits
conda run -n dev-py311 python scripts/build_corpus.py --config config.yaml --skip-stages pulls,branches可选阶段:
manualclonecodecommitsissuespullsbranches
说明:
code和commits依赖本地仓缓存,选中它们时会自动补做cloneissues、pulls、branches可以独立运行,适合把 API 类阶段单独补齐manual是手工文档/工具包源,建议在共享 snapshot 中只初始化一次
如果你想多人分工跑同一个 snapshot,可以按仓库切片:
conda run -n dev-py311 python scripts/build_corpus.py --config config.yaml --output-version <snapshot> --repo-slice 1/3 --only-stages clone,code,commits,issues,pulls,branches
conda run -n dev-py311 python scripts/build_corpus.py --config config.yaml --output-version <snapshot> --repo-slice 2/3 --only-stages clone,code,commits,issues,pulls,branches
conda run -n dev-py311 python scripts/build_corpus.py --config config.yaml --output-version <snapshot> --repo-slice 3/3 --only-stages clone,code,commits,issues,pulls,branches协作建议:
- 先用同一个
--output-version <snapshot>做一次--discover-only - 再由一个 worker 单独执行一次
--only-stages manual - 之后各 worker 使用不同的
--repo-slice N/M跑互不重叠的仓库分片 - 不要让多个 worker 处理同一个
repo-slice
如果你是多台服务器各自运行、最后再汇聚,更推荐冻结发现结果并使用 job YAML:
conda run -n dev-py311 python scripts/build_corpus.py --config config.yaml --discover-only --output-version <snapshot>
conda run -n dev-py311 python scripts/build_corpus.py --job-file docs/corpus-jobs.example.yaml --job import-discovery
conda run -n dev-py311 python scripts/build_corpus.py --job-file docs/corpus-jobs.example.yaml --job manual-init
conda run -n dev-py311 python scripts/build_corpus.py --job-file docs/corpus-jobs.example.yaml --job worker-1推荐分工方式:
- 协调者先产出一份冻结的
discovered_repos.json - 各服务器拿同一份
discovered_repos.json和同一份 job YAML - 每台服务器只执行自己的
job - 最后把各服务器的
data/raw/<snapshot>/status/repos/、data/raw/<snapshot>/api/、data/raw/<snapshot>/docs/、data/raw/<snapshot>/toolkit/、data/normalized/<snapshot>/repos/汇聚到同一个目录 - 汇聚后执行
conda run -n dev-py311 python scripts/rebuild_snapshot_metadata.py --config config.yaml --output-version <snapshot> --discovered-repos-file <frozen-discovery-file>重建summary.json、live.md、manifest.json和索引
如果需要关闭当前终端/IDE,可以改用脱离会话的后台方式:
mkdir -p logs
nohup bash -lc 'source ~/.bashrc && exec conda run -n dev-py311 python scripts/build_corpus.py --config config.yaml --output-version <snapshot>' > logs/corpus-<snapshot>.log 2>&1 < /dev/null &补充说明:
logs/仅用于本地后台运行时保存标准输出/错误输出,不属于语料数据产物,默认应忽略版本控制- 真正的运行进度与恢复状态以
data/raw/<snapshot>/status/live.md和data/raw/<snapshot>/status/summary.json为准
conda run -n dev-py311 python scripts/stats.py data/normalized/<snapshot>
conda run -n dev-py311 python scripts/analyze_corpus.py data/normalized/<snapshot>发现结果:
data/raw/<snapshot>/discovery/discovered_repos.json
原始 API:
data/raw/<snapshot>/api/...
结构化语料:
data/normalized/<snapshot>/repos/<platform>/<owner>/<repo>/<type>/part-00000.jsonl
增量索引:
data/normalized/<snapshot>/manifest.jsondata/normalized/<snapshot>/index/repos.jsondata/normalized/<snapshot>/index/shards.json
分析结果:
data/normalized/<snapshot>/index/analysis.jsondata/normalized/<snapshot>/index/analysis.md
主发现来源包括:
- GitCode 组织:
cann、Ascend、mindspore - Gitee 组织:
ascend - GitHub 组织:
Ascend、Huawei-Ascend、Ascend-Huawei
当前默认策略是:
- 对
cann、Ascend、mindspore三个 GitCode org 做整 org 枚举 - GitCode 作为主来源
- GitHub 主要补 GitCode 未收录的仓
- Gitee 主要补 GitCode 和 GitHub 都未收录的仓
- 同时保留
seed_repos作为强优先级核心仓名单
当前核心种子中包含:
cann/ops-nncann/ops-mathcann/ops-cvcann/ops-transformercann/runtimecann/pyasccann/pto-isacann/hcclcann/hcommmindspore/mindsporemindspore/akgAscend/pytorchAscend/docsmindspore-ai/graphenginenndeploy/nndeployvllm-project/vllm-ascend
更完整的路线与来源说明见:
sources/ascend_language_sources.yaml
主配置文件是 config.yaml。
最重要的配置段:
tokens: 三个平台的 tokenseed_orgs: 初始组织枚举seed_repos: 必须纳入发现流程的核心仓,并且严格按配置顺序优先处理search_keywords: GitHub 搜索补仓关键词discovery: 平台优先级与跨平台镜像折叠规则repo_cache_dir: 顶层本地 clone 缓存目录raw:data/raw输出结构output:data/normalized输出结构filters: 文件过滤规则clone: Git 抓取策略runtime: 并发、超时、重试
-
scripts/build_corpus.py- 主入口
- 支持
--discover-only - 支持
--repo-limit - 支持
--output-version
-
scripts/stats.py- 生成基础统计
-
scripts/analyze_corpus.py- 生成详细分析与逐仓说明
-
scripts/show_run_status.py- 输出当前 snapshot 的实时任务状态摘要
-
scripts/reorganize_repo_cache.py- 把历史 clone 目录迁移到正式的
repos/<platform>/<bucket>/<repo_key>/布局
- 把历史 clone 目录迁移到正式的
看发现阶段:
data/raw/<snapshot>/discovery/discovered_repos.json
看写盘进度:
data/normalized/<snapshot>/manifest.json
看实时任务状态:
data/raw/<snapshot>/status/live.mddata/raw/<snapshot>/status/summary.json
看哪些仓已经真正写出:
data/normalized/<snapshot>/index/repos.json
看 shard 分片:
data/normalized/<snapshot>/index/shards.json
- GitHub 的搜索补仓能力目前强于 GitCode / Gitee
pull_request现在会保留讨论、元数据和完整 patch;但 fork PR 的 patch 仍可能受平台可见性影响commit现在会保留 message、统计摘要和完整 patch,体积会明显增大- 当前默认不做训练前去重
- 当前未做许可证白名单裁剪
如果你第一次接手这个项目,建议按下面顺序看:
- 本
README.md docs/runbook.mdconfig.yamlsources/ascend_language_sources.yamldocs/schema-gap-analysis.md
如果你要看“具体在 shell 里一条一条怎么执行、每步预期输出是什么、失败时怎么排查”,请直接看:
docs/runbook.md
那里已经是终端逐步实操手册,不再在 README.md 重复展开。
其中命令示例默认按 bash 写,同时关键流程也给了可直接复制的 zsh 版本。