戰(zhàn):從環(huán)境配置到性能調(diào)優(yōu))
最近在群里被問得最多的問題就是atlas 300V 24G到底算不算一塊運(yùn)算加速卡緊接著第二句就是“那atlas上能不能部署YOLO”。這兩個(gè)問題其實(shí)指向同一件事很多人看到華為昇騰生態(tài)里的atlas這個(gè)字眼第一反應(yīng)是陌生第二反應(yīng)是不知道拿它能干嘛。作為一個(gè)把a(bǔ)tlas 300V當(dāng)主力推理卡跑了幾個(gè)項(xiàng)目的工程師我可以直接說它是貨真價(jià)實(shí)的AI推理加速卡而且用它部署YOLO是條非常成熟、性能也很能打的路線。這篇文章不打算寫成官方文檔的復(fù)讀機(jī)而是想把a(bǔ)tlas部署YOLO這條鏈路掰開揉碎講清楚300V 24G卡片本身是怎么回事模型怎么從PyTorch遷到昇騰上推理代碼怎么寫部署過程中什么樣的坑是高頻的以及我自己踩過坑之后總結(jié)出來的排查思路和調(diào)優(yōu)方法。無論你手里是300V、300I Pro還是其他昇騰型號(hào)這套方法的基本路徑是通用的只是算力、顯存和推理吞吐上限有差別。1. 先把問題說透Atlas 300V 24G究竟是什么加速卡1.1 一張板卡的正身推理卡、訓(xùn)練卡和通用計(jì)算卡的區(qū)別很多人看到“加速卡”三個(gè)字第一反應(yīng)是“是不是顯卡”。這么說不太準(zhǔn)確。Atlas 300V 24G是昇騰系列里的推理加速卡專門用于深度學(xué)習(xí)模型跑推理任務(wù)也就是模型訓(xùn)練完之后把一套已經(jīng)收斂的權(quán)重固定下來對(duì)實(shí)時(shí)或離線數(shù)據(jù)進(jìn)行推理預(yù)測(cè)。訓(xùn)練卡和推理卡有個(gè)最直觀的差別訓(xùn)練需要大規(guī)模并行計(jì)算和反向傳播對(duì)算力、顯存帶寬、多卡通信都有很高的要求推理卡的主要任務(wù)則是盡可能快、盡可能省電地執(zhí)行前向計(jì)算把輸入數(shù)據(jù)變成輸出結(jié)果。拿YOLO來說訓(xùn)練一個(gè)YOLOv5s模型用消費(fèi)級(jí)游戲卡甚至都能跑但要在一臺(tái)服務(wù)器里塞進(jìn)8路甚至16路視頻流每路都跑實(shí)時(shí)目標(biāo)檢測(cè)這時(shí)候推理卡的價(jià)值就體現(xiàn)出來了。Soatlas 300V 24G是運(yùn)算加速卡嗎答案是肯定的但準(zhǔn)確地說它是AI推理加速卡。它不能像顯卡那樣承擔(dān)顯示輸出也不是拿來挖礦或者做通用科學(xué)計(jì)算的CUDA環(huán)境它的定位就是給深度學(xué)習(xí)推理服務(wù)加速。對(duì)于這個(gè)問題我在實(shí)際項(xiàng)目中直接回答對(duì)方你可以把它理解成一塊專門跑YOLO這類模型推理任務(wù)的加速卡別拿它當(dāng)普通GPU用。1.2 24G到底是誰的容量atlas 300V 24G這個(gè)命名里的24G指的是板載內(nèi)存容量單位是GB。具體規(guī)格上Atlas 300V采用特定容量的LPDDR4X內(nèi)存帶寬和延遲設(shè)計(jì)目標(biāo)就是服務(wù)推理場(chǎng)景下的數(shù)據(jù)搬運(yùn)需求。24G這個(gè)數(shù)字在現(xiàn)在的推理卡里屬于中上水平跑YOLOv5s、YOLOv8s這類模型單路模型通常只有幾十MB到幾百M(fèi)B24G意味著可以同時(shí)駐留多個(gè)模型實(shí)例或者用較大的batchsize去換取更高的吞吐。很多人在挑選AI硬件時(shí)仍然拿著訓(xùn)練那套思路去算顯存我的模型權(quán)重1GB那24G是不是只能跑24個(gè)實(shí)例實(shí)際情況不是這個(gè)算法。推理時(shí)占用內(nèi)存的大頭除了模型權(quán)重外還有中間特征圖、AIPP預(yù)處理輸出、推理結(jié)果后處理緩沖區(qū)以及多batch的輸入輸出隊(duì)列。以YOLOv8s為例單路640x640輸入、batch1的情況下模型加運(yùn)行時(shí)的工作內(nèi)存占用大概在幾百M(fèi)B級(jí)別而24G的容量足夠支撐幾十路并發(fā)或者多個(gè)模型同時(shí)加載。我自己實(shí)測(cè)過在300V 24G上加載一個(gè)YOLOv8s模型做16路視頻流推理內(nèi)存壓力遠(yuǎn)沒有到瓶頸。1.3 Atlas干活的核心AI Core與全棧軟件Atlas 300V內(nèi)部的算力來源是昇騰AI處理器里的AI Core這些計(jì)算單元專門針對(duì)神經(jīng)網(wǎng)絡(luò)里的卷積、矩陣乘、激活函數(shù)這類算子做了硬件優(yōu)化。和GPU的通用流處理器不一樣AI Core在算子執(zhí)行路徑上更專用所以在跑標(biāo)準(zhǔn)CNN模型時(shí)能耗比通常更好。但硬件只是其中一半另一半是軟件棧。atlas部署YOLO真正難倒不少人的地方是昇騰的計(jì)算生態(tài)不像CUDA那樣“訓(xùn)練推理一把抓”它的核心軟件棧是CANN華為AI計(jì)算框架模型要進(jìn)入昇騰設(shè)備執(zhí)行要么通過MindSpore直接訓(xùn)練導(dǎo)出要么把PyTorch模型導(dǎo)出成ONNX再用ATC工具轉(zhuǎn)成昇騰的OM格式。OM格式是昇騰推理的特有模型文件里面包含了算子調(diào)度、內(nèi)存分配策略和硬件適配信息相當(dāng)于為具體硬件“編譯”過一次的AI模型。這套軟件棧對(duì)工程師的抽象思維能力要求不算高只要你理解了“PyTorch訓(xùn)練 - 導(dǎo)出標(biāo)準(zhǔn)化格式 - 轉(zhuǎn)換后部署”的流水線整個(gè)上手過程其實(shí)和TensorRT那套思路很像只是具體命令和生態(tài)工具不同。我在最開始接觸的時(shí)候也把它當(dāng)成“昇騰版的TensorRT”來看待這樣理解起來會(huì)順暢不少。1.4 什么人適合拿Atlas跑YOLO如果你正要為一個(gè)目標(biāo)檢測(cè)項(xiàng)目選型推理硬件atlas 300V這類昇騰卡有一個(gè)非常明顯的優(yōu)勢(shì)國產(chǎn)化、供應(yīng)鏈可控同時(shí)在X86或ARM服務(wù)器上都能插卡運(yùn)行。對(duì)于一些不允許使用國外芯片或需要在特定合規(guī)環(huán)境下交付的項(xiàng)目Atlas基本是繞不開的選擇。如果你的場(chǎng)景是幾十路視頻流實(shí)時(shí)分析、邊緣盒子離線識(shí)別、工業(yè)質(zhì)檢部署Atlas 300V的產(chǎn)品規(guī)格對(duì)這種中高并發(fā)推理場(chǎng)景非常合適——單卡功耗通常低于同算力的GPU性能釋放也足夠穩(wěn)定。反過來如果你要做的是一次性大批量離線推理或者你需要頻繁改模型結(jié)構(gòu)、做訓(xùn)練那昇騰推理卡并不適合老老實(shí)實(shí)去用訓(xùn)練卡會(huì)更順手。2. 部署前準(zhǔn)備軟硬件棧的一次性搭好2.1 硬件勘察驅(qū)動(dòng)、固件、CANN版本三個(gè)坑我在第一次部署atlas時(shí)踩過一個(gè)大坑拿到服務(wù)器板卡插上去以為裝上驅(qū)動(dòng)就能用了結(jié)果跑樣例程序時(shí)直接報(bào)驅(qū)動(dòng)與固件版本不匹配。這和CUDA環(huán)境里驅(qū)動(dòng)版本與CUDA Toolkit版本不匹配是同一個(gè)道理但昇騰這邊的版本強(qiáng)綁定關(guān)系更嚴(yán)格。在開始動(dòng)手前你至少要確認(rèn)三件事板卡型號(hào)和固件版本。可以用npu-smi info命令查看當(dāng)前卡狀態(tài)和固件版本。服務(wù)器CPU架構(gòu)是X86還是ARM。CANN和驅(qū)動(dòng)的安裝包分平臺(tái)下載錯(cuò)了根本裝不上。你準(zhǔn)備使用的推理框架版本。CANN版本和配套的MindSpore、PyTorch適配層版本之間一般有對(duì)應(yīng)關(guān)系表需要在上手前查清楚。這里我強(qiáng)烈建議不要憑感覺裝最新版而是到昇騰社區(qū)的版本配套文檔里找到一套穩(wěn)定組合。生產(chǎn)環(huán)境不是追新的時(shí)候穩(wěn)定組合能少掉90%的版本兼容性報(bào)錯(cuò)。2.2 安裝驅(qū)動(dòng)和固件的正確順序昇騰設(shè)備的安裝順序是有講究的先安裝固件再安裝驅(qū)動(dòng)最后安裝CANN工具包。如果順序顛倒或者跳步設(shè)備可能無法正常識(shí)別。每一步安裝完成之后最好重啟或者至少重新加載相關(guān)內(nèi)核模塊。我用腳本部署時(shí)基本流程是這樣# 1. 安裝固件 ./Ascend-hdk-*-npu_firmware.run --full --install # 2. 安裝驅(qū)動(dòng) ./Ascend-hdk-*-npu-driver.run --full --install # 3. 安裝CANN工具包 ./Ascend-cann-toolkit_*-linux-*.run --install # 4. 配置環(huán)境變量 source /usr/local/Ascend/ascend-toolkit/set_env.sh裝完后用npu-smi info檢查一下板卡狀態(tài)正常情況下能看到芯片溫度、內(nèi)存使用率和AI Core狀態(tài)。這一步看不到卡后面一切免談。2.3 Docker模式還是裸機(jī)模式在實(shí)際部署中我大部分時(shí)間推薦Docker方式。原因很簡(jiǎn)單CANN和驅(qū)動(dòng)對(duì)系統(tǒng)環(huán)境有較多依賴Docker鏡像可以由官方維護(hù)或者我自己在基礎(chǔ)鏡像上封一層換服務(wù)器時(shí)遷移成本低很多。不過昇騰的Docker模式有一個(gè)特殊處理需要把NPU設(shè)備映射到容器里還要掛載CANN的運(yùn)行庫。常用的做法是使用Ascend Docker Runtime通過加--device參數(shù)或配置Ascend Docker Runtime來實(shí)現(xiàn)設(shè)備透?jìng)?。第一次使用時(shí)不熟悉會(huì)比較折騰但一旦把鏡像和啟動(dòng)腳本沉淀下來后續(xù)部署效率能提升一個(gè)量級(jí)。裸機(jī)安裝的好處是省掉容器層性能損耗理論上更小排查問題也直觀一些。但如果你的生產(chǎn)環(huán)境經(jīng)常要換卡、換驅(qū)動(dòng)版本或者需要同機(jī)混布多套推理服務(wù)Docker隔離的價(jià)值會(huì)更明顯。2.4 需要準(zhǔn)備的基礎(chǔ)工具部署過程中有一些工具和命令是高頻使用的提前備好能省很多事npu-smi查看卡狀態(tài)、顯存占用、功耗和溫度的第一入口。msameMindX SDK里提供的模型推理工具主要用于驗(yàn)證OM模型能否正確跑通。atc模型轉(zhuǎn)換工具把ONNX或MindSpore模型轉(zhuǎn)成OM。set_env.sh設(shè)置CANN相關(guān)環(huán)境變量安裝完記得source否則命令行找不到工具。我建議所有初次使用的朋友先跑一遍官方提供的樣例程序比如用msame加載一個(gè)已經(jīng)轉(zhuǎn)好的OM模型做一次推理確認(rèn)整條鏈路通了之后再開始遷移自己的YOLO模型。跳過這個(gè)驗(yàn)證步驟后續(xù)排查會(huì)非常痛苦。3. YOLO模型遷移從PyTorch到OM的全流程實(shí)操3.1 為什么不能直接把模型丟給Atlas在動(dòng)手轉(zhuǎn)模型之前先理清一個(gè)根本問題昇騰設(shè)備不直接跑PyTorch的權(quán)重文件。PyTorch是訓(xùn)練框架它把模型描述成Python對(duì)象和計(jì)算圖在訓(xùn)練過程中依賴GPU的CUDA核函數(shù)。而昇騰推理卡要高效執(zhí)行需要把模型轉(zhuǎn)換成OM格式由CANN的運(yùn)行時(shí)統(tǒng)一調(diào)度AI Core執(zhí)行推理計(jì)算。這個(gè)轉(zhuǎn)換過程在昇騰生態(tài)里叫做“模型遷移”核心工具是ATC。實(shí)際執(zhí)行時(shí)ATC會(huì)讀入ONNX模型文件逐個(gè)算子匹配CANN算子庫如果算子支持就生成對(duì)應(yīng)的OM算子指令如果某個(gè)算子不支持轉(zhuǎn)換會(huì)直接報(bào)錯(cuò)。所以O(shè)NNX模型的算子兼容性是整個(gè)遷移過程中風(fēng)險(xiǎn)最高的環(huán)節(jié)。3.2 準(zhǔn)備ONNX算子兼容與輸入尺寸從PyTorch導(dǎo)出ONNX時(shí)有兩個(gè)細(xì)節(jié)會(huì)直接影響后續(xù)ATC轉(zhuǎn)換是否順利。第一個(gè)是算子的兼容性。YOLO模型里常見的Conv、BatchNorm、ReLU、Concat、Resize、Sigmoid在CANN里都有對(duì)應(yīng)的算子實(shí)現(xiàn)。但如果你用了非常新的PyTorch算子或者自定義了某些TFOp、GridSample這類特殊操作ATC很可能直接報(bào)“不支持的算子”。遇到這種情況一個(gè)繞路辦法是在模型結(jié)構(gòu)層面用等價(jià)算子替換比如把某些自定義上采樣操作改寫為標(biāo)準(zhǔn)Resize另一個(gè)更省事的方法是選用官方或社區(qū)里已經(jīng)驗(yàn)證過的YOLO導(dǎo)出腳本不要自己從零寫導(dǎo)出邏輯。第二個(gè)是輸入尺寸的固定。ONNX導(dǎo)出時(shí)通常需要指定輸入張量的shape。以YOLOv5為例如果導(dǎo)出時(shí)設(shè)置的是動(dòng)態(tài)尺寸ATC轉(zhuǎn)換時(shí)就要額外處理動(dòng)態(tài)shape復(fù)雜度會(huì)上升。對(duì)于大多數(shù)固定輸入分辨率的落地場(chǎng)景我建議導(dǎo)出時(shí)直接固定輸入尺寸比如640x640轉(zhuǎn)換過程簡(jiǎn)單很多推理時(shí)也盡量保持輸入尺寸一致。這里給一個(gè)YOLOv5導(dǎo)出ONNX的參考命令python export.py --weights yolov5s.pt --include onnx --img-size 640 640 --batch-size 1 --dynamic False在導(dǎo)出后用Netron打開ONNX文件檢查一遍結(jié)構(gòu)重點(diǎn)看輸出節(jié)點(diǎn)是否符合預(yù)期比如YOLOv5的輸出通常有3個(gè)不同尺度的特征圖層這樣在ATC轉(zhuǎn)換時(shí)可以準(zhǔn)確指定輸出節(jié)點(diǎn)。3.3 ATC轉(zhuǎn)換與OM生成ATC工具的使用方法本身并不復(fù)雜核心是把ONNX轉(zhuǎn)成OM的命令寫對(duì)。我自己常用的轉(zhuǎn)換命令大致長(zhǎng)這樣atc --modelyolov5s.onnx \ --framework5 \ --outputyolov5s_bs1 \ --input_shapeimages:1,3,640,640 \ --soc_versionAscend310P3 \ --insert_op_confaipp.cfg \ --output_typeFP32這里的--input_shape要和你導(dǎo)出ONNX時(shí)的輸入名、維度保持一致--soc_version要按你實(shí)際板卡的芯片型號(hào)填寫--insert_op_conf是用來配置AIPP預(yù)處理的后面我會(huì)再展開。轉(zhuǎn)換完成后會(huì)生成一個(gè)yolov5s_bs1.om文件這個(gè)文件就是最終部署要用的模型文件。在實(shí)際項(xiàng)目里我經(jīng)常會(huì)在不同batchsize下各轉(zhuǎn)一個(gè)OM比如bs1和bs4原因是推理時(shí)的最優(yōu)batchsize和業(yè)務(wù)請(qǐng)求模式強(qiáng)相關(guān)提前多準(zhǔn)備幾個(gè)檔位部署時(shí)切換成本更低。3.4 模型驗(yàn)證與精度默認(rèn)配置轉(zhuǎn)換后的OM模型不能直接默認(rèn)它能用。和我一開始踩坑時(shí)的經(jīng)歷一樣很多人以為轉(zhuǎn)完就萬事大吉結(jié)果推理出來的全是亂框。這里有個(gè)常見原因AIPP預(yù)處理和后處理之間的數(shù)據(jù)格式約定不一致。YOLO模型的原生輸入通常是歸一化到0到1的浮點(diǎn)數(shù)而圖片在讀取時(shí)往往是以0到255整數(shù)存儲(chǔ)。如果在推理前不經(jīng)過AIPP配置或手動(dòng)對(duì)輸入數(shù)據(jù)做歸一化模型輸出就會(huì)亂掉。最簡(jiǎn)單的驗(yàn)證方式是拿一張已知檢測(cè)結(jié)果的圖片先用PyTorch跑出基準(zhǔn)輸出再把同一張圖通過OM模型跑一遍對(duì)比兩者輸出框坐標(biāo)、類別和置信度的差異。差異在誤差范圍內(nèi)就可以放心往下走。4. 推理部署落地準(zhǔn)備數(shù)據(jù)、加載模型、讀取結(jié)果4.1 圖像預(yù)處理與數(shù)據(jù)搬運(yùn)模型跑起來之前圖像預(yù)處理占了很大一部分工作量。YOLO要求的預(yù)處理通常包括解碼、縮放、填充、歸一化、通道轉(zhuǎn)換。在CPU上用OpenCV/Pillow做也可以但CPU處理會(huì)吃掉不少CPU核的競(jìng)爭(zhēng)力在昇騰卡上更推薦把預(yù)處理前移到AIPP來做。AIPP是昇騰硬件圖像預(yù)處理單元它可以在數(shù)據(jù)進(jìn)入AI Core之前自動(dòng)完成縮放、減均值、除以標(biāo)準(zhǔn)差、RGB-BGR等操作。這意味著你只需要把原圖原始數(shù)據(jù)拷貝到設(shè)備端AIPP會(huì)按你配置好的規(guī)則完成歸一化省掉了在主機(jī)側(cè)逐幀處理的開銷。配置AIPP時(shí)需要?jiǎng)?chuàng)建一個(gè)配置文件大致內(nèi)容如下{ aipp_op: { input_format: RGB888_U8, src_image_size_w: 640, src_image_size_h: 640, crop: false, padding: false, mean: [0, 0, 0], min: [0, 0, 0], var: [1, 1, 1] } }這個(gè)配置相對(duì)簡(jiǎn)單如果你的實(shí)際輸入是視頻流PNG或JPEG記得先解碼成RGB888再傳給AIPP。關(guān)于src_image_size_w/hAIPP里填的應(yīng)該是預(yù)處理后的目標(biāo)尺寸也就是模型輸入尺寸。4.2 推理代碼怎么寫Python最小示例寫推理代碼有兩種主流方式。第一種是通過ACLAscend Computing Language直接寫Python代碼自由度比較高適合定制化業(yè)務(wù)邏輯。一個(gè)最小推理流程大致是初始化ACL、加載OM模型、申請(qǐng)輸入輸出內(nèi)存、把數(shù)據(jù)拷貝到設(shè)備、執(zhí)行推理、拷貝回結(jié)果、后處理。下面是一個(gè)簡(jiǎn)化版的Python偽代碼示例import acl # 初始化 ret acl.init() ret acl.rt.set_device(0) # 加載模型 model_path yolov5s_bs1.om model_id, ret acl.mdl.load_from_file(model_path) # 準(zhǔn)備輸入輸出 input_data preprocess(image, size(640, 640)) # 已經(jīng)是NCHW格式 _, input_size acl.mdl.get_input_size_by_index(model_id, 0) input_ptr acl.util.np_to_ptr(input_data, input_size) # 執(zhí)行推理 output_data, output_size acl.mdl.execute(model_id, [input_ptr], [input_size]) # 轉(zhuǎn)回numpy并做后處理 output_np acl.util.ptr_to_np(output_data, output_size, (1, 25200, 85)) boxes postprocess(output_np, conf_thres0.5, iou_thres0.45)第二種是使用MindX SDK它把推理封裝成了pipeline概念通過修改配置文件就能構(gòu)建一條“視頻解碼 - 圖像裁剪 - 模型推理 - 后處理”的完整鏈路。MindX SDK對(duì)二次開發(fā)封裝得更狠很多場(chǎng)景只需要寫好業(yè)務(wù)插件但這種靈活性是以犧牲部分底層控制能力為代價(jià)的。如果是快速原型驗(yàn)證我推薦用MindX SDK試試先跑通流程再說。4.3 多路視頻流和批處理的考量到了真實(shí)項(xiàng)目里很少會(huì)有人單路單幀地推理。常見場(chǎng)景是十幾路甚至幾十路視頻流每路每秒需要處理十幾幀。這種情況下batch處理是提升吞吐的關(guān)鍵。比如我手頭有一個(gè)10路視頻流的項(xiàng)目最初的做法是每幀單獨(dú)調(diào)用一次推理接口AI Core利用率很低幀率跑不滿。后改成把多路視頻幀拼成batch4的輸入一次推理同時(shí)處理4幀吞吐直接提升了近3倍。300V 24G本身就給了你充足的內(nèi)存空間多路輸入的張量拷貝、AIPP處理和模型駐留都不需要額外心疼空間。多路流處理時(shí)還有一個(gè)細(xì)節(jié)值得注意不同視頻流的幀率并不能保證完全一致因此在湊batch時(shí)需要一個(gè)緩沖隊(duì)列。收到的幀先掛在隊(duì)列里攢到batchsize數(shù)量再統(tǒng)一推理。如果某一時(shí)刻幀數(shù)不足可以在interpolation模式下單獨(dú)處理剩下的幀或者等待一定超時(shí)時(shí)間。4.4 部署架構(gòu)上的選擇邊緣盒子還是服務(wù)器PCIe插卡Atlas的產(chǎn)品線里“atlas”還指代邊緣計(jì)算盒子比如Atlas 200/500系列帶外殼的整機(jī)產(chǎn)品。而Atlas 300V 24G這類是插卡形態(tài)安裝在服務(wù)器里使用。邊緣盒子適合部署在攝像頭附近的機(jī)房比如工廠車間、路口、園區(qū)出入口一體化的形態(tài)對(duì)現(xiàn)場(chǎng)運(yùn)維更友好。而PCIe插卡的優(yōu)勢(shì)在于算力可以靈活組合一臺(tái)服務(wù)器可以插多張Atlas 300V組成多卡的推理集群管理上更集中。選型時(shí)如果你有統(tǒng)一機(jī)房選插卡如果需求分散在多個(gè)點(diǎn)位選邊緣盒子。兩個(gè)形態(tài)在模型轉(zhuǎn)換和推理代碼層面基本一致區(qū)別主要在載體和運(yùn)維方式。5. 踩坑記錄與排查思路問題清單和解決方向5.1 驅(qū)動(dòng)報(bào)錯(cuò)剛上手時(shí)最容易碰到的是驅(qū)動(dòng)報(bào)錯(cuò)典型場(chǎng)景是驅(qū)動(dòng)明明裝好了但npu-smi info看不到設(shè)備。這個(gè)問題在ARM服務(wù)器上尤其常見原因可能是內(nèi)核模塊沒有正確加載。我當(dāng)時(shí)的排查順序是先lsmod看看有沒有驅(qū)動(dòng)模塊再dmesg檢索npu或驅(qū)動(dòng)相關(guān)關(guān)鍵字如果看到權(quán)限錯(cuò)誤大概率是缺少root權(quán)限或驅(qū)動(dòng)安裝時(shí)依賴沒裝全。另外有些服務(wù)器的BIOS開啟了某種設(shè)備虛擬化特性PCIe設(shè)備透?jìng)鞅桓蓴_也會(huì)導(dǎo)致看不到卡這時(shí)需要進(jìn)BIOS確認(rèn)PCIe相關(guān)的配置。5.2 ATC轉(zhuǎn)換報(bào)錯(cuò)ATC轉(zhuǎn)換報(bào)錯(cuò)是模型遷移階段的高頻問題通常有三類第一類是算子不支持錯(cuò)誤信息里會(huì)明確列出不支持的算子類型比如Unsupported op XXX。應(yīng)對(duì)辦法是替換成等效支持的結(jié)構(gòu)或者查看算子清單確認(rèn)哪些版本支持。第二類是shape不匹配通常發(fā)生在輸入或輸出維度定義和實(shí)際不一致時(shí)。解決辦法是嚴(yán)格核對(duì)ONNX導(dǎo)出的shape和ATC命令中--input_shape的內(nèi)容。第三類是動(dòng)態(tài)shape相關(guān)報(bào)錯(cuò)。如果你需要?jiǎng)討B(tài)batch或動(dòng)態(tài)分辨率ATC的配置會(huì)復(fù)雜很多有時(shí)需要用到動(dòng)態(tài)shape的分檔功能。如果業(yè)務(wù)上不是非常必要固定shape能省掉這一層所有麻煩。5.3 推理階段報(bào)錯(cuò)推理階段最常見的錯(cuò)誤是設(shè)備內(nèi)存不足。這時(shí)首先看是不是模型的batchsize設(shè)得過大或者多個(gè)模型同時(shí)駐留導(dǎo)致內(nèi)存占用超過了24G。用npu-smi info看看實(shí)時(shí)顯存占用如果確實(shí)爆了減少并發(fā)數(shù)或改用更小的模型版本。還有一種情況是推理結(jié)果全為空或全為亂碼。這個(gè)時(shí)候別懷疑硬件先回到模型本身檢查AIPP配置和預(yù)處理是否有誤。我最常犯的錯(cuò)誤是輸入通道順序搞反把RGB送進(jìn)了BGR模型導(dǎo)致所有結(jié)果錯(cuò)亂。寫個(gè)一次性自檢腳本拿基準(zhǔn)圖對(duì)比輸出一切問題都會(huì)浮出水面。5.4 性能不達(dá)預(yù)期的排查部署完成后如果發(fā)現(xiàn)推理速度不達(dá)預(yù)期不要急著換硬件。先檢查幾個(gè)關(guān)鍵點(diǎn)是否開了多線程異步推理。ACL接口支持異步推理可以在一個(gè)線程里同時(shí)處理多batch的提交和回收吞吐能明顯提升。是否做了數(shù)據(jù)拷貝的優(yōu)化。盡量用DMA方式把數(shù)據(jù)拷貝放到硬件隊(duì)列里避免CPU一邊Copy一邊推理帶來的串行等待。模型是否需要量化。OM模型支持FP16甚至INT8量化推理速度相比FP32能大幅度提升。精度允許的前提下量化掉的收益非常可觀。是否用了最優(yōu)的batchsize。不同batchsize下AI Core利用率變化很大建議分別在bs1、bs2、bs4、bs8下實(shí)測(cè)日志延遲和吞吐找到拐點(diǎn)。我自己的經(jīng)驗(yàn)是很多時(shí)候性能不夠高并不是硬件不夠強(qiáng)而是軟件層面的流水線沒有打滿調(diào)整策略空間通常比想象中大。6. 性能調(diào)優(yōu)與后續(xù)擴(kuò)展大顯存、多路并發(fā)和落地實(shí)踐6.1 24G大顯存怎么用起來atlas 300V 24G的大顯存在推理項(xiàng)目里有幾種高效用法。第一種是同時(shí)駐留多個(gè)模型。比如一個(gè)業(yè)務(wù)里既需要YOLOv5s做目標(biāo)檢測(cè)又需要YOLOv8n做分類可以把兩個(gè)模型都加載到同一張卡上根據(jù)請(qǐng)求類型分發(fā)到不同模型避免了重復(fù)初始化模型的開銷。第二種是擴(kuò)大batchsize把吞吐往上推。第三種是同時(shí)跑多個(gè)服務(wù)實(shí)例比如同一個(gè)模型加載兩個(gè)實(shí)例分別服務(wù)于兩個(gè)租戶實(shí)現(xiàn)資源隔離。我實(shí)際測(cè)過一個(gè)項(xiàng)目在300V 24G上同時(shí)駐留3個(gè)YOLOv8s模型每個(gè)都吃幾百M(fèi)B內(nèi)存每路模型跑8路視頻流整體效果非常穩(wěn)。這也是24G相比小顯存推理卡最大的價(jià)值——業(yè)務(wù)承載空間更大不需要為每個(gè)服務(wù)單獨(dú)備卡。6.2 算子融合與動(dòng)態(tài)維度CANN在把ONNX轉(zhuǎn)換到OM時(shí)會(huì)自己完成一部分算子融合和內(nèi)存重排比如把卷積批歸一化激活融合成一個(gè)算子減少AI Core和內(nèi)存之間的交互次數(shù)。對(duì)于部署者來說不需要手動(dòng)指定融合策略但可以通過配置不同op type的打開或關(guān)閉來控制轉(zhuǎn)換行為。如果業(yè)務(wù)需要?jiǎng)討B(tài)分辨率例如輸入圖片尺寸不固定建議使用ATC的動(dòng)態(tài)shape分檔功能。比如將分辨率設(shè)置為[640, 480]和[1280, 720]兩個(gè)檔位推理時(shí)根據(jù)輸入尺寸自動(dòng)選擇檔位避免固定尺寸帶來的縮放失真。6.3 向生產(chǎn)環(huán)境走量化、AIPP和模型上線生產(chǎn)環(huán)境上線模型時(shí)我建議優(yōu)先考慮INT8量化。用CANN的AMCT工具對(duì)OM模型做量化校準(zhǔn)可以把模型權(quán)重從FP32降到INT8存儲(chǔ)和計(jì)算量都大幅降低。量化后的模型在YOLO檢測(cè)任務(wù)上精度損失通常很小但推理延遲能減少30%甚至一半。尤其是Atlas 300V這類推理卡本身就是為低比特推理優(yōu)化的量化能力值得充分利用。上線前還要注意一個(gè)容易忽略的事AIPP配置和推理邏輯最終要和模型一起綁定。如果你在ATC轉(zhuǎn)換時(shí)用了AIPP那么在推理代碼里就不需要再對(duì)圖像做減均值歸一化否則會(huì)重復(fù)處理等于是二次變換誤差和開銷都會(huì)累積。6.4 更多玩法其他YOLO版本和場(chǎng)景atlas部署YOLO不只限于某個(gè)特定版本。YOLOv5、YOLOv7、YOLOv8、YOLOX的ONNX模型都可以通過ATC轉(zhuǎn)成OM在300V上運(yùn)行只是每個(gè)模型的輸出結(jié)構(gòu)和后處理邏輯不同轉(zhuǎn)換參數(shù)和推理代碼需要相應(yīng)調(diào)整。我自己用下來的體會(huì)是從YOLOv5遷移到Y(jié)OLOv8除了改導(dǎo)出命令和輸出解析邏輯外AIPP和推理框架幾乎可以復(fù)用。如果你團(tuán)隊(duì)里已經(jīng)有成熟的PyTorch后處理腳本遷移成本不會(huì)太高。更進(jìn)階一點(diǎn)如果你要檢測(cè)的目標(biāo)是小物體比如衛(wèi)星圖像里的車輛、工業(yè)零件表面的微小缺陷那么光靠YOLO原始640x640輸入可能不夠可以考慮用超大分辨率輸入或者做切割拼接這需要結(jié)合atlas的顯存容量做規(guī)劃24G在這個(gè)場(chǎng)景下就有它的優(yōu)勢(shì)了。最后聊一點(diǎn)我個(gè)人經(jīng)驗(yàn)。昇騰這套工具鏈和CUDA生態(tài)相比確實(shí)沒有那么“一鍵化”剛開始接觸時(shí)容易被版本、算子、轉(zhuǎn)換報(bào)錯(cuò)折騰到懷疑人生。但一旦你把它當(dāng)成一條有序流水線每步都按“硬件勘察、環(huán)境安裝、模型導(dǎo)出、ATC轉(zhuǎn)換、推理驗(yàn)證、調(diào)優(yōu)部署”的節(jié)奏來它完全可以承擔(dān)起生產(chǎn)級(jí)目標(biāo)檢測(cè)任務(wù)的落地。特別是你手里有多路視頻流、需要穩(wěn)定TCO、又必須考慮國產(chǎn)化方案時(shí)Atlas 300V 24G是一塊值得深入研究的卡。探清這張卡的脾氣之后再回頭看“atlas能不能部署YOLO”這個(gè)問題答案會(huì)變得很清晰不僅能還能在24G大顯存的支撐下跑出相當(dāng)從容的業(yè)務(wù)規(guī)模。