戰(zhàn)指南)
N步跑通CANNJudge算子競賽提交流程平臺全流程實(shí)戰(zhàn)指南【免費(fèi)下載鏈接】cann-learning-hubCANN 學(xué)習(xí)中心倉支持在線互動運(yùn)行、邊學(xué)邊練提供教程、示例與優(yōu)化方案一站式助力昇騰開發(fā)者快速上手。項(xiàng)目地址: https://gitcode.com/cann/cann-learning-hub你注冊好了 CANNJudge 賬號打開平臺卻不知從哪條命令下手登錄走哪種方式工程模板下回來先改哪個(gè)文件提交后卡在 Running 還是 Pass 該信哪個(gè)這篇指南帶你把登錄 → 取題 → 寫碼 → 提交 → 查分這條鏈路完整走一遍每步都給出可執(zhí)行的命令、成功判據(jù)和典型卡點(diǎn)。工具與腳本在倉庫的 skills/cannjudge-submit/ 目錄需要在線開發(fā)環(huán)境時(shí)可先拉下倉庫再動手git clone https://gitcode.com/cann/cann-learning-hubCANN 為這類算子競賽提供編譯、運(yùn)行與評測底座你寫的 Kernel 最終跑在 AI Core 上Host 側(cè)邏輯負(fù)責(zé)切分與調(diào)度。理解算子在軟件棧中的位置能幫你判斷報(bào)錯(cuò)發(fā)生在哪一層。第一次提交怎么做4 步跑通最短路徑第一次提交不必追求性能目標(biāo)是走通閉環(huán)。下面 4 步全部可用命令行完成每步附做對了的判據(jù)。登錄。在你實(shí)際要執(zhí)行下載和提交的 Linux 主機(jī)上運(yùn)行python3 cannjudge_cli.py login --account youremail.com密碼在終端隱藏輸入。判據(jù)命令結(jié)束后~/.cannjudge/session.json出現(xiàn)權(quán)限 600之后執(zhí)行info等命令不再要求賬號??搭}。用題目鏈接或 ID 查看規(guī)格python3 cannjudge_cli.py info --problem-id add判據(jù)能讀到code_template字段、dtype 列表和算子原型且與你頁面看到的題目一致。公開題目的info/download/--dry-run預(yù)檢不需要本地登錄私有資源仍走服務(wù)端鑒權(quán)。取工程。把模板下載到新目錄下載器拒絕覆蓋已有工程所以務(wù)必?fù)Q新目錄python3 cannjudge_cli.py download --problem-id add --output ./add-work判據(jù)目錄下出現(xiàn)完整工程和.cannjudge-project.json元數(shù)據(jù)能看清哪些文件可編輯。預(yù)檢并提交。改完源碼先預(yù)檢再正式提交python3 cannjudge_cli.py submit --problem-id add --project-dir ./add-work/project --dry-run python3 cannjudge_cli.py submit --problem-id add --project-dir ./add-work/project --no-wait python3 cannjudge_cli.py query --submission-id ID判據(jù)--dry-run列出擬提交文件和 SHA-256 且無報(bào)錯(cuò)正式提交返回 submissionId查詢終態(tài)出現(xiàn)Pass兼容舊狀態(tài)Accepted即算跑通。主線工作流登錄、取題、提交、查結(jié)果怎么串 最短路徑只覆蓋 happy path這一節(jié)把每個(gè)環(huán)節(jié)的輸入、輸出和真實(shí)卡點(diǎn)講清楚。登錄三種方式與兩種會話坑默認(rèn)用終端隱藏輸入登錄最省事。拿不到交互終端比如通過 Agent 遠(yuǎn)程操作時(shí)改用 RSA 密文方式python3 generate_key.py python3 encrypt_password.py --public-key public.pem python3 cannjudge_cli.py login --email youremail.com --ciphertext RSA密文 --private-key private.pem原理是私鑰留在開發(fā)機(jī)、公鑰加密后的密文可以反復(fù)使用——只要private.pem不重新生成同一份密文一直有效。詳細(xì)說明見 references/rsa-login.md。兩種會話坑先說在前面會話默認(rèn)存~/.cannjudge/session.json有效期最長 7 天服務(wù)端可能提前使其失效報(bào) 401 就清除舊會話重新登錄報(bào) 403 先檢查題目和小組權(quán)限別急著反復(fù)重試。Windows 上的 DPAPI 會話搬不到 Linux 復(fù)用必須在執(zhí)行提交的那臺主機(jī)、那個(gè)系統(tǒng)賬號下重新登錄。多賬號切換時(shí)把--session-file PATH放在子命令之前隔離會話。取題鏈接比 ID 更穩(wěn)--problem-id和--problem-url都支持。建議優(yōu)先貼完整鏈接CLI 會按小組、比賽、題目逐層解析作用域同名題不會選錯(cuò)。下載拿到的是真實(shí) ZIP 工程包同時(shí)讀取/template元數(shù)據(jù)生成不含憑據(jù)的模板清單。開發(fā)兩種工程結(jié)構(gòu)別混淆code_template是分流依據(jù)--project-type auto為默認(rèn)不要憑目錄名猜題目類型工程類型你改什么提交內(nèi)容傳統(tǒng)算子工程op_host與op_kernel下的可編輯文件tiling_h、tiling_key_h、host_cpp、kernel_cpp 四字段npu_kernel_dev核函數(shù)工程模板中標(biāo)記 editable 的文件如kernel.ascfiles: [{path, content}]數(shù)組傳統(tǒng)工程的標(biāo)準(zhǔn)目錄長這樣各文件職責(zé)如下code/ ├── op_host/ │ └── {op}.cpp # TilingFunc、InferShape、InferDataType └── op_kernel/ ├── {op}_tiling.h # Tiling 數(shù)據(jù)結(jié)構(gòu) ├── tiling_key_{op}.h # TilingKey 多核切分可選 └── {op}.cpp # Kernel 計(jì)算主體核函數(shù)題沒有 op_host/op_kernel 這層目錄模板里只有可編輯的kernel.asc內(nèi)含run_kernel入口和一批只讀文件CMakeLists.txt、main.asc、data_utils.h、scripts/等。接口簽名、dtype 編碼每次都從當(dāng)次在線模板讀不同題目不同見 references/kernel-project.md。兩條開發(fā)鐵律平臺不開放測試用例 API。你能拿來做本地驗(yàn)證的是下載包內(nèi)的公開數(shù)據(jù)不要嘗試探測隱藏用例。只實(shí)現(xiàn)題目規(guī)定的 dtype、shape 和屬性。不無條件補(bǔ)類型、不加無關(guān)轉(zhuǎn)換多寫不等于多對。提交先預(yù)檢再上線提交動作本身很簡單卡點(diǎn)幾乎都出在預(yù)檢階段。CLI 會做四類檢查只讀模板文件被改動、可編輯源碼缺失、元數(shù)據(jù)里的 problem_id 與目標(biāo)不一致、路徑越界——任何一條不滿足就中止而不是偷偷忽略。python3 cannjudge_cli.py submit --problem-url 題目鏈接 --project-dir ./add-work/project --dry-run python3 cannjudge_cli.py submit --problem-url 題目鏈接 --project-dir ./add-work/project python3 cannjudge_cli.py query --submission-id ID python3 cannjudge_cli.py rank --problem-id ID--dry-run只顯示文件列表和 SHA-256不發(fā)送源碼默認(rèn)提交后等待 120 秒輪詢可用--max-wait調(diào)整--no-wait則立刻返回 ID 供你回頭分次查詢。傳統(tǒng)工程下CLI 會自動從工程里挑出*_tiling.h、可選tiling_key_*.h、op_host/*.cpp、op_kernel/*.cpp組裝提交內(nèi)容匹配到多個(gè)候選文件時(shí)會停手讓你確認(rèn)避免誤選。平臺側(cè)會把你的源碼放到真實(shí)硬件上編譯、運(yùn)行并逐測試點(diǎn)評判。所以本地 CPU 靜態(tài)檢查通過不等于 NPU 通過只有平臺返回Pass且所有測試點(diǎn)通過才算完成。接入方式怎么選題目默認(rèn)值怎么讀 ??兩個(gè)最容易分叉的決策放一起講用哪種方式接入以及怎么讀題。接入方式對比方式適合誰優(yōu)勢注意點(diǎn)CLI日常手工提交一條命令一個(gè)動作會話自動復(fù)用密碼終端隱藏輸入別寫進(jìn)腳本和命令歷史RSA 密文登錄遠(yuǎn)程/Agent 無法開交互終端密文可反復(fù)用私鑰不出機(jī)器多一步pycryptodome依賴密鑰丟了舊密文即失效Python SDK批量腳本或自動化流程細(xì)粒度控制每一步返回值憑據(jù)走運(yùn)行時(shí)變量不打印完整登錄響應(yīng)SDK 最小鏈路長這樣依賴與 CLI 相同from cannjudge_cli import CANNJudgeClient client CANNJudgeClient() if not client.load_session(): client.login(account, password) client.save_session() problem client.resolve_problem(題目鏈接或ID) folder client.download_package(problem[_id], ./add-work, include_metadataTrue) # 在 folder 內(nèi)完成可編輯源碼后 payload client.prepare_submission(problem[_id], folder) sid client.submit_payload(payload) print(client.wait_for_result(sid))默認(rèn)值與邊界錯(cuò)誤做法 vs 正確做法讀題時(shí)參考算子的行為定義必須查官方文檔并動手驗(yàn)證憑直覺是 Wrong Answer 的最大來源。對照表如下決策點(diǎn)錯(cuò)誤做法正確做法默認(rèn)參數(shù)語義按字面值實(shí)現(xiàn)比如把min0, max0當(dāng)成范圍 [0,0]查文檔并本地跑一遍參考算子它可能表示自動計(jì)算數(shù)據(jù)范圍維度處理直接GetDim(0..3)按 4D 寫死用GetDimNum()動態(tài)讀秩循環(huán)求 totalLength數(shù)據(jù)類型只實(shí)現(xiàn) float32 一條路徑用模板參數(shù)覆蓋題目要求的全部 dtype尾部對齊整塊 DataCopy尾部數(shù)據(jù)越界32 字節(jié)對齊拷貝加尾部回補(bǔ)邊界輸入空張量、單元素直接跳過顯式覆蓋并定義行為后再提交屬性同理axis-1是最后一維keepdims決定輸出秩這些都要進(jìn)你的實(shí)現(xiàn)分支而不是只在樣例里碰巧對。狀態(tài)碼怎么看Wrong Answer 往哪查 狀態(tài)對照表狀態(tài)含義你的動作Pass/Accepted全部測試點(diǎn)通過記錄 submissionId去rank看名次Running評測執(zhí)行中不是終態(tài)稍后重查或用--no-wait分次查詢Wrong Answer部分用例數(shù)值不對按下面順序排查Compile Error源碼沒編過先修編譯別急著猜數(shù)值Runtime Error運(yùn)行期異常查越界訪問、空指針、stream 使用超時(shí)未在時(shí)限內(nèi)完成查極端 shape 下的死循環(huán)或切分粒度過細(xì)Wrong Answer 的排查順序先讀平臺msg和每個(gè)測試點(diǎn)的testcase_status把失敗用例分成幾類別籠統(tǒng)歸因精度問題??磒recision_ratio接近 1.0 卻沒達(dá)標(biāo)十有八九是 float16 邊界量化——參考算子在 half 上的取整行為和你不一致。按 dtype → 維度 → 屬性 → 邊界的順序二分定位每輪只動一個(gè)變量。平臺precision_ratio原樣引用即可不要把新字段硬套舊語義時(shí)間單位以頁面評測說明為準(zhǔn)。正確性之后的性能方向多核切分把數(shù)據(jù)按availableCoreNum合理切到多核切分策略寫進(jìn) TilingKey。減少 global memory 往返能放 local 的不反復(fù)讀 global合并碎拷貝。向量化搬運(yùn)按 32 字節(jié)對齊組織數(shù)據(jù)向量指令吃滿帶寬。計(jì)算與搬運(yùn)重疊double buffer 讓 DataCopy 和計(jì)算流水線化。原則不變正確性不達(dá)標(biāo)時(shí)一切性能動作讓路。提交前自查清單- [ ] 算子原型、接口簽名與當(dāng)次模板一致不同題目不同不復(fù)用舊題簽名 - [ ] dtype、shape 范圍嚴(yán)格等于題目規(guī)定沒有私自擴(kuò)展 - [ ] 參考算子的默認(rèn)值已查文檔并用 Python 對照驗(yàn)證 - [ ] 維度動態(tài)讀取無 2D/4D 硬編碼 - [ ] 尾部對齊有顯式處理非對齊輸入不越界 - [ ] 空輸入、單元素、極值輸入的行為已定義 - [ ] 只讀模板文件未被改動無多余 main 或憑據(jù)文件混入 - [ ] submit --dry-run 預(yù)檢通過文件列表與預(yù)期一致 - [ ] 下載包內(nèi)公開數(shù)據(jù)本地驗(yàn)證通過 - [ ] submissionId 已記錄失敗可斷點(diǎn)續(xù)查精選 FAQQ1為什么info、download、--dry-run有時(shí)不用登錄這些命令走的是公開資源接口服務(wù)端只按資源本身鑒權(quán)涉及私有數(shù)據(jù)時(shí)才需要有效會話。Q2網(wǎng)絡(luò)超時(shí)后我能直接重發(fā)一次提交嗎不能盲目重發(fā)。先查詢該賬號在該題目的既有提交記錄確認(rèn)上一次是否已被受理、拿到 submissionId再決定是否需要重新 POST。Q3平臺為什么不開放測試用例 API目的是逼你寫泛化實(shí)現(xiàn)而不是對樣例過擬合。本地驗(yàn)證就用下載包內(nèi)的公開數(shù)據(jù)公開測試點(diǎn)全過也不代表所有規(guī)格邊界都實(shí)測到交付時(shí)把這一點(diǎn)寫清楚。Q4RSA 密鑰丟了密文還能用嗎不能。generate_key.py重新生成后舊密文用新私鑰解不開只能重新加密如果當(dāng)時(shí)還保留終端隱藏輸入這條通道也可以直接改走它。下一步動作登錄 CLI挑一道基礎(chǔ)算子題如 Add走通下載 → 預(yù)檢 → 提交閉環(huán)把 submissionId 記下來。建一張題目速查表簽名、dtype、CANN 版本、精度要求逐題登記——同一平臺不同題的規(guī)格差異是混用代碼的主要事故源。養(yǎng)成--dry-run先行的習(xí)慣拿到失敗結(jié)果后按msg 分類 → 單變量修復(fù) → 全量回歸的節(jié)奏迭代不要一次改多處。用rank --problem-id對照當(dāng)前榜單定位自己的耗時(shí)差距再決定下一輪優(yōu)化投在多核切分還是內(nèi)存流水上。【免費(fèi)下載鏈接】cann-learning-hubCANN 學(xué)習(xí)中心倉支持在線互動運(yùn)行、邊學(xué)邊練提供教程、示例與優(yōu)化方案一站式助力昇騰開發(fā)者快速上手。項(xiàng)目地址: https://gitcode.com/cann/cann-learning-hub創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考