【CANN训练营第三季】基于Caffe ResNet-101网络实现图片分类在昇腾310服务器的推理过程

切换用户

su - HwHiAiUser

下载sample仓库

# 进入目录/home/HwHiAiUser
cd ~
# 命令行下载master代码
git clone https://gitee.com/ascend/samples.git   
# 切换到历史tag,以v0.6.0举例
git checkout v0.6.0

准备模型

# 进入样例目录
cd samples/cplusplus/level2_simple_inference/1_classification/resnet50_imagenet_classification

# 创建并进入caffe_model目录
mkdir caffe_model && cd caffe_model

# 官网下载ResNet-101网络的模型文件(压缩包ATC Resnet101(FP16) from TensorFlow - Ascend310.zip)
# 解压后将其中的resnet101_tf.pb从本地上传到云服务器上


# 切换到样例目录
cd ..

# 将ResNet-101原始模型转换为适配昇腾AI处理器的离线模型(*.om文件)
atc --model=caffe_model/resnet101_tf.pb --framework=3 --output=model/resnet101_tf --output_type=FP32 --soc_version=Ascend310 --input_shape="input:1,224,224,3" --log=info

进入resnet50_imagenet_classification样例的script目录,修改transferPic.py脚本中的如下内容,将float16改为float32:

修改前

img = img.astype("float16")

修改后:

img = img.astype("float32")

切换到“resnet50_imagenet_classification样例目录/data“目录下,执行transferPic.py脚本,将*.jpg转换为*.bin,同时将图片从1024683的分辨率缩放为224224。在“resnet50_imagenet_classification样例目录/data“目录下生成2个*.bin测试文件。

python3 ../script/transferPic.py

在src/sample_process.cpp文件中定制代码(用新生成的模型替换旧的模型)

Result SampleProcess::Process()
{
    // model init
    ModelProcess modelProcess;
    // const char* omModelPath = "../model/resnet50.om";
    const char* omModelPath = "../model/resnet101_tf.om";
    Result ret = modelProcess.LoadModel(omModelPath);
    if (ret != SUCCESS) {
        ERROR_LOG("execute LoadModel failed");
        return FAILED;
    }

    ret = modelProcess.CreateModelDesc();
    if (ret != SUCCESS) {
        ERROR_LOG("execute CreateModelDesc failed");
        return FAILED;
    }

    string testFile[] = {
        "../data/dog1_1024_683.bin",
        "../data/dog2_1024_683.bin"
    };

模型转换成功的截图

在这里插入图片描述

编译运行代码

# 配置环境变量
export DDK_PATH=$HOME/Ascend/ascend-toolkit/latest/arm64-linux
export NPU_HOST_LIB=$DDK_PATH/runtime/lib64/stub

# 创建并进入build/intermediates/host目录,用于存放编译文件
mkdir -p build/intermediates/host && cd build/intermediates/host

# 交叉编译
cmake ../../../src -DCMAKE_CXX_COMPILER=aarch64-linux-gnu-g++ -DCMAKE_SKIP_RPATH=TRUE

# 执行如下命令,生成的可执行文件main在“样例目录/out“目录下
make

# 切换到可执行文件main所在的目录
cd $HOME/cplusplus/level2_simple_inference/1_classification/resnet50_imagenet_classification/out

# 运行可执行文件
./main

编译成功应用测试截图
在这里插入图片描述

### 使用 CANN 工具链优化神经网络模型训练和推理性能的方法与最佳实践 CANN(Compute Architecture for Neural Networks)是华为昇腾 AI 处理器的开发工具链,提供了从底层硬件到高层 API 的完整支持。以下内容详细介绍了如何使用 CANN 工具链加速神经网络模型的训练和推理性能。 #### 高阶 API 的使用 高阶 API 在中阶 API 的基础上进一步封装了复杂的操作逻辑,为用户提供了一站式的训练和推理管理功能[^1]。通过 Model 接口,用户可以指定神经网络模型及其训练设置,从而实现对模型训练过程的全面控制。例如,用户可以通过以下代码示例加载模型并执行推理: ```python from cann.infer import Model, create_tensor # 加载神经网络模型 model = Model("path/to/model.om") # 准备输入数据 input_data = create_tensor(data_shape, data_type) # 执行推理 output = model.execute([input_data]) ``` #### 混合精度训练 混合精度训练是一种通过结合 FP32 和 FP16 数据类型来提升训练速度的技术。CANN 提供了内置的混合精度训练接口,允许用户在保持模型精度的同时显著减少内存占用和计算时间。开发者可以通过以下方式启用混合精度训练: ```python from cann.train import MixedPrecision # 初始化混合精度训练器 mp_trainer = MixedPrecision(model, optimizer, loss_scaler) # 执行训练步骤 loss = mp_trainer.step(inputs, targets) ``` #### 调试与调优 CANN 提供了丰富的调试和调优工具,帮助开发者定位性能瓶颈并优化模型表现。例如,用户可以使用 Profiler 工具分析模型运行时的性能指标,并根据结果调整超参数或优化代码逻辑: ```python from cann.profiler import Profiler # 启用性能分析器 profiler = Profiler(model) # 运行模型并收集性能数据 profiler.start() output = model.execute([input_data]) profiler.stop() # 输出分析报告 report = profiler.get_report() print(report) ``` #### 最佳实践 为了充分发挥 CANN 工具链的优势,开发者应遵循以下最佳实践: - 确保模型被正确转换为 `.om` 格式,这是昇腾处理器支持的标准模型格式。 - 利用 CANN 提供的量化工具对模型进行量化处理,以降低计算复杂度并提高推理速度。 - 选择合适的批处理大小(Batch Size),以平衡 GPU 或 NPU 的利用率与内存消耗。 ```python # 示例:模型量化 from cann.quantization import Quantizer # 初始化量化器 quantizer = Quantizer(model) # 执行量化 quantized_model = quantizer.quantize(calibration_dataset) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值