当前位置: 首页 > 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.jsqmd.com/news/904855/

相关文章:

  • 从零打造蓝牙遥控履带车:Arduino、3D打印与FPV系统全解析
  • 2025泉州除甲醛公司Top5深度测评:绿舒环保稳居榜首 - 绿舒环保母婴除甲醛
  • 2026年最值得关注的8款AI简历工具深度解析
  • 基于Raspberry Pi Pico W的Wi-Fi邮件报警系统设计与实现
  • 踩坑!JDK8u371 报 No appropriate protocol,加启动参数无效
  • 选择题专练数据库原理精选30题
  • 如何使用Legacy iOS Kit实现旧款iOS设备降级与越狱的完整指南
  • Arduino LED乒乓球游戏:从电路设计到状态机编程的嵌入式开发实践
  • 2.隐藏账户
  • crabc - api 开源项目更名 ApiGo,一站式 API 数据服务平台更新多项功能
  • 求职季必备!这7款AI简历工具,让你的简历匹配度飙升,效率翻倍!
  • 2026碑林区企业变更哪家好?西安碑林区优质财税机构TOP4测评 - 小柏云
  • Ubuntu 20.04 新手必看:刚装完系统,ifconfig和vim都用不了?5分钟搞定镜像源和常用工具安装
  • 老年人陪伴与护理智能体
  • 国内钢模板企业排行:5家实力厂商核心能力对比 - 奔跑123
  • 化龙附近拿证快的正规驾校盘点:5家机构客观对比 - 奔跑123
  • ZYZ28 2026.5.26 Round 记录
  • 专业开发者指南:使用pywencai高效获取同花顺问财金融数据
  • 对比自行维护与使用 Taotoken 聚合 API 的运维成本观感
  • Dism++:让Windows系统维护变得简单高效
  • 选择题专练数据库原理精选30题[答案]
  • 从零开始:用Harepacker复活版轻松打造你的MapleStory专属世界
  • Go语言跨平台数据库开发:实现跨平台数据持久化
  • Arduino模拟信号控制实战:电位器PWM调控电机与LED
  • 2026全国铝锭供应商盘点推荐 - 速递信息
  • 2026益阳高新区美容院实测测评 10家门店综合排名发布 - GrowthUME
  • Arduino智能垃圾桶实战:超声波感应与舵机控制全解析
  • 怎样高效捕获网页媒体资源:专业浏览器嗅探工具完整指南
  • 产品设计思维转变:从功能堆砌到问题消除,提升用户体验与留存率
  • 南沙区拿证效率靠前驾培机构盘点 合规性与速度双维度 - 奔跑123