当前位置: 首页 > news >正文

基于DLP平台的手写数字分类——CPU到深度学习处理器的加速实践

【智能计算系统】实验二:基于DLP平台的手写数字分类——CPU到深度学习处理器的加速实践(附完整代码)

本文是智能计算系统课程实验二的完整实现,将实验一中在CPU上训练的神经网络移植到DLP(深度学习处理器)平台,实现手写数字分类的加速推断。通过对比CPU和DLP的性能差异,理解专用硬件加速器的优势。

一、实验概述

本实验目的是熟悉深度学习处理器DLP平台的使用,使用pycnnl库将神经网络推断部分移植到DLP平台,实现手写数字分类。

实验环境:

  • 硬件:DLP(深度学习处理器)
  • 软件:pycnnl库、Python 3.6.12、CNNL高性能算子库、CNRT运行时库
  • 数据集:MNIST手写数字库
  • 模型文件:实验一训练生成的权重文件weight.npy

二、DLP平台简介

DLP(Deep Learning Processor)是专门为深度学习计算设计的处理器,相比通用CPU具有以下优势:

  • 专门优化的矩阵运算单元
  • 更高的并行计算能力
  • 更低的功耗
  • 更适合大规模批量推断

三、核心代码实现

3.1 使用pycnnl构建网络

与实验一手动实现不同,DLP平台使用pycnnl库提供的接口来构建网络:

import pycnnlclass MNIST_MLP(object):def __init__(self):self.net = pycnnl.CnnlNet()def build_model(self, batch_size=100, input_size=784,hidden1=100, hidden2=100, out_classes=10):self.batch_size = batch_sizeself.out_classes = out_classesself.net.setInputShape(batch_size, input_size, 1, 1)# fc1层input_shapem1 = pycnnl.IntVector(4)input_shapem1[0] = batch_sizeinput_shapem1[1] = 1input_shapem1[2] = 1input_shapem1[3] = input_sizeweight_shapem1 = pycnnl.IntVector(4)weight_shapem1[0] = batch_sizeweight_shapem1[1] = 1weight_shapem1[2] = input_sizeweight_shapem1[3] = hidden1output_shapem1 = pycnnl.IntVector(4)output_shapem1[0] = batch_sizeoutput_shapem1[1] = 1output_shapem1[2] = 1output_shapem1[3] = hidden1self.net.createMlpLayer('fc1', input_shapem1, weight_shapem1, output_shapem1)self.net.createReLuLayer('relu1')# fc2、fc3类似...

3.2 数据加载与预处理

数据预处理需要进行归一化:

def load_data(self, data_path, label_path):test_images = self.load_mnist(os.path.join(MNIST_DIR, TEST_DATA), True)test_labels = self.load_mnist(os.path.join(MNIST_DIR, TEST_LABEL), False)# 归一化:(x/255 - mean) / stdtest_images = (test_images.astype(np.float64) / 255.0 - 0.1307) / 0.3081self.test_data = np.append(test_images, test_labels, axis=1)

3.3 模型参数加载

加载实验一训练好的权重文件:

def load_model(self, param_dir):params = _load_raw_weights(param_dir)weigh1 = params['w1'].flatten().astype(np.float64)bias1 = params['b1'].flatten().astype(np.float64)self.net.loadParams(0, weigh1, bias1)weigh2 = params['w2'].flatten().astype(np.float64)bias2 = params['b2'].flatten().astype(np.float64)self.net.loadParams(2, weigh2, bias2)weigh3 = params['w3'].flatten().astype(np.float64)bias3 = params['b3'].flatten().astype(np.float64)self.net.loadParams(4, weigh3, bias3)

3.4 权重文件转换工具

实验二需要将实验一的权重文件转换为特定格式:

def _load_raw_weights(param_dir):params = {}with open(param_dir, 'rb') as f:data = f.read()offset = 0for key in ['w1','b1','w2','b2','w3','b3']:hlen = struct.unpack_from('<I', data, offset)[0]offset += 4header = data[offset:offset+hlen].decode('ascii')offset += hlendtype_str, shape_str = header.split('|')shape = tuple(int(s) for s in shape_str.split(','))dtype = np.dtype(dtype_str)nbytes = int(np.prod(shape)) * dtype.itemsizeparams[key] = np.frombuffer(data[offset:offset+nbytes], dtype=dtype).reshape(shape).copy()offset += nbytesreturn params

3.5 DLP推断与评估

在DLP上进行推断并计时:

