从 cann-samples 上手:五个必看的示例
前言拿到昇腾开发板或服务器第一件事是什么官方推荐的路径先跑通 cann-samples 里的示例。这个仓库收集了覆盖 CV、NLP、推荐系统、多模态等场景的完整示例代码从环境搭建到模型部署全流程都有。为什么要从示例入手读文档能了解 API但文档往往只讲单个接口不告诉你怎么串起来。示例代码的优势是完整性——一个能跑的程序比十页文档更有用。cann-samples 里的示例有几个特点可复现环境依赖、数据准备、运行命令都写清楚了覆盖主流场景CV、NLP、推荐、多模态都有版本对应示例代码跟 CANN 版本绑定不会因为版本不匹配踩坑必看示例一ResNet50 图像分类路径cann-samples/vision/classification/ResNet50/这个示例覆盖从数据预处理到推理部署的全流程# 1. 准备环境gitclone https://atomgit.com/cann/cann-samples.gitcdcann-samples/vision/classification/ResNet50/# 2. 下载预训练模型ONNX 格式wgethttps://github.com/onnx/models/raw/main/vision/classification/resnet/model/resnet50-v1-7.onnx# 3. 编译成 .omatc--modelresnet50-v1-7.onnx\--framework5\--outputresnet50\--soc_versionAscend910# 4. 运行推理python infer.py--modelresnet50.om--imagecat.jpg输出示例Top-1: 银鲑鱼 (golden retriever), 置信度: 0.873 Top-2: 拉布拉多犬 (Labrador retriever), 置信度: 0.041 Top-5: ...这个示例的价值在于它展示了标准的推理流程——模型编译、数据预处理、推理执行、结果后处理每一步都有对应代码。必看示例二BERT 文本分类路径cann-samples/nlp/text_classification/bert/NLP 模型跟 CV 模型的区别输入是变长的 token 序列需要处理 padding 和 attention mask。# 数据预处理fromtransformersimportBertTokenizer tokenizerBertTokenizer.from_pretrained(bert-base-uncased)inputstokenizer(这部电影真的很棒,paddingTrue,truncationTrue,max_length512,return_tensorspt)# 转 NPUinput_idsinputs[input_ids].to(npu:0)attention_maskinputs[attention_mask].to(npu:0)# 推理outputmodel(input_ids,attention_maskattention_mask)这个示例的重点是attention_mask的处理——把 padding 位置标记出来避免模型关注无效 token。必看示例三YOLOv5 目标检测路径cann-samples/vision/object_detection/yolov5/目标检测比分类复杂输出不是单个类别而是多个边界框 类别 置信度。后处理是关键# YOLOv5 后处理NMS非极大值抑制importtorchdefnms(boxes,scores,iou_threshold0.5):# 1. 按置信度排序sorted_indicestorch.argsort(scores,descendingTrue)keep[]whilelen(sorted_indices)0:# 2. 取置信度最高的框bestsorted_indices[0]keep.append(best)# 3. 计算跟其他框的 IoUiouscompute_iou(boxes[best],boxes[sorted_indices[1:]])# 4. 保留 IoU threshold 的框keep_indices(iousiou_threshold).nonzero().squeeze(1)sorted_indicessorted_indices[keep_indices1]returnkeep这个示例展示了端到端部署的完整流程模型编译、预处理、推理、后处理、可视化。必看示例四DeepFM 推荐系统路径cann-samples/recommendation/deepfm/推荐系统模型的输入是稀疏特征用户 ID、物品 ID、类别标签等需要先做 embedding 查表再送进 DNN。# embedding 查表user_embeddingnn.Embedding(num_users,embedding_dim)item_embeddingnn.Embedding(num_items,embedding_dim)user_vecuser_embedding(user_ids)# [batch, embed_dim]item_vecitem_embedding(item_ids)# [batch, embed_dim]# FM 部分特征交叉fm_outputtorch.sum(user_vec*item_vec,dim1)# DNN 部分深层特征提取dnn_inputtorch.cat([user_vec,item_vec],dim1)dnn_outputdnn(dnn_input)# 输出点击率预测outputtorch.sigmoid(fm_outputdnn_output)这个示例覆盖稀疏特征处理和多塔结构FM DNN是推荐系统的经典范式。必看示例五CLIP 多模态检索路径cann-samples/multimodal/clip/CLIP 的训练方式是图像和文本分别编码然后算余弦相似度让配对的图像-文本相似度最高。推理时可以反过来用用文本检索图像或者用图像检索文本。# 图像编码image_featuresimage_encoder(images)# [batch, embed_dim]image_featuresimage_features/image_features.norm(dim-1,keepdimTrue)# 文本编码text_featurestext_encoder(texts)# [batch, embed_dim]text_featurestext_features/text_features.norm(dim-1,keepdimTrue)# 计算相似度矩阵similarityimage_features text_features.T# [batch, batch]# 对角线上的元素是正样本配对的图-文# 非对角线是负样本losscross_entropy(similarity,labels)这个示例展示了多模态模型的推理方式以及怎么用昇腾 NPU 加速 CLIP。怎么把示例改成自己的项目直接抄示例代码是最快的入门方式但要把它改成自己的项目需要改几个地方数据预处理示例用的是公开数据集你要换成自己的数据格式模型结构示例用的是标准模型你可能需要加自定义层后处理示例的后处理是通用逻辑你的业务可能有特殊需求建议的做法先原样跑通示例确保环境和流程没问题再逐步替换数据、模型、后处理每次只改一个部分方便定位问题。总结cann-samples 的价值不在于代码本身而在于它展示了完整的、可复现的流程。从 ResNet50 的图像分类到 CLIP 的多模态检索这五个示例覆盖了昇腾 NPU 上最常见的 AI 场景。把示例跑通、理解、改造比从头写代码效率高得多。