換到性能調(diào)優(yōu))
最近后臺(tái)一直有人在問“atlas部署yolo”和“atlas 300v 24g 是運(yùn)算加速卡嗎”這兩個(gè)問題我猜不少人是在選型階段或者是已經(jīng)把卡拿到手了結(jié)果卡在環(huán)境搭建和模型轉(zhuǎn)換上。這類問題我這一年里碰到太多次了干脆把整個(gè)思路、步驟和踩過的坑完整寫出來給準(zhǔn)備入坑昇騰Atlas的兄弟們一份能直接照著做的參考。先說結(jié)論Atlas 300V 24G是一張標(biāo)準(zhǔn)的AI推理加速卡不是訓(xùn)練卡它基于昇騰310P處理器24GB顯存專門用來跑深度學(xué)習(xí)推理任務(wù)。把YOLO這類檢測(cè)模型部署上去核心流程就是“模型轉(zhuǎn)換 推理代碼 業(yè)務(wù)接入”沒有想象中復(fù)雜但細(xì)節(jié)確實(shí)多尤其是第一次接觸CANN和OM格式的時(shí)候容易一頭霧水。這篇文章不整虛的從硬件定位、部署方案設(shè)計(jì)、模型轉(zhuǎn)換到最終調(diào)優(yōu)全部按實(shí)操順序?qū)懨總€(gè)參數(shù)都給到可直接使用的程度。1. 先搞清楚Atlas 300V 24G到底是什么1.1 它確實(shí)是運(yùn)算加速卡但“加速”和“訓(xùn)練”是兩碼事很多人看到“運(yùn)算加速卡”這幾個(gè)字下意識(shí)會(huì)拿它跟NVIDIA的A100、RTX 4090去做對(duì)比然后問為什么不能直接跑PyTorch訓(xùn)練。這就是對(duì)產(chǎn)品定位理解偏差了。Atlas 300V 24G屬于昇騰推理卡做的是“已訓(xùn)練好的模型的推理計(jì)算”。什么叫推理計(jì)算就是模型權(quán)重已經(jīng)訓(xùn)練完畢你給它一張圖片或者一段視頻流它在前向傳播里算出目標(biāo)框和類別。這個(gè)過程計(jì)算量比訓(xùn)練小很多但對(duì)時(shí)延、吞吐、功耗的要求更極端。正因?yàn)閷W⑼评磉@類卡的能效比通常比訓(xùn)練卡高不少尤其適合視頻流分析、工業(yè)質(zhì)檢、智慧園區(qū)這些場(chǎng)景。官方標(biāo)稱參數(shù)我在這里給個(gè)參考Atlas 300V 24G基于昇騰310P處理器內(nèi)存24GB典型功耗70到80瓦區(qū)間INT8算力大致在140 TOPS左右。這個(gè)算力水平跑YOLOv5s、YOLOv8s這一檔的模型處理多路視頻流基本沒有壓力。注意如果你需要的是“訓(xùn)練模型”的算力那300V 24G不合適應(yīng)該看Atlas 800訓(xùn)練卡或者昇騰910系列。300V的定位是“跑模型”不是“練模型”。1.2 Atlas系列型號(hào)命名太像了選型前先排雷Atlas產(chǎn)品線密密麻麻200、300I、300V、500、800、900單看數(shù)字很難判斷差異。我挑幾個(gè)常見的說一下免得買錯(cuò)。Atlas 200系列是開發(fā)板形態(tài)適合嵌入式原型驗(yàn)證適合學(xué)生和算法工程師做前期demo。Atlas 300I系列是單槽位半高半長(zhǎng)的推理卡主打低功耗緊湊型服務(wù)器。Atlas 300V系列跟300I最大的區(qū)別是整卡性能更高、顯存更大像300V 24G這種就是雙槽位全高全長(zhǎng)設(shè)計(jì)散熱條件要求更高。Atlas 500系列通常是盒子形態(tài)的智能小站更適合戶外邊緣場(chǎng)景。網(wǎng)上還有一個(gè)常見誤區(qū)Atlas 300V 24G能不能插普通臺(tái)式機(jī)答案是可以但有條件。它走PCIe 3.0 x16接口物理形態(tài)上跟普通顯卡一樣但驅(qū)動(dòng)只支持Ubuntu、CentOS、openEuler等Linux系統(tǒng)Windows直接放棄。另外對(duì)主板BIOS里Above 4G Decoding選項(xiàng)有要求不開啟的話設(shè)備可能識(shí)別不到。我在選型時(shí)給團(tuán)隊(duì)的建議很簡(jiǎn)單先確認(rèn)你的業(yè)務(wù)是訓(xùn)練還是推理推理場(chǎng)景再確認(rèn)算法模型的大小和對(duì)視頻路數(shù)的要求。如果只是單路攝像頭做檢測(cè)300I Duo就夠如果是幾十路視頻并發(fā)直接上300V 24G顯存和算力冗余更充足。2. 為什么值得把YOLO部署到Atlas上部署鏈路怎么搭2.1 先算筆賬性能、功耗和成本到底劃不劃算之前有個(gè)做智慧養(yǎng)殖的客戶原來用一臺(tái)帶RTX 3080的服務(wù)器跑YOLOv5s處理8路1080p視頻流GPU占用率天天拉滿電源功耗動(dòng)不動(dòng)三四百瓦機(jī)房夏天熱得不行。后來?yè)Q了兩張Atlas 300V 24G每張卡功耗不到80瓦8路視頻流分?jǐn)偟絻蓮埧ㄉ蠁慰ㄕ加寐什坏?0%整機(jī)功耗降了一大截。這筆賬怎么算以YOLOv5s、輸入分辨率640x640為例一張Atlas 300V 24G在INT8精度下跑批量大小為1的推理實(shí)測(cè)單幀處理時(shí)間大概在幾毫秒到十幾毫秒之間換算過來每秒能處理幾十幀。這個(gè)幀率看起來沒有高端GPU那么夸張但推理卡強(qiáng)就強(qiáng)在批量處理和并發(fā)路數(shù)。視頻流場(chǎng)景下通常把4到8路視頻流拼成一個(gè)batch輸入卡上計(jì)算單元利用率會(huì)明顯提升整體吞吐遠(yuǎn)遠(yuǎn)高于單路逐幀處理。如果是CPU跑YOLOv5s640x640輸入下純CPU推理單幀可能要去到一兩百毫秒這還不算前后處理。把這筆賬攤開看用300V 24G跑推理性能提升通常在十倍以上而且功耗只有CPU服務(wù)器的零頭。2.2 部署方案的總體架構(gòu)CANN是繞不開的底座昇騰平臺(tái)不像CUDA那樣可以直接用PyTorch或者TensorRT跑模型它有一套自己的軟件棧底層是驅(qū)動(dòng)和固件中間層是CANNCompute Architecture for Neural Networks上層再封裝出各種推理框架。CANN里最核心的兩塊是ATC模型轉(zhuǎn)換工具和AscendCL推理接口。整個(gè)部署鏈路我理出來大概是這個(gè)樣子用PyTorch訓(xùn)練或者從開源倉(cāng)庫(kù)拿到Y(jié)OLO權(quán)重。把模型導(dǎo)出為ONNX通用格式。在服務(wù)器上安裝好昇騰驅(qū)動(dòng)、固件和CANN工具包。用CANN自帶的ATC工具把ONNX轉(zhuǎn)換成昇騰專用的OM格式。編寫AscendCL推理代碼加載OM模型做數(shù)據(jù)預(yù)處理、推理計(jì)算、后處理。把推理結(jié)果封裝成業(yè)務(wù)接口往上拋。很多第一次接觸的朋友最不理解的一點(diǎn)是為什么不能直接加載PyTorch權(quán)重文件原因是昇騰芯片不認(rèn)PyTorch的權(quán)重格式芯片上執(zhí)行的是經(jīng)過融合、量化、圖優(yōu)化的OM模型。OM模型里不光是網(wǎng)絡(luò)結(jié)構(gòu)還包含了算子在芯片上的映射關(guān)系、數(shù)據(jù)排布格式、內(nèi)存分配方案。這種靜態(tài)優(yōu)化好處是推理時(shí)省掉了框架調(diào)度開銷缺點(diǎn)是模型結(jié)構(gòu)一變就得重新轉(zhuǎn)換。整個(gè)架構(gòu)里我建議把力氣花在兩步上一是ONNX導(dǎo)出的質(zhì)量二是ATC轉(zhuǎn)換參數(shù)的設(shè)置。這兩個(gè)環(huán)節(jié)出問題后面推理階段各種奇怪報(bào)錯(cuò)都會(huì)冒出來。3. 實(shí)操把YOLO模型搬到Atlas 300V 24G上3.1 環(huán)境準(zhǔn)備驅(qū)動(dòng)和CANN的安裝順序不能亂先說硬件環(huán)境。我這邊測(cè)試用的服務(wù)器是雙路x86平臺(tái)128GB內(nèi)存系統(tǒng)Ubuntu 20.04內(nèi)核版本5.4。Atlas 300V 24G插在PCIe 3.0 x16槽位上電源至少750W因?yàn)楣俜浇ㄗh整機(jī)供電冗余要留足。安裝之前先去昇騰官網(wǎng)下載三個(gè)東西驅(qū)動(dòng)包、固件包、CANN Toolkit包。版本對(duì)照關(guān)系在官網(wǎng)文檔里都有每一版CANN對(duì)應(yīng)哪個(gè)版本的驅(qū)動(dòng)和固件一定要看仔細(xì)不然裝完算子加載直接報(bào)版本不匹配。推薦的安裝順序# 1. 先裝驅(qū)動(dòng) ./Ascend-hdk-*.run --install # 2. 再裝固件注意固件跟驅(qū)動(dòng)版本必須對(duì)應(yīng) ./Ascend-hdk-*.run --upgrade # 3. 最后裝CANN toolkit ./Ascend-cann-toolkit_*.run --install驅(qū)動(dòng)裝完用下面命令確認(rèn)設(shè)備有沒有正常識(shí)別npu-smi info如果能看到類似下面的輸出說明卡已經(jīng)識(shí)別成功-------------------------------------------------------------------------------------- | NPU Name | Health | Power(W) Temp(C) HugepagesUsage | | 300V | OK | 32.0 45 0 | --------------------------------------------------------------------------------------接下來配置CANN環(huán)境變量source /usr/local/Ascend/ascend-toolkit/set_env.sh這個(gè)環(huán)境變量文件里會(huì)設(shè)置好CANN路徑、頭文件路徑和庫(kù)文件路徑后面編譯運(yùn)行都需要它。建議直接寫到~/.bashrc里避免每次重新source。提示如果是在容器里用還要確認(rèn)設(shè)備節(jié)點(diǎn)映射和權(quán)限。宿主機(jī)上執(zhí)行l(wèi)s /dev/davinci*容器啟動(dòng)時(shí)要把這些設(shè)備節(jié)點(diǎn)掛載進(jìn)去否則aclrtSetDevice會(huì)報(bào)“device not found”。3.2 模型轉(zhuǎn)換ONNX轉(zhuǎn)OM是關(guān)鍵中的關(guān)鍵拿一個(gè)典型的YOLOv5s模型舉例假設(shè)已經(jīng)通過torch.onnx.export拿到了yolov5s.onnx。ATC轉(zhuǎn)換命令長(zhǎng)這樣atc --modelyolov5s.onnx --framework5 --outputyolov5s_om \ --input_shapeimages:1,3,640,640 \ --soc_versionAscend310P3 \ --insert_op_confaipp.cfg逐個(gè)解釋一下參數(shù)--model輸入的ONNX模型文件。--framework5固定值5表示ONNX因?yàn)锳TC支持諸多框架格式。--output輸出的OM文件名。--input_shape這里必須跟ONNX模型輸入節(jié)點(diǎn)的名字和維度完全匹配YOLOv5輸入節(jié)點(diǎn)名一般是images維度是[batch, channel, height, width]。batch固定為1容易理解如果要做多路視頻可以在推理時(shí)通過動(dòng)態(tài)batch處理。--soc_versionAscend310P3這坑很多人踩過。Atlas 300V 24G用的310P芯片ATC轉(zhuǎn)換時(shí)soc_version要填對(duì)填錯(cuò)會(huì)直接報(bào)“unsupported soc version”。具體是Ascend310P3還是Ascend310P1要看你的芯片型號(hào)運(yùn)行npu-smi info能查出來保險(xiǎn)起見可以在官網(wǎng)產(chǎn)品規(guī)格里確認(rèn)一下。--insert_op_confaipp.cfgAIPP是昇騰的像素預(yù)處理模塊意思就是圖像縮放、減均值、歸一化這些操作直接下沉到芯片上做不占CPU資源。aipp.cfg文件內(nèi)容大概是這樣aipp_op { aipp_mode: static input_format: RGB888_U8 src_image_size_w: 640 src_image_size_h: 640 csc_switch: false rbuv_swap_switch: false crop: false mean: 0.0 0.0 0.0 min: 0.0 0.0 0.0 max: 255.0 255.0 255.0 }這里mean和min/max的組合意思是把像素值從0到255歸一化到0到1。如果你的訓(xùn)練代碼里用的是ImageNet的mean和std需要換算成對(duì)應(yīng)數(shù)值或者干脆關(guān)閉AIPP的歸一化在推理代碼里用算子完成。我當(dāng)時(shí)為了圖省事直接在AIPP里做了歸一化省一步是一步。轉(zhuǎn)換完成后會(huì)生成一個(gè).om文件可以用atc自帶的工具做離線驗(yàn)證但通常沒必要直接跑一次推理腳本就能發(fā)現(xiàn)問題。3.3 編寫推理腳本AscendCL的這些接口必須會(huì)用CANN安裝好之后推薦用Python版的pyACL做原型驗(yàn)證開發(fā)效率比C高很多性能損失在單路視頻流場(chǎng)景下幾乎可以忽略。下面的示例代碼摘了核心部分不是完整代碼但主流程是清晰的。import acl import numpy as np # 初始化 acl.init() ret acl.rt.set_device(0) context, ret acl.rt.create_context(0) # 加載模型 model_path byolov5s_om.om model_id, ret acl.mdl.load_from_file(model_path) # 獲取模型輸入輸出信息 input_desc acl.mdl.create_desc() output_desc acl.mdl.create_desc() acl.mdl.get_input_desc(input_desc, model_id, 0) acl.mdl.get_output_desc(output_desc, model_id, 0) input_size acl.mdl.get_desc_size(input_desc) output_size acl.mdl.get_desc_size(output_desc) # 分配device內(nèi)存 input_data, ret acl.rt.malloc(input_size, 2) output_data, ret acl.rt.malloc(output_size, 2) # 構(gòu)造輸入數(shù)據(jù)假設(shè)image是已經(jīng)預(yù)處理好、shape為(1,3,640,640)的numpy數(shù)組 image_nd np.ascontiguousarray(image) acl.rt.memcpy(input_data, input_size, image_nd.ctypes.data, image_nd.nbytes, acl.rt.MEMCPY_HOST_TO_DEVICE) # 創(chuàng)建輸入輸出數(shù)據(jù)集 dataset_input acl.mdl.create_dataset() dataset_output acl.mdl.create_dataset() acl.mdl.add_dataset_buffer(dataset_input, input_data, input_size) acl.mdl.add_dataset_buffer(dataset_output, output_data, output_size) # 推理 ret acl.mdl.execute(model_id, dataset_input, dataset_output) # 把結(jié)果拷回主機(jī)端 output_np np.zeros(output_size, dtypenp.uint8) acl.rt.memcpy(output_np.ctypes.data, output_size, output_data, output_size, acl.rt.MEMCPY_DEVICE_TO_HOST)這段代碼走通了你就已經(jīng)跑通昇騰推理全流程。不過這里有一個(gè)非常容易踩的坑YOLO的模型輸出通常有三個(gè)尺度的特征圖OM模型在AscendCL下可能把它們拆分成了多個(gè)輸出節(jié)點(diǎn)你需要根據(jù)模型導(dǎo)出時(shí)定義的輸出數(shù)量來遍歷所有輸出desc。別只處理第0個(gè)輸出不然檢測(cè)框全部丟失。后處理邏輯里decoding和NMS我建議先在CPU上用numpy跑通因?yàn)榍捌谂挪閱栴}最怕的就是不知道結(jié)果是模型錯(cuò)了還是后處理錯(cuò)了。等整個(gè)流程正確了再考慮把NMS搬到卡上或者用C實(shí)現(xiàn)來提性能。還有數(shù)據(jù)預(yù)處理建議把letterbox縮放、顏色通道轉(zhuǎn)換這些步驟封裝成獨(dú)立函數(shù)。YOLOv5訓(xùn)練時(shí)用的是RGB輸入推理階段如果圖像是BGR通道順序不調(diào)整檢測(cè)結(jié)果會(huì)非常稀疏框的位置也會(huì)偏差很大這是一個(gè)極易忽略的細(xì)節(jié)。3.4 跑通后的效果驗(yàn)證用npu-smi和日志雙重確認(rèn)推理腳本跑通后不要急著接業(yè)務(wù)先做兩件事第一觀察NPU占用。執(zhí)行npu-smi info重點(diǎn)看AI Core的占用率和顯存使用量。如果占用率一直很低說明模型優(yōu)化還不到位可能卡在數(shù)據(jù)在Host和Device之間的拷貝上。300V 24G的PCIe帶寬有限每次推理都做H2D和D2H拷貝時(shí)間損耗非常大。解決思路是批量推理比如一次把4張圖放進(jìn)一個(gè)batch讓拷貝次數(shù)減少為原來的四分之一。第二用日志定位耗時(shí)。CANN環(huán)境變量里可以開啟profilingexport PROFILING_MODEtrue export PROFILING_OPTIONSoutput/tmp/profiling, task_timeon跑一次推理后去/tmp/profiling目錄看耗時(shí)分析能直觀看到數(shù)據(jù)預(yù)處理、模型執(zhí)行、后處理三部分各自的耗時(shí)占比。我調(diào)試過很多次最終結(jié)論基本都是模型執(zhí)行時(shí)間只占一半不到前后處理和拷貝反而成為瓶頸。4. 常見問題與排查技巧實(shí)錄4.1 模型轉(zhuǎn)換階段的報(bào)錯(cuò)離了soc_version和input_shape就沒法玩我在多個(gè)項(xiàng)目里遇到過得最多的報(bào)錯(cuò)是ATC轉(zhuǎn)換時(shí)報(bào)E40000錯(cuò)誤信息里面大概率會(huì)包含“input shape mismatch”或者“Unsupported op type”。前者好解決檢查一下ONNX的輸入名和維度用onnx.load看一眼模型結(jié)構(gòu)就行。后者就比較麻煩說明模型里有算子還沒被CANN適配。YOLOv5s和YOLOv8s這種主流模型一般都能直接轉(zhuǎn)換真正要擔(dān)心的是自己魔改過的模型結(jié)構(gòu)。比如有人為了提精度在backbone里加了一些YOLO官方?jīng)]有的模塊比如自定義的注意力機(jī)制ATC不認(rèn)的話就卡住了。我的建議是要么把自定義算子改回官方實(shí)現(xiàn)要么用C寫自定義算子插件注冊(cè)進(jìn)CANN。后者門檻較高能夠在模型設(shè)計(jì)階段盡量規(guī)避就規(guī)避。另一個(gè)在轉(zhuǎn)換階段的坑是AIPP配置。我記得有一次改了歸一化參數(shù)結(jié)果檢測(cè)結(jié)果空白排查了半天最后發(fā)現(xiàn)是AIPP的src_image_size_w沒改圖像在預(yù)處理階段被強(qiáng)行縮放到錯(cuò)誤尺寸模型輸出自然全亂。AIPP配置里的每個(gè)字段都值得仔細(xì)對(duì)一遍特別是輸入圖片尺寸必須跟模型輸入一致。4.2 推理階段的報(bào)錯(cuò)先分清是環(huán)境問題還是代碼問題推理階段常見報(bào)錯(cuò)及快速排查方案我做了一個(gè)速查表報(bào)錯(cuò)現(xiàn)象大概率原因處理辦法aclrtSetDevice返回507設(shè)備節(jié)點(diǎn)未映射或驅(qū)動(dòng)異常查/dev/davinci*是否存在容器場(chǎng)景檢查掛載模型加載失敗提示model load failedOM文件與當(dāng)前芯片型號(hào)不匹配確認(rèn)轉(zhuǎn)換時(shí)--soc_version是否填對(duì)推理結(jié)果全0輸入數(shù)據(jù)未成功拷貝到Device端檢查acl.rt.memcpy的H2D方向打印返回值確認(rèn)推理輸出shape異常輸出節(jié)點(diǎn)遍歷不全遍歷所有output描述打印每個(gè)輸出維度檢測(cè)框偏移嚴(yán)重輸入通道順序不對(duì)或預(yù)處理參數(shù)與訓(xùn)練不一致確認(rèn)RGB/BGR、letterbox參數(shù)與訓(xùn)練一致還有一類問題很難排查就是“推理偶發(fā)抖動(dòng)”。如果單幀推理時(shí)間平時(shí)10毫秒偶爾跳到30毫秒通常是PCIe帶寬爭(zhēng)搶或者顯存碎片化導(dǎo)致的。解決辦法有幾個(gè)一是推理線程和拷貝線程分開用流水線方式掩蓋H2D耗時(shí)二是固定batch大小預(yù)分配好Device內(nèi)存不要在推理過程中反復(fù)malloc和free。顯存碎片在長(zhǎng)時(shí)間運(yùn)行的服務(wù)里非常要命我見過跑了一天后推理直接報(bào)out of memory的情況重啟進(jìn)程就好根源就是內(nèi)存反復(fù)分配導(dǎo)致碎片化。4.3 性能調(diào)優(yōu)的一些獨(dú)家心得性能調(diào)優(yōu)是個(gè)很大的話題這里我結(jié)合經(jīng)驗(yàn)給幾條對(duì)300V 24G特別有效的建議。第一能批量就批量。多路視頻流場(chǎng)景下一定不要把每幀圖像單獨(dú)推理正確做法是同一時(shí)刻收集多路圖像拼成batch。batch為4時(shí)的總耗時(shí)通常只有batch為1時(shí)的一倍多但吞吐翻了四倍。第二后處理盡量晚一點(diǎn)做。YOLO輸出的原始tensor在Device端如果先把所有檢測(cè)框坐標(biāo)拷回Host再做NMS一次性拷貝量太大??梢韵仍贒evice端做置信度過濾只把少數(shù)高置信度框結(jié)果拷出來再做NMS。CANN有些版本支持自定義后處理算子但最快的方式是先用acl.rt.memcpy只拷貝過濾后的數(shù)組減少主機(jī)側(cè)處理壓力。第三功耗散熱一定不能忽略。Atlas 300V 24G滿載功耗也不低機(jī)箱風(fēng)道太差的話卡容易觸發(fā)降頻跑一段時(shí)間后性能明顯下滑。建議在服務(wù)器里給GPU/加速卡區(qū)域加裝機(jī)箱風(fēng)扇npu-smi info里能看到溫度超過85度基本就是散熱出問題了。第四留意CANN版本升級(jí)。昇騰的軟件迭代很快同型號(hào)卡在不同版本的CANN下算子性能和穩(wěn)定性差異還挺明顯。如果項(xiàng)目不趕時(shí)間建議每個(gè)大版本推出后先在測(cè)試環(huán)境把模型轉(zhuǎn)換和性能測(cè)試跑一遍確認(rèn)沒問題再上生產(chǎn)。我踩過一次CANN 5.x升級(jí)到6.x的坑之前正常跑的OM模型直接加載不了重新用新版本轉(zhuǎn)換后才恢復(fù)。4.4 一個(gè)容易忽略的小細(xì)節(jié)鏡像與離線環(huán)境的適配有時(shí)候生產(chǎn)環(huán)境不具備直接聯(lián)網(wǎng)下載依賴包的條件昇騰的安裝包和依賴庫(kù)都是離線rpm或者run包這塊還好辦。但Python側(cè)依賴比如numpy、opencv-python如果服務(wù)器不能聯(lián)網(wǎng)建議提前用pip download把對(duì)應(yīng)Python版本的包拉到本地。別小看這些預(yù)處理庫(kù)YOLO部署真正麻煩的往往不是模型本身而是整個(gè)運(yùn)行環(huán)境里各種依賴的版本匹配問題。我在一個(gè)ARM服務(wù)器上裝CANN時(shí)就遇到過一個(gè)很刁鉆的坑numpy的版本跟pyACL模塊不兼容導(dǎo)致import acl直接core dump。最后是查了CANN官方文檔中Python版本支持矩陣把numpy降級(jí)到指定版本才解決。所以不要盲目追求新版本官方文檔里寫的適配版本就是最穩(wěn)的。5. 給準(zhǔn)備入坑的朋友幾句掏心窩的話Atlas 300V 24G這張卡到底值不值得用我的答案是如果業(yè)務(wù)場(chǎng)景是明確的推理應(yīng)用尤其是視頻流和批量檢測(cè)它性價(jià)比很高功耗和單路成本都明顯優(yōu)于同價(jià)位的GPU。但如果你的團(tuán)隊(duì)完全沒有Linux系統(tǒng)和C/Debug經(jīng)驗(yàn)純指望開箱即用那我建議先花兩周時(shí)間把CANN基礎(chǔ)過一遍再?zèng)Q定是否全量遷過來。我個(gè)人在實(shí)際項(xiàng)目中最大的體會(huì)是昇騰部署最大的成本不是硬件是所有文檔和技術(shù)社區(qū)沉淀加起來仍然偏少遇到問題多數(shù)時(shí)候得自己一點(diǎn)點(diǎn)試。但換個(gè)角度想正因?yàn)檫@樣現(xiàn)在愿意花時(shí)間把流程跑通的團(tuán)隊(duì)反而能積累出真正的技術(shù)壁壘后面遷移到其他同類型加速卡上也會(huì)輕松很多。最后再分享一個(gè)小技巧剛開始做模型轉(zhuǎn)換的時(shí)候不要一上來就轉(zhuǎn)換自己的大模型。拿一個(gè)官方提供的resnet50或者yolov5s demo完整跑通整個(gè)鏈路再逐步替換成自己的模型。這樣能把“環(huán)境問題”和“模型問題”拆開排查能少走很多彎路。