2 使用Python训练和部署低精度模型 张校捷使用Python训练和部署低精度模型 (TensorFlow版) 张校捷 2019/9/21 目录 CONTENTS 低精度的概念和意义 TensorFlow的FP16模型 TensorRT的FP16/Int8模型 总结 1 低精度的概念和意义 实数的16-bit半精度浮点数和8-bit定点数表示 使用低精度的意义 深度学习模型中实数的表示 FP32: E8M23 FP16: FP16: E5M10 Int8 (TPU, tf.bfloat16) (tf.float32) (GPU, tf.float16) 低精度浮点数的优点 1.节约内存/显存的使用(FP16为原来的1/2,int8为原来的1/4) 2.特殊的硬件专门用于低精度浮点数的计算加速(TensorCore) Model Speedup BERT Q&A 3.3X speedup GNMT 1.7X FP16浮点数(E5M10)的表示范围 FP16模型的训练方法 Int8模型的推断过程 2 TensorFlow的FP16模型 实数的16-bit半精度浮点数和8-bit定点数表示 使用低精度的意义 TensorCores适用条件 1. 卷积:K(输入通道),C(输出通道) 2. 通用矩阵乘法(GEMM):MxK,KxN,(M,N,K) FP16: 大小为8x Int8: 大小为16x0 码力 | 24 页 | 981.45 KB | 1 年前3
Python 标准库参考指南 3.10.15 更正式的说法:zip() 返回元组的迭代器,其中第 i 个元组包含的是每个参数迭代器的第 i 个元素。 不妨换一种方式认识zip() :它会把行变成列,把列变成行。这类似于 矩阵转置 。 zip() 是延迟执行的:直至迭代时才会对元素进行处理,比如 for 循环或放入list 中。 值得考虑的是,传给zip() 的可迭代对象可能长度不同;有时是有意为之,有时是因为准备这些对象 的代码存在错误。Python (1) 这是个短路运算符,因此只有在第一个参数为假值时才会对第二个参数求值。 (2) 这是个短路运算符,因此只有在第一个参数为真值时才会对第二个参数求值。 (3) not 的优先级比非布尔运算符低,因此 not a == b 会被解读为 not (a == b) 而 a == not b 会 引发语法错误。 4.3 比较运算 在 Python 中有八种比较运算符。它们的优先级相同(比布尔运 range 对象所定义的值序列来进行比较(而不是根据对象的标识)。 3.3 新版功能: start, stop 和step 属性。 参见: • linspace recipe 演示了如何实现一个延迟求值版本的适合浮点数应用的 range 对象。 44 Chapter 4. 内置类型 The Python Library Reference, 发布 3.10.15 4.7 文本序列类型 ---0 码力 | 2207 页 | 10.45 MB | 9 月前3
Python 标准库参考指南 3.13 更正式的说法:zip() 返回元组的迭代器,其中第 i 个元组包含的是每个参数迭代器的第 i 个元素。 不妨换一种方式认识zip() :它会把行变成列,把列变成行。这类似于 矩阵转置 。 zip() 是延迟执行的:直至迭代时才会对元素进行处理,比如 for 循环或放入list 中。 值得考虑的是,传给zip() 的可迭代对象可能长度不同;有时是有意为之,有时是因为准备这些对 象的代码存在错误。Python (1) 这是个短路运算符,因此只有在第一个参数为假值时才会对第二个参数求值。 (2) 这是个短路运算符,因此只有在第一个参数为真值时才会对第二个参数求值。 (3) not 的优先级比非布尔运算符低,因此 not a == b 会被解读为 not (a == b) 而 a == not b 会 引发语法错误。 4.3 比较运算 在 Python 中有八种比较运算符。它们的优先级相同(比布尔运算的优先级高)。比较运算可以任意串连; 1): >>> dict[str, list[int]].__args__ (, list[int]) genericalias.__parameters__ 该属性是延迟计算出来的一个元组(可能为空),包含了 __args__ 中的类型变量。 >>> from typing import TypeVar >>> T = TypeVar('T') >>> list[T] 0 码力 | 2246 页 | 11.74 MB | 9 月前3
Python 标准库参考指南 3.13 更正式的说法:zip() 返回元组的迭代器,其中第 i 个元组包含的是每个参数迭代器的第 i 个元素。 不妨换一种方式认识zip() :它会把行变成列,把列变成行。这类似于 矩阵转置 。 zip() 是延迟执行的:直至迭代时才会对元素进行处理,比如 for 循环或放入list 中。 值得考虑的是,传给zip() 的可迭代对象可能长度不同;有时是有意为之,有时是因为准备这些对 象的代码存在错误。Python (1) 这是个短路运算符,因此只有在第一个参数为假值时才会对第二个参数求值。 (2) 这是个短路运算符,因此只有在第一个参数为真值时才会对第二个参数求值。 (3) not 的优先级比非布尔运算符低,因此 not a == b 会被解读为 not (a == b) 而 a == not b 会 引发语法错误。 4.3 比较运算 在 Python 中有八种比较运算符。它们的优先级相同(比布尔运算的优先级高)。比较运算可以任意串连; 1): >>> dict[str, list[int]].__args__ (, list[int]) genericalias.__parameters__ 该属性是延迟计算出来的一个元组(可能为空),包含了 __args__ 中的类型变量。 >>> from typing import TypeVar >>> T = TypeVar('T') >>> list[T] 0 码力 | 2242 页 | 11.73 MB | 9 月前3
Python 标准库参考指南 3.8.20 (1) 这是个短路运算符,因此只有在第一个参数为假值时才会对第二个参数求值。 (2) 这是个短路运算符,因此只有在第一个参数为真值时才会对第二个参数求值。 (3) not 的优先级比非布尔运算符低,因此 not a == b 会被解读为 not (a == b) 而 a == not b 会引发语法错误。 4.3 比较运算 在 Python 中有八种比较运算符。它们的优先级相同(比布尔运算的优先级高)。比较运算可以任意串连; range 对象所定义的值序列来进行比较(而不是根据对象的标识)。 3.3 新版功能: start, stop 和step 属性。 参见: • linspace recipe 演示了如何实现一个延迟求值版本的适合浮点数应用的 range 对象。 4.6. 序列类型 --- list, tuple, range 39 The Python Library Reference, 发布 3.8.20 正则表达式可以拼接;如果 A 和 B 都是正则表达式,则 AB 也是正则表达式。通常,如果字符串 p 匹配 A,并且另一个字符串 q 匹配 B,那么 pq 可以匹配 AB。除非 A 或者 B 包含低优先级操作,A 和 B 存在边 界条件;或者命名组引用。所以,复杂表达式可以很容易的从这里描述的简单源语表达式构建。更多正 则表达式理论和实现,详见 the Friedl book [Frie09] ,或者其他构建编译器的书籍。0 码力 | 1927 页 | 9.69 MB | 9 月前3
Python 标准库参考指南 3.8.20 (1) 这是个短路运算符,因此只有在第一个参数为假值时才会对第二个参数求值。 (2) 这是个短路运算符,因此只有在第一个参数为真值时才会对第二个参数求值。 (3) not 的优先级比非布尔运算符低,因此 not a == b 会被解读为 not (a == b) 而 a == not b 会引发语法错误。 4.3 比较运算 在 Python 中有八种比较运算符。它们的优先级相同(比布尔运算的优先级高)。比较运算可以任意串连; range 对象所定义的值序列来进行比较(而不是根据对象的标识)。 3.3 新版功能: start, stop 和step 属性。 参见: • linspace recipe 演示了如何实现一个延迟求值版本的适合浮点数应用的 range 对象。 4.6. 序列类型 --- list, tuple, range 39 The Python Library Reference, 发布 3.8.20 正则表达式可以拼接;如果 A 和 B 都是正则表达式,则 AB 也是正则表达式。通常,如果字符串 p 匹配 A,并且另一个字符串 q 匹配 B,那么 pq 可以匹配 AB。除非 A 或者 B 包含低优先级操作,A 和 B 存在边 界条件;或者命名组引用。所以,复杂表达式可以很容易的从这里描述的简单源语表达式构建。更多正 则表达式理论和实现,详见 the Friedl book [Frie09] ,或者其他构建编译器的书籍。0 码力 | 1927 页 | 9.69 MB | 9 月前3
Python 标准库参考指南 3.12 更正式的说法:zip() 返回元组的迭代器,其中第 i 个元组包含的是每个参数迭代器的第 i 个元素。 不妨换一种方式认识zip() :它会把行变成列,把列变成行。这类似于 矩阵转置 。 zip() 是延迟执行的:直至迭代时才会对元素进行处理,比如 for 循环或放入list 中。 27 The Python Library Reference, 发行版本 3.12.7 值得考虑的是,传给zip() (1) 这是个短路运算符,因此只有在第一个参数为假值时才会对第二个参数求值。 (2) 这是个短路运算符,因此只有在第一个参数为真值时才会对第二个参数求值。 (3) not 的优先级比非布尔运算符低,因此 not a == b 会被解读为 not (a == b) 而 a == not b 会 引发语法错误。 4.3 比较运算 在 Python 中有八种比较运算符。它们的优先级相同(比布尔运算的优先级高)。比较运算可以任意串连; 1): >>> dict[str, list[int]].__args__ (, list[int]) genericalias.__parameters__ 该属性是延迟计算出来的一个元组(可能为空),包含了 __args__ 中的类型变量。 >>> from typing import TypeVar >>> T = TypeVar('T') >>> list[T] 0 码力 | 2253 页 | 11.81 MB | 9 月前3
Python 标准库参考指南 3.12 更正式的说法:zip() 返回元组的迭代器,其中第 i 个元组包含的是每个参数迭代器的第 i 个元素。 不妨换一种方式认识zip() :它会把行变成列,把列变成行。这类似于 矩阵转置 。 zip() 是延迟执行的:直至迭代时才会对元素进行处理,比如 for 循环或放入list 中。 27 The Python Library Reference, 发行版本 3.12.7 值得考虑的是,传给zip() (1) 这是个短路运算符,因此只有在第一个参数为假值时才会对第二个参数求值。 (2) 这是个短路运算符,因此只有在第一个参数为真值时才会对第二个参数求值。 (3) not 的优先级比非布尔运算符低,因此 not a == b 会被解读为 not (a == b) 而 a == not b 会 引发语法错误。 4.3 比较运算 在 Python 中有八种比较运算符。它们的优先级相同(比布尔运算的优先级高)。比较运算可以任意串连; 1): >>> dict[str, list[int]].__args__ (, list[int]) genericalias.__parameters__ 该属性是延迟计算出来的一个元组(可能为空),包含了 __args__ 中的类型变量。 >>> from typing import TypeVar >>> T = TypeVar('T') >>> list[T] 0 码力 | 2253 页 | 11.81 MB | 9 月前3
Python 标准库参考指南 3.11.10 更正式的说法:zip() 返回元组的迭代器,其中第 i 个元组包含的是每个参数迭代器的第 i 个元素。 不妨换一种方式认识zip() :它会把行变成列,把列变成行。这类似于 矩阵转置 。 zip() 是延迟执行的:直至迭代时才会对元素进行处理,比如 for 循环或放入list 中。 值得考虑的是,传给zip() 的可迭代对象可能长度不同;有时是有意为之,有时是因为准备这些 对象的代码存在错误。Python (1) 这是个短路运算符,因此只有在第一个参数为假值时才会对第二个参数求值。 (2) 这是个短路运算符,因此只有在第一个参数为真值时才会对第二个参数求值。 (3) not 的优先级比非布尔运算符低,因此 not a == b 会被解读为 not (a == b) 而 a == not b 会引发语法错误。 4.3 比较运算 在 Python 中有八种比较运算符。它们的优先级相同(比布尔运算的优先级高)。比较运算可以任意串连; =’ 以根据 range 对象所定义的值序列来进行比较(而不是根据对象的标 识)。 增加了start, stop 和step 属性。 参见: • linspace recipe 演示了如何实现一个延迟求值版本的适合浮点数应用的 range 对象。 4.7 文本序列类型 --- str 在 Python 中处理文本数据是使用str 对象,也称为 字符串。字符串是由 Unicode 码位构成的不可变序0 码力 | 2248 页 | 11.10 MB | 9 月前3
Python 标准库参考指南 3.8.20 (1) 这是个短路运算符,因此只有在第一个参数为假值时才会对第二个参数求值。 (2) 这是个短路运算符,因此只有在第一个参数为真值时才会对第二个参数求值。 (3) not 的优先级比非布尔运算符低,因此 not a == b 会被解读为 not (a == b) 而 a == not b 会 引发语法错误。 4.3 比较运算 在 Python 中有八种比较运算符。它们的优先级相同(比布尔运 range 对象所定义的值序列来进行比较(而不是根据对象的标识)。 3.3 新版功能: start, stop 和step 属性。 参见: • linspace recipe 演示了如何实现一个延迟求值版本的适合浮点数应用的 range 对象。 4.7 文本序列类型 --- str 在 Python 中处理文本数据是使用str 对象,也称为 字符串。字符串是由 Unicode 码位构成的不可变序列。字 正则表达式可以拼接;如果 A 和 B 都是正则表达式,则 AB 也是正则表达式。通常,如果字符串 p 匹配 A, 并且另一个字符串 q 匹配 B,那么 pq 可以匹配 AB。除非 A 或者 B 包含低优先级操作,A 和 B 存在边界条件; 或者命名组引用。所以,复杂表达式可以很容易的从这里描述的简单源语表达式构建。更多正则表达式理论 和实现,详见 the Friedl book [Frie09] ,或者其他构建编译器的书籍。0 码力 | 2052 页 | 9.74 MB | 9 月前3
共 58 条
- 1
- 2
- 3
- 4
- 5
- 6













