PyConChina2022-杭州-ARM芯片的Python+AI算力优化-朱宏林
192 ≈ 5700万) • GEMM 通过优化内存局部性和向量指令,比朴素实现快 10 倍以上 GEMM • 优化 GEMM • 内存布局:矩阵分块;重排 • 向量化指令:AVX、NEON V0 V1 ✕ ✕ ✕ ✕ V2 GEMM 例子 • 优化 GEMM • 内存布局:矩阵分块;重排 • 向量化指令:AVX、NEON 原始算法 展开4x1 向量化 GEMM 例子 例子 • 优化 GEMM • 内存布局:矩阵分块;重排 • 向量化指令:AVX、NEON 原始算法 展开4x1 向量化 GEMM • 优化 GEMM • 内存布局:矩阵分块;重排 • 向量化指令:AVX、NEON • 硬件加速 • Nvidia Volta 架构引入 tensor core • Intel AMX, Advanced Matrix Extension • ARM • 特点 • 表示范围和 FP32 一致 • 转换便利 • 节省存储空间 • 硬件指令支持 ARMv8.6 bf16 扩展 • bf16 扩展 • ARMv8.6 • 矩阵乘法指令 BFMMLA • 类型转换指令 BFCVT • BFMMLA • 128 bit 向量寄存器 • 单指令完成 (2x4) * (4x2) • 16 mul + 16 add 深度学习推理加速0 码力 | 24 页 | 4.00 MB | 1 年前3PyWebIO v1.2.3 使用手册
{} } 各字段含义如下: command 字段表示指令名 task_id 字段表示发送指令的Task id,客户端对于此命令的响应事件 都会传递 task_id spec 字段为指令的参数,不同指令参数不同 需要注意,以下不同命令的参数和 PyWebIO 的对应函数的参数大部分含义一 致,但是也有些许不同。 以下分别对不同指令的 spec 字段进行说明: input_group 显示一个输入表单 由执行单元发送到会话的命 令都会立即发送到后端,并由后端通过WebSocket连接通知用户浏览器。 实现 后端与Session的交互 后端框架负责从Session会话中获取来自PyWebIO的指令,并发送给用户浏览 器;同时后端框架接收用户提交的数据,并发送给相应的会话实例。 Session暴露给后端框架的方法仅有 Session.send_client_event 、 Session.get_task_commands 回给前端,后续前端的请求都会在请求头中使用 webio-session-id 字段传递会 话ID。 前端产生的事件使用POST请求发送给后端。对于前端的每次轮训和事件提交请 求,后端都会返回当前未执行的指令序列作为响应,前端收到响应后会依次执 行指令。 代码实现 以Flask后端为例,Flask后端与Session的交互都在Flask视图函数中实现,视图函 数通过调用 pywebio.platform.flask.webio_view0 码力 | 119 页 | 7.44 MB | 1 年前3PyWebIO v1.2.2 使用手册
{} } 各字段含义如下: command 字段表示指令名 task_id 字段表示发送指令的Task id,客户端对于此命令的响应事件 都会传递 task_id spec 字段为指令的参数,不同指令参数不同 需要注意,以下不同命令的参数和 PyWebIO 的对应函数的参数大部分含义一 致,但是也有些许不同。 以下分别对不同指令的 spec 字段进行说明: input_group 显示一个输入表单 由执行单元发送到会话的命 令都会立即发送到后端,并由后端通过WebSocket连接通知用户浏览器。 实现 后端与Session的交互 后端框架负责从Session会话中获取来自PyWebIO的指令,并发送给用户浏览 器;同时后端框架接收用户提交的数据,并发送给相应的会话实例。 Session暴露给后端框架的方法仅有 Session.send_client_event 、 Session.get_task_commands 回给前端,后续前端的请求都会在请求头中使用 webio-session-id 字段传递会 话ID。 前端产生的事件使用POST请求发送给后端。对于前端的每次轮训和事件提交请 求,后端都会返回当前未执行的指令序列作为响应,前端收到响应后会依次执 行指令。 代码实现 以Flask后端为例,Flask后端与Session的交互都在Flask视图函数中实现,视图函 数通过调用 pywebio.platform.flask.webio_view0 码力 | 119 页 | 7.41 MB | 1 年前3PyWebIO v1.1.0 使用手册
{} } 各字段含义如下: command 字段表示指令名 task_id 字段表示发送指令的Task id,客户端对于此命令的响应事件 都会传递 task_id spec 字段为指令的参数,不同指令参数不同 需要注意,以下不同命令的参数和 PyWebIO 的对应函数的参数大部分含义一 致,但是也有些许不同。 以下分别对不同指令的 spec 字段进行说明: input_group 显示一个输入表单 由执行单元发送到会话的命 令都会立即发送到后端,并由后端通过WebSocket连接通知用户浏览器。 实现 后端与Session的交互 后端框架负责从Session会话中获取来自PyWebIO的指令,并发送给用户浏览 器;同时后端框架接收用户提交的数据,并发送给相应的会话实例。 Session暴露给后端框架的方法仅有 Session.send_client_event 、 Session.get_task_commands 回给前端,后续前端的请求都会在请求头中使用 webio-session-id 字段传递会 话ID。 前端产生的事件使用POST请求发送给后端。对于前端的每次轮训和事件提交请 求,后端都会返回当前未执行的指令序列作为响应,前端收到响应后会依次执 行指令。 代码实现 以Flask后端为例,Flask后端与Session的交互都在Flask视图函数中实现,视图函 数通过调用 pywebio.platform.flask.webio_view0 码力 | 119 页 | 7.41 MB | 1 年前33 Thautwarm 解放python的表达力 性能和安全性 语法和语义扩展 JIT 静态检查
我个人不能接受编译好的程序在运行时还要求源代码存在。 同时有一个叫bytecode的库,解决了一些使用字节码的难题。 字节码长相如何? 演示 先把Python字节码翻译到一个精简版本, 便于分析 指令集这么大时准备追x86汇编了? 指令集减小到15以内 混合IR tmp = Call(x, (1, 2)) Python字节码 LOAD_FAST f LOAD_CONST (1, 2) CALL_FUNCTION “放到栈上两个值,做了一个二元运算,两个值被消耗, 得到一个值放回栈上, 栈上元素减1”。 寄存器机就是赋值赋值赋值赋值,我赋给你,你赋给他, push pop不占主导地位。可以模拟栈机。 栈机的Jump指令,导致翻译到寄存器语义不简单呐。 为何不最直接翻译成寄存器语义? Push a Push b Push c A: Jump B if true Push d B: Pop to e Python大量jump指令要怎么办啊? 没问题,程序分析来帮你 左边这是在模拟跳转。 会编译成switch, 还比 较高效。但依赖控制 流的分析。 几个Pass的效果 演示。 For循环就是一个需要 控制流分析的例子, 它跨BasicBlock使用了栈元素。 什么是BasicBlock: 由label为始,terminate指令 为末的最小连续指令。 什么是terminate指令: Return0 码力 | 43 页 | 10.71 MB | 1 年前3PyWebIO v1.3.1 使用手册
{} } 各字段含义如下: command 字段表示指令名 task_id 字段表示发送指令的Task id,客户端对于此命令的响应事件 都会传递 task_id spec 字段为指令的参数,不同指令参数不同 需要注意,以下不同命令的参数和 PyWebIO 的对应函数的参数大部分含义一 致,但是也有些许不同。 以下分别对不同指令的 spec 字段进行说明: input_group 显示一个输入表单 由执行单元发送到会话的命 令都会立即发送到后端,并由后端通过WebSocket连接通知用户浏览器。 实现 后端与Session的交互 后端框架负责从Session会话中获取来自PyWebIO的指令,并发送给用户浏览 器;同时后端框架接收用户提交的数据,并发送给相应的会话实例。 Session暴露给后端框架的方法仅有 Session.send_client_event 、 Session.get_task_commands 回给前端,后续前端的请求都会在请求头中使用 webio-session-id 字段传递会 话ID。 前端产生的事件使用POST请求发送给后端。对于前端的每次轮训和事件提交请 求,后端都会返回当前未执行的指令序列作为响应,前端收到响应后会依次执 行指令。 代码实现 以Flask后端为例,Flask后端与Session的交互都在Flask视图函数中实现,视图函 数通过调用 pywebio.platform.flask.webio_view0 码力 | 132 页 | 7.45 MB | 1 年前3PyWebIO v1.3.3 使用手册
{} } 各字段含义如下: command 字段表示指令名 task_id 字段表示发送指令的Task id,客户端对于此命令的响应事件 都会传递 task_id spec 字段为指令的参数,不同指令参数不同 需要注意,以下不同命令的参数和 PyWebIO 的对应函数的参数大部分含义一 致,但是也有些许不同。 以下分别对不同指令的 spec 字段进行说明: input_group 显示一个输入表单 由执行单元发送到会话的命 令都会立即发送到后端,并由后端通过WebSocket连接通知用户浏览器。 实现 后端与Session的交互 后端框架负责从Session会话中获取来自PyWebIO的指令,并发送给用户浏览 器;同时后端框架接收用户提交的数据,并发送给相应的会话实例。 Session暴露给后端框架的方法仅有 Session.send_client_event 、 Session.get_task_commands 回给前端,后续前端的请求都会在请求头中使用 webio-session-id 字段传递会 话ID。 前端产生的事件使用POST请求发送给后端。对于前端的每次轮训和事件提交请 求,后端都会返回当前未执行的指令序列作为响应,前端收到响应后会依次执 行指令。 代码实现 以Flask后端为例,Flask后端与Session的交互都在Flask视图函数中实现,视图函 数通过调用 pywebio.platform.flask.webio_view0 码力 | 132 页 | 7.45 MB | 1 年前3PyWebIO v1.4.0 使用手册
{} } 各字段含义如下: command 字段表示指令名 task_id 字段表示发送指令的Task id,客户端对于此命令的响应事件 都会传递 task_id spec 字段为指令的参数,不同指令参数不同 需要注意,以下不同命令的参数和 PyWebIO 的对应函数的参数大部分含义一 致,但是也有些许不同。 以下分别对不同指令的 spec 字段进行说明: input_group 显示一个输入表单 由执行单元发送到会话的命 令都会立即发送到后端,并由后端通过WebSocket连接通知用户浏览器。 实现 后端与Session的交互 后端框架负责从Session会话中获取来自PyWebIO的指令,并发送给用户浏览 器;同时后端框架接收用户提交的数据,并发送给相应的会话实例。 Session暴露给后端框架的方法仅有 Session.send_client_event 、 Session.get_task_commands 回给前端,后续前端的请求都会在请求头中使用 webio-session-id 字段传递会 话ID。 前端产生的事件使用POST请求发送给后端。对于前端的每次轮训和事件提交请 求,后端都会返回当前未执行的指令序列作为响应,前端收到响应后会依次执 行指令。 代码实现 以Flask后端为例,Flask后端与Session的交互都在Flask视图函数中实现,视图函 数通过调用 pywebio.platform.flask.webio_view0 码力 | 135 页 | 7.45 MB | 1 年前3PyWebIO v1.3.0 使用手册
{} } 各字段含义如下: command 字段表示指令名 task_id 字段表示发送指令的Task id,客户端对于此命令的响应事件 都会传递 task_id spec 字段为指令的参数,不同指令参数不同 需要注意,以下不同命令的参数和 PyWebIO 的对应函数的参数大部分含义一 致,但是也有些许不同。 以下分别对不同指令的 spec 字段进行说明: input_group 显示一个输入表单 由执行单元发送到会话的命 令都会立即发送到后端,并由后端通过WebSocket连接通知用户浏览器。 实现 后端与Session的交互 后端框架负责从Session会话中获取来自PyWebIO的指令,并发送给用户浏览 器;同时后端框架接收用户提交的数据,并发送给相应的会话实例。 Session暴露给后端框架的方法仅有 Session.send_client_event 、 Session.get_task_commands 回给前端,后续前端的请求都会在请求头中使用 webio-session-id 字段传递会 话ID。 前端产生的事件使用POST请求发送给后端。对于前端的每次轮训和事件提交请 求,后端都会返回当前未执行的指令序列作为响应,前端收到响应后会依次执 行指令。 代码实现 以Flask后端为例,Flask后端与Session的交互都在Flask视图函数中实现,视图函 数通过调用 pywebio.platform.flask.webio_view0 码力 | 132 页 | 7.45 MB | 1 年前3PyWebIO v1.3.2 使用手册
{} } 各字段含义如下: command 字段表示指令名 task_id 字段表示发送指令的Task id,客户端对于此命令的响应事件 都会传递 task_id spec 字段为指令的参数,不同指令参数不同 需要注意,以下不同命令的参数和 PyWebIO 的对应函数的参数大部分含义一 致,但是也有些许不同。 以下分别对不同指令的 spec 字段进行说明: input_group 显示一个输入表单 由执行单元发送到会话的命 令都会立即发送到后端,并由后端通过WebSocket连接通知用户浏览器。 实现 后端与Session的交互 后端框架负责从Session会话中获取来自PyWebIO的指令,并发送给用户浏览 器;同时后端框架接收用户提交的数据,并发送给相应的会话实例。 Session暴露给后端框架的方法仅有 Session.send_client_event 、 Session.get_task_commands 回给前端,后续前端的请求都会在请求头中使用 webio-session-id 字段传递会 话ID。 前端产生的事件使用POST请求发送给后端。对于前端的每次轮训和事件提交请 求,后端都会返回当前未执行的指令序列作为响应,前端收到响应后会依次执 行指令。 代码实现 以Flask后端为例,Flask后端与Session的交互都在Flask视图函数中实现,视图函 数通过调用 pywebio.platform.flask.webio_view0 码力 | 132 页 | 7.45 MB | 1 年前3
共 102 条
- 1
- 2
- 3
- 4
- 5
- 6
- 11