版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
版本2021年05月06 插图目 表格目 2.1版本记 CambriconTensorFlow架构简 原生模式 融合模式 暂不支持的TensorFlow模 TensorFlow 使用 使用 安装 安装寒武纪Neuware依赖 获取CambriconTensorFlow源代 使用 获取MLU设备个 获取详细的MLU相关信 MLU内存使用策 在多MLU系统中使用单 使用多MLU设 MLU设备可见 使用 基于LowAPI的CambriconTensorFlow教 基于Keras的CambriconTensorFlow教 Horovod分布 增加自定义MLU算 MLU内存越界检 tensordump功能以及误差计算工 TensorDump功
插图目录插图目录
CambriconTensorFlow在寒武纪软件栈中的位
CambriconTensorFlow架 表格目录表格目录
11((或保证本文件所且寒武纪不承担因应用或使用任何产品或服务而产生的任何责任。寒武纪不应对因下列原因产生的任何12客户产品设计。本指南列出的性能测试和等级要使用特定芯片或计算机系统或组件来测量。经该等测试,本指南所示结果反映了寒武纪产品的大概性能。系统硬件或软件设计或配置的任何不同会影响实际性能。如上所述,寒武纪不代表、担保或保证本指南所述产品将适用于任何特定用途。寒武纪不代表或担保测试每种产品以期避免应用程序或产品的默认情况。客户产品设计的脆弱性会影响寒武纪产品的质量和可靠性并导致超出本指南范围的额外或不同的情况和/或要求。 ©2021222.1:寒武纪TensorFlowV20210506更新时间:20210201移除融合模式相关内容。融合模式的使用说明,参见《寒武纪TensorFlow增加快速入门33TensorFlow是一款基于数据流的编程框架,广泛应用于各类机器学习、深度神经网络,具有很高的可为支持寒武纪MLU(MachineLearningUnit,机器学习处理器),寒武纪扩展了开源深度学习编程框架TensorFlow(以下简称CambriconTensorFlow),在原生TensorFlow中增加对MLU的支持,实现已有TensorFlow模型在MLU关于原生TensorFlow的更多内容,参见TensorFlow官网相关文档资料1。本手册主要介绍基于寒武纪MLU的CambriconTensorFlow目前CambriconTensorFlowTensorFlowv1.15.4寒武纪软件栈具有端云一体的特点,既适用于终端智能芯片,也适用于云端智能板卡。CambriconTensorFlow是支持寒武纪MLU习编程框架,在寒武纪软件栈所处位置如下图所示。1\h.CAMBRICONTENSORFLOW3.1:CambriconTensorFlow基于原生TensorFlow,CambriconTensorFlow集成了寒武纪软件栈、扩展了TensorFlow设备层,并增加了对寒武纪MLU的支持。CambriconTensorFlow屏蔽硬件的相关属性,允许用户使用原生TensorFlowAPI进行开发,并且适配了部分KerasAPI。CambriconTensorFlow3.2:CambriconTensorFlow以下对CambriconTensorFlowTensorFlow的graphexecutorTensorFlowCPU、GPU该模式下,计算图经过图优化后,graphexecutorTensorFlow软件栈层面,用户可以通过CNNL(CambriconNeuwareNeuralNetworkLibrary,寒武纪神经网络计算库、CNPlugin(CambriconNeuwarePlugin,寒武纪自定义算子库)以及CNCC(CambriconNeuwareCompilerCollection,寒武纪BANGC语言编译器)接入寒武纪深度优化的通用算子或者灵关于TensorFlow算子的定义,参见Createanop2用户也可以通过寒武纪BANG语言灵活添加自定义算子。更多内容,参见添加自定义算子2\h.暂不支持的TENSORFLOWCambriconTensorFlow内建了基于CNML(CambriconNeuwareMachineLearningLibrary,寒武纪机器学习库)融合模式。融合模式下,CambriconTensorFlow会对用户的计算图进行全图优化,将多个小算子融合成一个大算子,消除不必要的中间结果,生成更高效率、更具硬件亲和性的MLU模式的更多内容,参见《寒武纪TensorFlowexport目前Cambriconexport关于运行融合模式的更多内容,参见《寒武纪TensorFlow暂不支持的TensorFlow(just‑in‑time)编译机制、AOT(ahead‑of‑time)有关TensorFlowLite的信息,参见TensorFlow33\h44CambriconTensorflow运行时依赖CNToolkit以及计算加速库CNML、CNNL、CNCLCNPlugin本章节主要介绍如何安装CambriconTensorFlow。有关如何安装CambriconNeuwareSDK您也可以使用CambrionensorFlw发布的Docer容器,其中已经安装了CambrionensorFlw所依赖的组件。使用CambrionensorFlw发布包中包含使用manylinux构建的wheel包。用户可以选择对应ython本的wheel包进行安装。下面以Python2virtualenvvirtualenv--system-site-packages-ppython2.7sourcesourcepythonpython-c"importtensorflowastf;.使用使用在使用已安装CambriconTensorFlow运行环境的Docker在主机上安装MLU驱动。关于MLU安装Docker。关于DockerDocker4导入TensorFlowDocker运行以下命令将TensorFlowdockerimage仓库。根据实际需求载入develimagereleaseimage。本节以发布的Ubuntu16.04##导入devel#导入release导入完成后,可执行dockerimagels启用CambriconTensorFlowCambriconTensorFlow镜像已预装CNToolkit、Python2.7或Python3.7通过以下命令启动TensorFlowdockerdockerrun[-it][--rm]--privileged[-phostPort:containerPort][-v֒→TENSORFLOW_IMAGE_NAME:TAGdockerdockerrun-it--privileged-v/path/to/your/models:/path/to/your/models-v关于DockerDocker5使用releaseimage或develimage使用releaseimage检测TensorFlowpythonpython-c"importtensorflowastf; 2)也可参见快速入门章节,在Docker内运行demo,验证TensorFlow使用develimage编译安装TensorFlowcdcd##编译成功后自动在当前目录创建虚拟环境virtualenv_mlu并安装sourcepython-c"importtensorflowastf;从源码编译TensorFlow,首先要满足TensorFlow社区对开发环境的要求,具体参见从源代码构建6您可以使用CambriconTensorFlow发布的带有devel标识的开发版dockerdocker器中,编译所依赖的构建工具、工具链以及依赖库已经安装就绪。可以直接进入TensorFlow源码目录编译TensorFlow源码要求GCC7.3。推荐使用Ubuntu18(安装TensorFlow使用Bazel##下载0.24.1版本Bazelwget/bazelbuild/bazel/releases/download/0.24.1/bazel-0.24.1-installer-bashbazel-0.24.1-installer-linux-x86_64.sh--安装完成后,可执行以下命令验证Bazel6\hbazelbazelBuildBuildlabel:Buildtarget:bazel-out/k8-Buildtime:TueApr216:29:262019Buildtimestamp:Buildtimestampasint:安装以下寒武纪NeuwareCNToolkit(需要先安装CNMLCNNLCNCLCNPlugin。具体安装步骤,参见《寒武纪CNToolkit包版本要求,参见源码包的cambricon_tensorflow/tensorflow/perty文件。获取发布的CambriconTensorFlow源码包并解压。tartar-zxvf编译过程中编译器会到系统默认路径搜索寒武纪Neuware软件包的头文件和动态链接库。如果您的寒武纪Neuware软件包的安装路径不在系统默认路径,可以通过设置环境变量exportNEUWARE_HOME=/path_to_neuware_home来指定搜索Neuware软件包的路径。 可以使用源码包中的build_tensorflow_mlu.sh脚本来编译CambriconTensorFlowcdcd#Neuware#export${TENSORFLOW_HOME}/virtualenv_mlu目录下会生成TensorFlowwheel动在virtualenv_mluwheel原生TensorFlow社区版本分发的TensorFlowpip、dockerCPUTensorFlowIItensorflow/core/platform/cpu_feature_guard.cc:142]YourCPUsupportsinstructionsthatCambrionensorFlw发布的pip、docer为了保证开箱即用的性能,选择了相对比较激进的策略,默认打开了一些在x64平台比较通用的指令集优化。对应的GCC编译选项:----copt=-mfma--copt=-mavx2--copt=-mavx--copt=-msse4.1copt=-aws:AmazonWebaws:AmazonWebServicegcp:GoogleCloudPlatform对应的bazel--config--config=noaws--CambrionensorFlw默认没有使能VX512F的支持。如果您需要开启编译器的VX512F指令优化请修改编译脚本,加入--copt=-mavx512f编译选项以使能该功能。 如果通过pi、docer分发的CambrionensorFlw因为ISA兼容性无法在您的CPU上运行,或您需要AS、GCP相关的服务特性,参见从源码编译自行修改编译配置,重新编译ensorFl。55使用本节介绍在CambrionTensorFlow中使用MLU进行计算加速的基本用法。通常情况下,使用MLU的方式跟使用GPU关于使用GPU的更多信息,参见UsingGPUs7对于TensorFlowtf.kerasMLU获取MLUimportimporttensorflowasprint("NumMLUsAvailable:",4卡MLU获取详细的MLUimportimporttensorflowas4MLU机器上将打印如下日志和输出(此处省略时间戳、文件名、行号等信息:##TensorFlowgitversion(from#ICurrentMLU_Visible_DevicesCount:.使用#CambriconTensorFlow的版本号、编译时间以及编译时使用的NeuwarelibrariesICambriconTensorFlowversion:1.1.0wascompiledat2020-12-1617:04:50withToolkit:֒→CNNL:1.1.1,CNML:7.9.2,CNPLUGIN:1.11.1,CNCL:Itfgitversion:v0.9.2-21252-#ICurrentlibraryversions:DRIVER:407,CNRT:40803,CNNL:1102,CNML:#ICreatedTensorFlowdevice(/job:localhost/replica:0/task:0/device:MLU:0with16384֒→memory)->physicalMLU(device:0,name:ICreatedTensorFlowdevice(/job:localhost/replica:0/task:0/device:MLU:1with16384֒→memory)->physicalMLU(device:1,name:ICreatedTensorFlowdevice(/job:localhost/replica:0/task:0/device:MLU:2with16384֒→memory)->physicalMLU(device:2,name:ICreatedTensorFlowdevice(/job:localhost/replica:0/task:0/device:MLU:3with16384֒→memory)->physicalMLU(device:3,name:MLU270)['/job:localhost/replica:0/task:0/device:CPU:0','/job:localhost/replica:0/task:0/device:MLU:0֒→','/job:localhost/replica:0/task:0/device:MLU:1',将sessionoptions中log_device_placement设置为Trueimportimporttensorflowas#Createsaa=tf.constant([1.0,2.0,3.0,4.0,5.0,6.0],shape=[2,3],b=tf.constant([1.0,2.0,3.0,4.0,5.0,6.0],shape=[3,2],c=tf.matmul(a,#Createsasessionwithlog_device_placementsettosess=#RunstheIIDevice/job:localhost/replica:0/task:0/device:MLU:0->device:0,name:/job:localhost/replica:0/task:0/device:MLU:1->device:1,name:/job:localhost/replica:0/task:0/device:MLU:2->device:2,name:(下页继续/job:localhost/replica:0/task:0/device:MLU:3->device:3,name:>>>#Runsthe...MatMul:(MatMul):/job:localhost/replica:0/task:0/device:MLU:0a:(Const):/job:localhost/replica:0/task:0/device:MLU:0b:(Const):[[22.[49.CambriconTensorFlow的算子支持CPU设备和MLU"/cpu:0":"/cpu:0":机器的CPU"/device:MLU:0":MLU"/device:MLU:1":MLUMU设备比CPUMUCambrion会将该算子优先分配到MU设备上,实现计算加速。如果希望某个算子在特定设备上运行,而不是在CambriconTensorFlowwithtf.deviceimportimporttensorflowas#Createsawitha=tf.constant([1.0,2.0,3.0,4.0,5.0,6.0],shape=[2,3],b=tf.constant([1.0,2.0,3.0,4.0,5.0,6.0],shape=[3,2],c=tf.matmul(a,#Createsasessionwithlog_device_placementsettosess=#RunstheIIDevice/job:localhost/replica:0/task:0/device:MLU:0->device:0,name:/job:localhost/replica:0/task:0/device:MLU:1->device:1,name:/job:localhost/replica:0/task:0/device:MLU:2->device:2,name:/job:localhost/replica:0/task:0/device:MLU:3->device:3,name:(下页继续>>>#Runsthe...MatMul:(MatMul):/job:localhost/replica:0/task:0/device:MLU:0a:(Const):/job:localhost/replica:0/task:0/device:cpu:0b:(Const):[[22.[49.MLUTensorFlow对GPU内存的使用策略是:默认情况下,在启动阶段申请全部的GPUmemory。用户可以申请内存。无论使用哪种策略,设备侧内存被TensorFlow详细说明,参见AllowingGPUmemorygrowth8CambriconTensorFlow对MLU内存的使用策略与GPU类似。两者主要区别在于TensorFlowMLU启动阶段不会预分配全部MLU内存,而是在运行阶段按需分配。与GPU相同,TensorFlow申请走的MLUexportexport关闭MLUTensorFlow初始化阶段,所有MLU在多MLU系统中使用单使用方式与GPU相同。更多信息,参见UsingasingleGPUonamulti‑GPUsystem989MLU使用方式与GPU相同。更多信息,参见UsingmultipleGPUs10MLU默认情况下,当前系统的所有MLU设备对TensorFlow均可见。如果要控制TensorFlow进程使用某一个或者某几个MLU设备,可以借助寒武纪驱动提供的MLU_VISIBLE_DEVICES环境变量来控制MLU设备需要注意的是,TensorFlow0Itensorflow/core/common_runtime/direct_session.cc:362]DeviceItensorflow/core/common_runtime/direct_session.cc:362]Device/job:localhost/replica:0/task:0/device:MLU:0->device:0,name:/job:localhost/replica:0/task:0/device:MLU:1->device:1,name:/job:localhost/replica:0/task:0/device:MLU:2->device:2,name:/job:localhost/replica:0/task:0/device:MLU:3->device:3,name:/job:localhost/replica:0/task:0/device:MLU:4->device:4,name:/job:localhost/replica:0/task:0/device:MLU:5->device:5,name:/job:localhost/replica:0/task:0/device:MLU:6->device:6,name:/job:localhost/replica:0/task:0/device:MLU:7->device:7,name:exportexport/job:localhost/replica:0/task:0/device:MLU:0->device:/job:localhost/replica:0/task:0/device:MLU:0->device:0,name:exportexport可以在启动日志中看到,对应设备在TensorFlow0、1、2、3/job:localhost/replica:0/task:0/device:MLU:0->device:0,name:/job:localhost/replica:0/task:0/device:MLU:1->device:1,name:10
.基于LOWAPICAMBRICONTENSORFLOW/job:localhost/replica:0/task:0/device:MLU:2->device:2,name:/job:localhost/replica:0/task:0/device:MLU:3->device:3,name:CNMIXCambrionensorFlw和CambrionPoc在MLU200CambriconTensorFlowCNMIX基于LowAPI的CambriconTensorFlow确认CambriconTensorFlow更多安装信息,参见安装章节。导入TensorFlowimportimportcnmiximporttensorflowasimporttensorflow.keras.datasets.mnistas(x_train,(x_train,y_train),(x_test,y_test)=mnist.load_data()batch_size,data_num=50,len(x_train)defdefinitial=tf.truncated_normal(shape,return(下页继续definitial=tf.constant(0.1,returndefconv2d(x,returntf.nn.conv2d(x,W,strides=[1,1,1,1],defreturntf.nn.max_pool(x,ksize=[1,2,2,strides=[1,2,2,1],xx=tf.placeholder(tf.float32,[None,28,y_=tf.placeholder("float",[None,W_conv1=weight_variable([5,5,1,b_conv1=x_image=tf.reshape(x,[-h_conv1=tf.nn.relu(conv2d(x_image,W_conv1)+h_pool1=W_conv2=weight_variable([5,5,32,b_conv2=h_conv2=tf.nn.relu(conv2d(h_pool1,W_conv2)+h_pool2=W_fc1=weight_variable([7*7*64,b_fc1=h_pool2_flat=tf.reshape(h_pool2,[-1,h_fc1=tf.nn.relu(tf.matmul(h_pool2_flat,W_fc1)+keep_prob=h_fc1_drop=tf.nn.dropout(h_fc1,W_fc2=weight_variable([1024,b_fc2=(下页继续y_conv=tf.nn.softmax(tf.matmul(h_fc1_drop,W_fc2)+cross_entropycross_entropy=-train_step=tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)correct_prediction=tf.equal(tf.argmax(y_conv,1),tf.argmax(y_,1))accuracy=tf.reduce_mean(tf.cast(correct_prediction,"float"))基于CNMIX构建sessionsession_configsession_config=cnmix.mixed_precision_graph_rewrite_config(batch_size,data_num)sess=tf.Session(config=session_config)EPOCH,EPOCH,iters=10,int(data_num/forepochinforiinstart,end=batch_size*i,batch_size*train_x,train_y=x_train[start:end],np.eye(10)[y_train[start:end]]sess.run(train_step,feed_dict={x:train_x,y_:train_y,keep_prob:0.5})test_loss,test_accuracy=sess.run([cross_entropy,accuracy],feed_dict={x:x_test,y_:np.eye(10)[y_test],keep_prob:1.0})print("epoch%d,TestLoss:%.10f,TestAccuracy:%.5f"%(epoch+1,֒→test),WARNING:tensorflow:FromWARNING:tensorflow:Froma.py:12:Thenametf.enable_eager_executionisdeprecated.Instructionsforupdating:Usetf.wherein2.0,whichhasthesamebroadcastruleasnp.whereepoch1,TestLoss:0.7170808105,TestAccuracy:0.95410epoch2,TestLoss:0.5037763672,TestAccuracy:epoch3,TestLoss:0.4459250977,TestAccuracy:epoch4,TestLoss:0.3748795898,TestAccuracy:epoch5,TestLoss:0.3611684570,TestAccuracy:epoch6,TestLoss:0.3054287842,TestAccuracy:epoch7,TestLoss:0.2697987305,TestAccuracy:.基于KERAS的CAMBRICONTENSORFLOWepoch8,TestLoss:0.2209449219,TestAccuracy:epoch9,TestLoss:0.2141630127,TestAccuracy:epoch10,TestLoss:0.2400469238,TestAccuracy:98%基于的确认CambriconTensorFlow更多安装信息,参见安装章节。导入TensorFlow、CNMIX##importosimporttensorflowas载入并准备好MNISTmnistmnist=tf.keras.datasets.mnist(x_train,y_train),(x_test,y_test)=mnist.load_data()x_train,x_test=x_train/255.0,x_test/255.0将模型各层堆叠以搭建tf.keras.Sequentialmodelmodel=model.add(tf.keras.layers.Flatten(input_shape=(28,28)))model.add(tf.keras.layers.Dense(128,activation='relu'))model.add(tf.keras.layers.Dense(10,activation='softmax'))基于CNMIXsessionconfigsession_configsession_config=cnmix.mixed_precision_graph_rewrite_config(batch_size,data_num,model.model.fit(x_train,y_train,epochs=5,model.evaluate(x_test,y_test,60000/60000[==============================]-7s118us/sample-loss:0.3359-acc:60000/60000[==============================]-7s117us/sample-loss:0.1624-acc:60000/60000[==============================]-6s93us/sample-loss:0.1224-acc:60000/60000[==============================]-6s98us/sample-loss:0.1002-acc:60000/60000[==============================]-6s96us/sample-loss:0.0858-acc:10000/10000-1s-loss:0.0768-acc:在网络训练中,网络代码模型常会基于CPU、GPU等设备进行构建。若要基于MLU设备训练网络,则在GPUwithwithtf.device("/GPU:0"):res=tf.add(1.,2.)在MLUwithwithtf.device("/MLU:0"):res=tf.add(1.,2.)配置CNMIX和session导入CNMIX模块,通过CNMIX设置ensorFlw执行GPU相关sessionconfigconfigconfig=执行MLU相关sessionconfigimportimport#CNMIXconfigdata_numbatch_sizeconfig=global_batch_size=global_batch_size,data_num=data_num,opt_level=devices=['/device:MLU:'devices=['/device:MLU:'+str(mlu_id)formlu_idinrange(num_mlus)]distribution=tf.distribute.MirroredStrategy(devices=devices,CambriconTensorFlow只支持KerasAPI的MirroredStrategyHorovod#GPU#GPUconfig.gpu_options.visible_device_list=#config.mlu_options.visible_device_list=1166增加自定义MLU本章节以添加均方误差(Mean‑SquareError,MSE)算子为例,说明如何在框架内完整添加一个自定义MLU注册MSE算子对应的OpDef在tensorflow/core/user_ops/mlu_special_ops.ccREGITER_OP的宏注册Mse子。.Input("a:.Input("b:.Output("output:.Attr("T:{half,在REGISTER_OP了MseShapeFnStatusStatusMseShapeFn(shape_inference::InferenceContext*c)ShapeHandleShapeHandleinput_b;ShapeHandleinput;std::vector<DimensionHandle>dims;for(inti=0;i<c->Rank(input)-1;i++){c->set_output(0,c-return(下页继续.增加自定义MLU添加完上面两个函数之后,REGISTER_OP宏就完成了MSE算子OpDef的定义。除此之外,该宏还自动在PythonAPI中添加了MSE注册MSE算子的OpKerneltensorflow/core/kernels/mlu_kernels文件夹下,创建新文件mse_op.cc。在该文件中,利用REGISTER_KERNEL_BUILDER定义了MSE算子的两个后端:DEVICE_CPU和DEVICE_MLU。使用该宏时,要保证Name中的字符串和第1节中REGISTER_OP中的算子名称一致。通过调用TF_CALL_MLU_FLOAT_TYPES,向REGISTER_MLU分别传入half和floatmse_op.cc文件中的代码如下(完整代码:#include#includeclassMseOp:publicOpKernel{explicitMseOp(OpKernelConstruction*context):OpKernel(context)voidCompute(OpKernelContext*ctx)overrideclassMLUMseOp:publicOpKernelexplicitMLUMseOp(OpKernelConstruction*ctx):OpKernel(ctx)voidCompute(OpKernelContext*ctx)overrideif(!ctx->ValidateInputsAreSameShape(this))return;autoinput=ctx->input(0);Tensor*output=nullptr;TensorShapefor(inti=0;i<input.dims()-1;i++){ctx->allocate_output(0,output_shape,&output));OP_REQUIRES_OK(ctx,ComputeInternal(ctx));StatusComputeInternal(OpKernelContext*ctx)autoinput_a=ctx->input(0);autoinput_b=ctx->input(1);intline_width=input_a.dim_size(input_a.dims()-1);cnrtQueue_tqueueCHECK_NOTNULL(reinterpret_cast<cnrtQueue*>(ctx----returnMseOp<CPUDevice,float>);MseOp<CPUDevice,Eigen::half>);#define #undef}//namespace在MseOp的实现中,实现了一个简易的CPU版MSE算子。在MLUMseOp的ComputeInternal函数中,准备了MseKernel函数的入参,后调用CustomedOps中定义的MseKernel函数,从而调用BANGC版的MSE在CustomedOps中实现MseKernel所有自定义BANGC实现的kernel文件全部位于tensorflow/core/kernels/mlu_kernels/customed_ops目录。为了添加MseKernel函数,需要添加新文件mse_kernel.mlu,并修改两个文件bangc_kernels.h和BUILD。在mse_kernel.mlu文件中,利用BANGC编写MSE算子相关的计算逻辑,并封装一个MseKernelbangc_kernels.h文件声明了所有的BANGC:#define#include<stdint.h>#include"cnrt.h"namespacemlustaticvoidMishKernel(cnrtQueue_tvoid*input,void*output,intinput_size,intdata_type,intstaticvoidMseKernel(cnrtQueue_tvoid*input_a,void*input_b,void*output,intdata_nums,intline_width,int}//namespace#endif//mse_kernel.mlu文件如下(完整代码):#include"bangc_kernels.h"#defineBLOCK_SIZE12800#defineALIGN_UP(a,b)(((a)+(b)-1)/(b)*mlu_funcvoidmseKernelInter(TT*input_b,T*output,intintline_width)mlu_entryvoidvoid*input_a,void*input_b,void*output,intdata_nums,intline_width,intdata_type)if(data_type==6)mseKernelInter((float*)input_a,(float*)input_b,(float*)output,data_nums,}elseif(data_type==3)mseKernelInter((half*)input_a,(half*)input_b,(half*)output,data_nums,void*input_a,void*input_b,void*output,intdata_nums,intline_width,intdata_type)cnrtDim3_tdim={4,1,
cnrtFunctionType_tfunc_type=mseKernel<<<dim,func_type,关于BUILD文件的修改,参见修改BUILD文件为了测试新增算子的功能和精度,需要同时添加算子的单测文件。参考本章节添加算子后,在PythonAPIC++API中都能直接调用该算子。因此,需添加两个算子单测文件:tensorflow/core/kernels/mlu_kernels/mse_op_mlu_test.cc和tensorflow/python/kernel_tests/mlu_kernel_tests/mse_op_test.py。在C++API和PythonAPI中,可以分别通过调用Mse和tensorflow.mse接口来调用该算子。修改BUILD在添加新算子过程中,只需要修改tensorflow/core/kernels/mlu_kernels/BUILD该文件主要完成以下内容:tf_kernel_librarymse_op.cc、mse_op_mlu.hmse_kernel编译成新的tar‑get:mse_op。该target同样可以被其他target利用tf_cc_test_mlu函数,将mse_op_mlu_test.cc单测文件编译成一个binarymlu_core_kernelsmse_opTensorFlow在生成mlu_core_kernels目标函数的deps域中,添加一行":mse_op"以下为该文件的代码示例:name=srcs=["mse_op.cc"],hdrs=["mse_op_mlu.h"],deps=["@local_config_mlu//:mlu",size="medium",(下页继续srcs=linkstatic=1,deps=[#Publicsupportname="mlu_core_kernels",deps=[...//77本章主要讲述CambriconTensorFlowMLU中。内存越界的bug(出现的时机和出错的现象都是随机的,很难定位。别插入header和footer,在deallocate时拷回到host端检查之前插入的header和master遇到日志中有[cnrtError]、mluunfinished这些关键字时,优先打开内存越界检查:exportTF_MLU_DEBUG_MEMORY_OVERSTEP=truecoredump中有Footermaskhasbeenoverwritten或者Headermaskhasbeenoverwritten,说明存在内存debugTen‑sorFlow(./build_tensorflow_mlu.sh‑g),后使能内存申请调用栈记录.MLU以自定义的Overstep算子为例。在OverstepCompute函数中模拟了内存越界的行为(直接往output拷贝一组大于output.NumElements()。假设网络中调用了Oversteplog20212021-01-1810:50:48.701641:[cnrtError][186985][Card:0]Erroroccurredin2021-01-1810:50:48.701678:[cnrtError][186985][Card:0]Returnvalueis230,֒→CHECKfailed.Function:MLUCnrtMemcpyAsync@line:221returnedcode632046:Unknownerror.֒→errordetected,forceterminating...Aborted(coredumped)log[cnrtError]exportTF_MLU_DEBUG_MEMORY_OVERSTEP=true打开内存泄漏检20212021-01-1811:15:05.364044:E֒→cc:141][230845]i=0mask=0xcdcdcdcdcdcdcdcd2021-01-1811:15:05.364053:E֒→cc:141][230845]i=1mask=0xcdcdcdcdcdcdcdcd2021-01-1811:15:05.364059:E֒→cc:229][230845]Footermaskhasbeenoverwritten,ptr=2021-01-1811:15:05.364067:E֒→cc:235][230845]wasallocated2021-01-1811:15:05.364238:I֒→cc:101][230845]call可以看出,新生成的logFootermaskhasbeenoverwritten֒→python2.7/site-:tensorflow::MLUDebugAllocator::AllocateRaw(unsignedlong,unsigned:tensorflow::Allocator::AllocateRaw(unsignedlong,unsigned֒→tensorflow::AllocationAttributes(下页继续.MLU:float*tensorflow::TypedAllocator::Allocate<float>(tensorflow::Allocator*,unsigned֒→tensorflow::AllocationAttributes֒→python2.7/site-:tensorflow::Tensor::Tensor(tensorflow::Allocator*,֒→tensorflow::TensorShapeconst&,tensorflow::AllocationAttributes:֒→tensorflow::AllocationAttributes::tensorflow::OpKernelContext::allocate_output(int,tensorflow::TensorShape֒→tensorflow::Tensor**,:tensorflow::OpKernelContext::allocate_output(int,tensorflow::TensorShape::tensorflow::BaseMLUDevice::Compute(tensorflow::OpKernel*,֒→python2.7/site-֒→python2.7/site-֒→python2.7/site-:std::function<void()>::operator()()::Eigen::ThreadPoolTempl<tensorflow::thread::EigenEnvironment>::ThreadPoolTempl(int,֒→tensorflow::thread::EigenEnvironment)::{lambda()#1}::operator()():std::_Function_handler<void(),֒→<tensorflow::thread::EigenEnvironment>::ThreadPoolTempl(int,֒→tensorflow::thread::EigenEnvironment)::{lambda()#1}>::_M_invoke(std::_Any_data:std::function<void()>::operator()():tensorflow::thread::EigenEnvironment::CreateThread(std::function<void֒→::operator()():std::_Function_handler<void֒→tensorflow::thread::EigenEnvironment::CreateThread(std::function<void֒→M_invoke(std::_Any_data .TENSORDUMP:std::function<void()>::operator()():voidstd::_Bind_simple<std::function<void()>:std::_Bind_simple<std::function<void()>:std::thread::_Impl<std::_Bind_simple<std::function<void()>()>:/lib/x86_64-linux-gnu/libpthread.so.0(+0x76ba):/lib/x86_64-linux-gnu/libc.so.6(clone+0x6d)可以看到,[10]中出现OverstepOp的Compute,说明OverstepOp的Compute中存在内存越界。tensordump通过设置环境变量将网络中各节点输出tensordumpexportexportexport //运行结束后网络中间节点的输出tensor会被dump到dump_dir文件夹。以上方法可将device为CPU和MLU的节点输出全部dump到指定文件夹。dump出来的文件命名规则为${node_name}_output_${output_port}_${execution_order}。例如,node_name:节点名称。此例中为resnet50.conv_1.conv2d。原本名称应为“/output_port:此文件是这个node0execution_order:此tensor被dump出来的顺序,该顺序与node10最好只进行一次推理,比如只运行一个batch使用tensordump在进行dump之前,需要清空dump_dircdcd--truth_value_dir=/path/to/truth_value_dump_dir--test_value_dir=/path/to/test_value_dump_dir5%两个输入文件夹中的数据是使用tensordump功能dump出来的。误差计算工具会根据命名规则进两个输入文件夹中的数据不是使用ensordump功能dump出来的,但对应文件的名称完全一致。误差计算工具会根据文件的读取顺序计算误差输出报告。文件内容的格式必须是每行只含有一个数字。output_right.txt:只包含误差小于等于‑‑thresholdoutput_abnormal:包含由于某些异常导致无法计算误差的文件的报告。异常包括含有nan值、含有inf值、两个文件中数据量不同、无法解析文件中的数据(比如乱码)等。truth_value_file:import.Preprocessor.mul_output_0_1503test_value_file:import.Preprocessor.mul_output_0_1507tensor_name:import/Preprocessor/mul:0iteration:error_rate:mse:is_same_size:truth_value_file:命令中‑‑truth_value_dirtest_value_file:命令中‑‑test_value_dirtensor_name:网络中的tensor名称。iteration:该tensordump出来。在一次推理中如果一个tensordump出来,则说error_rate:相对误差,命令中‑‑thresholdmse:truth_value_file:import.Preprocessor.mul_output_0_1503tensor_name:import/Preprocessor/mul:0iteration:1error_rate:Nonemse:Noneis_same_size:False当两个文件中的数据量不同时,则不进行误差计算,并把报告写入到output_abnormal.txt原因为is_same_size为False。文件中包含nan或者truth_value_file:(下页继续test_value_file:iteration:1error_rate:Nonemse:Noneis_same_size:Truehasnan/-nan:truth_value_file:test_value_file:hasinf/-inf:test_value_file:Truen
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 微纳换热器性能评价方法-洞察分析
- 施工环保措施
- 高管人员协议书范文
- 特殊儿童个别化教育计划
- 湘教版八年级下册地理个人教学计划
- 部编小学道德与法治四年级上册教学工作计划
- 医院防盗网安装施工方案
- 内外墙涂料装饰工程施工合同
- 洗车店转让协议书范本
- 城市水资源配置与管理实施方案
- 小说与散文的区别课件
- 心理健康与职业生涯(第一章)课件
- DB-T 29-202-2022 天津市建筑基坑工程技术规程
- 粤教版三年级劳动与技术全册教案教学设计
- 越努力越幸运商务红色工作汇报PPT模板
- (完整版)外科学名词解释【完整版】
- 永磁同步电机控制系统设计与仿真毕业论文
- 传感器与检测技术课后习题和答案(陈杰)
- 藏历新年ppt模版课件
- 基于PLC的自动门控制系统
- 沪教牛津版小学四年英语上册全册教案
评论
0/150
提交评论