跳转至

TensorFlow示例*

这里提供个TensorFlow示例,通过下面的连接下载源码

1. 生成 NPU 文件*

1.1 编写推理模型*

一般来说,推理模型和训练模型略有差异。推理模型中会去掉只在训练中需要用到的运算,如Dropout,并加载训练时产生的 CKPT 文件,最终生成推理模型的 PB 文件。

具体见下面代码。

    self.inputs=tf.placeholder(tf.float32,[1,1,256,1],name='Feats') # 指定输入 feats 名字
    self.state_in = tf.placeholder(tf.float32,[1, 64],name="State_c0") # 指定输入 state0 名字

    ...

    self.net_output , self.state = eval_network(self.inputs,self.state_in)
    self.predProb = tf.reshape(self.net_output,[1],name='probOut')
    self.state_out = tf.identity(self.state, name="State_c0_out") # 指定输出 state0 名字

    ...

    with tf.Session(config=config) as sess:
        sess.run(tf.global_variables_initializer())

        saver=tf.train.Saver(tf.global_variables(),max_to_keep=100)

        ckpt = './ckpt_dir/tfMask-8000'
        saver.restore(sess,ckpt) # 加载训练时生成的 CKPT 文件

        ...

        with tf.gfile.FastGFile('./model.pb', mode='wb') as f:
            f.write(constant_graph.SerializeToString())#  生成推理模型的 PB 文件

1.2 生成 PB 文件*

可参考生成PB文件把CKPT和PB文件合并成FROZEN_PB文件

1.3 编辑 NPU 配置文件*

编辑配置文件config.yaml文件

config.yaml
CORENAME: LEO
PB_FILE: ./model.pb
OUTPUT_FILE: model.c
SECURE: false # true/false
NPU_UNIT: NPU32 # NPU16/NPU32/NPU64
COMPRESS: true # true/false
COMPRESS_QUANT_BITS: 8
COMPRESS_TYPE: LINEAR
OUTPUT_TYPE: c_code # c_code/raw
#DEBUG_INFO_ENABLE: false # true/false
CONV2D_COMPRESS: true # true/false

INPUT_OPS:
    Feats: [1, 1, 256, 1]
    State_c0: [1, 64]

OUTPUT_OPS: [ model/State_c0_out,model/probOut]
FP16_OUT_OPS: [model/State_c0_out,]
#FUSE_BN: true
DUMP_OPS_TIME: false

注意

这里的 Feats,State_c0,State_c0_out,probOut 跟模型的输入、输出的 op 名字是一一对应的。

注意

配置项OUTPUT_OPS中,状态输出结点需要放在模型实际输出结点前面。

1.4 编译*

使用 gxnpuc 工具编译

$ gxnpuc config.yaml
生成 NPU 文件model.c,并且打印出模型需要的内存信息:

------------------------
Memory allocation info:
Mem0(ops): 6148
Mem1(data): 16312
Mem2(instruction): 181536
Mem3(in): 640
Mem4(out): 130
Mem5(tmp content): 9216
Total Memory Size: 213982
------------------------
Compile OK.