14. Deep Learning用 固定少数点数対応/Quantization(量子化)
14
①Dynamic Precision Data Quantization
レイヤーによって精度を変える。
integer part fractional part
③対数
②Gain and Offset
④Weight Sharingとのあわせ技
→Deep Compression
Qualcomm Research
Google TPU
0の位(Q)
https://arxiv.org/pdf/1511.06393.pdf
https://arxiv.org/abs/1510.00149
33. ONNXとは
33
Open Neural Network Exchangeは、各フレームワーク間でNNと重みを表現する統一フォ
ーマット
FPGA用ソースへ
変換する。
The graph serves as an
Intermediate Representation (IR)
that captures the specific intent of
the developer's source code, and
is conducive for optimization and
translation to run on specific
devices (CPU, GPU, FPGA, etc.).
Overview
35. ONNXの使い方
35
import onnx
onnx_file = 'squeezenet.onnx'
model = onnx.ModelProto()
with open(onnx_file, 'rb') as fp:
content = fp.read()
model.ParseFromString(content)
for op_id, op in enumerate(model.graph.node):
print(op_id, " ", op)
for input in model.graph.input:
print(input)
for initializer in model.graph.initializer:
if initializer.name == "2":
print(initializer)
data = initializer.raw_data
print(len(data))
36. ONNXの使い方
36
import onnx
onnx_file = 'squeezenet.onnx'
model = onnx.ModelProto()
with open(onnx_file, 'rb') as fp:
content = fp.read()
model.ParseFromString(content)
for op_id, op in enumerate(model.graph.node):
print(op_id, " ", op)
for input in model.graph.input:
print(input)
for initializer in model.graph.initializer:
if initializer.name == "2":
print(initializer)
data = initializer.raw_data
print(len(data))
・model を定義する。
・onnxファイルを読み込む。
・ParseFromString()を呼び出す
onnxファイルの作り方は省略
37. ONNXの使い方
37
import onnx
onnx_file = 'squeezenet.onnx'
model = onnx.ModelProto()
with open(onnx_file, 'rb') as fp:
content = fp.read()
model.ParseFromString(content)
for op_id, op in enumerate(model.graph.node):
print(op_id, " ", op)
for input in model.graph.input:
print(input)
for initializer in model.graph.initializer:
if initializer.name == "2":
print(initializer)
data = initializer.raw_data
print(len(data))
model.graph.nodeでnodeの情
報を取得できる。
0 input: "1"
input: "2"
output: "55"
op_type: "Conv"
attribute {
name: "kernel_shape"
ints: 3
ints: 3
type: INTS
}
attribute {
name: "strides"
ints: 2
ints: 2
type: INTS
}
38. ONNXの使い方
38
import onnx
onnx_file = 'squeezenet.onnx'
model = onnx.ModelProto()
with open(onnx_file, 'rb') as fp:
content = fp.read()
model.ParseFromString(content)
for op_id, op in enumerate(model.graph.node):
print(op_id, " ", op)
for input in model.graph.input:
print(input)
for initializer in model.graph.initializer:
if initializer.name == "2":
print(initializer)
data = initializer.raw_data
print(len(data))
model.graph.inputでnodeの入
力の情報を取得できる。
name: "1"
type {
tensor_type {
elem_type: FLOAT
shape {
dim { dim_value: 1 }
dim { dim_value: 3 }
dim { dim_value: 224 }
dim { dim_value: 224 }
}
}
}
}
39. ONNXの使い方
39
import onnx
onnx_file = 'squeezenet.onnx'
model = onnx.ModelProto()
with open(onnx_file, 'rb') as fp:
content = fp.read()
model.ParseFromString(content)
for op_id, op in enumerate(model.graph.node):
print(op_id, " ", op)
for input in model.graph.input:
print(input)
for initializer in model.graph.initializer:
if initializer.name == "2":
print(initializer)
data = initializer.raw_data
print(len(data))
model.graph. initializerで
重みの情報を取得できる。
dims: 64
dims: 3
dims: 3
dims: 3
data_type: FLOAT
name: "2"
raw_data: “322261・・・
6912
3 * 3 * 3 * 64 * sizeof(float) = 6192