def evaluate(self):pred_results = np.zeros([self.test_data.shape[0]])for idx in range(self.test_data.shape[0]//self.batch_size):batch_images = self.test_data[idx*self.batch_size:(idx+1)*self.batch_size, :-1]data = batch_images.flatten().tolist()self.net.setInputData(data)start = time.time()self.forward()end = time.time()print('inferencing time: %f'%(end - start))prob = self.net.getOutputData()prob = np.array(prob).reshape((self.batch_size, self.out_classes))pred_labels = np.argmax(prob, axis=1)pred_results[idx*self.batch_size:(idx+1)*self.batch_size] = pred_labelsaccuracy = np.mean(pred_results == self.test_data[:,-1])print('Accuracy in test set: %f' % accuracy)

3.6 CPU推断对比

为了对比DLP和CPU的性能差异:

# test_cpu.py
def run_test():from stu_upload.mnist_mlp_cpu import MNIST_MLPmlp = MNIST_MLP(batch_size=10000, hidden1=HIDDEN1, hidden2=HIDDEN2, max_epoch=1)mlp.load_data()mlp.build_model()mlp.init_model()mlp.load_model('stu_upload/weight.npy')mlp.evaluate()

四、运行结果

使用隐藏层神经元数量为256和128,在DLP上运行推断:

平台 单次推断时间 性能对比
CPU 约0.05-0.1秒 基准
DLP 约0.001-0.005秒 20-50倍加速

测试集准确率:约97-98%

五、评分标准

分数 要求
60分 DLP上推断,准确率 > 90%
80分 DLP耗时为CPU的1/20,准确率 > 95%
100分 DLP耗时为CPU的1/50,准确率 > 98%

六、注意事项

  1. 上传的模型参数文件需要修改名称为weight.npy
  2. mnist_mlp_cpu.py需要修改batch_size为10000
  3. 需要注释掉训练函数,改为加载模型

七、实验总结

通过本实验,我了解了DLP平台的使用方法:

  1. pycnnl库提供了简洁的接口来构建和运行神经网络
  2. DLP相比CPU在神经网络推断上有显著的性能优势
  3. 同样的模型在DLP上可以获得20-50倍的加速
  4. DLP特别适合大规模批量推断场景

GitHub仓库地址: https://github.com/NiMark886/smart-computing-exp2-dlp-mnist

Gitee仓库地址: https://gitee.com/NiMark886/smart-computing-exp2-dlp-mnist

http://www.gsyq.cn/news/1416150.html

相关文章:

  • 如何使用Legacy iOS Kit实现旧款iOS设备降级与越狱的完整指南
  • Arduino LED乒乓球游戏:从电路设计到状态机编程的嵌入式开发实践
  • crabc - api 开源项目更名 ApiGo,一站式 API 数据服务平台更新多项功能
  • 求职季必备!这7款AI简历工具,让你的简历匹配度飙升,效率翻倍!
  • 国内钢模板企业排行:5家实力厂商核心能力对比 - 奔跑123
  • 从零开始:用Harepacker复活版轻松打造你的MapleStory专属世界
  • 南沙区拿证效率靠前驾培机构盘点 合规性与速度双维度 - 奔跑123
  • 2026年实测推荐:这5款免费投票工具真正靠谱好用 - 速递信息
  • ICE超声软件性能指标详解:从原理到优化实践
  • 2.HTML表格详解:标签、属性与单元格合并实战
  • BilibiliDown终极指南:三分钟掌握B站视频下载与音频提取技巧
  • 保姆级教程:用OpenWrt无线中继搞定家庭打印和文件共享(附固定IP避坑指南)
  • 解密@AutoConfiguration:SpringBoot自动装配的‘组合拳’与proxyBeanMethods=false的妙用
  • 如何彻底解决ThinkPad风扇噪音问题:3步完成终极智能控制配置
  • 2026安宁市本地人必选的公共卫生检测专业机构TOP5推荐!美容院、足疗店、酒店宾馆卫生检测、许可证办理,正规CMA资质检测公司排名推荐 (2026年5月商铺卫生办证最新深度调研方案) - 一休咨询
  • 如何通过约束设计避免代理过度执行:从AI到工程实践
  • leecodecode【双指针题2】【2026.5.26打卡-java版本】
  • LeetCode 3120.统计特殊字母的数量 I:(手写)哈希表
  • Silicon Graphics 030-8123-016/B I/O 背板组件
  • 知行合一:为什么懂了很多道理,还是很难做到?
  • OBS Studio 安装 Zoominator 插件
  • 基于Arduino与超声波传感器的低成本智能跟随小车全攻略
  • 魔术贴采购指南——采购经理们关注哪些供应商特质? - 变量人生001
  • PortSwigger SQL注入LAB10
  • Beyond Compare 5 终极密钥生成器:开源高效的完整激活解决方案
  • 2026年Next.js部署平台深度对比:Netlify、AWS、Cloudflare等五大方案实战解析
  • MapLibre GL JS第13课:哈希路由
  • 别光看热闹!用NetworkX和Pyecharts拆解《三国演义》的权力格局与叙事节奏
  • 写作压力小了!盘点2026年备受推崇的的降AI率平台
  • 从汉诺塔到LeetCode:掌握Python递归的5个经典刷题模板(含阶乘、斐波那契)