From 644588ac3a84f98901a29222bcb8f68473668286 Mon Sep 17 00:00:00 2001 From: ShawnXuan Date: Sun, 16 Apr 2023 22:36:27 +0800 Subject: [PATCH 1/4] update --- README.md | 74 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 73 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 09dd3a1..9935519 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# faster-chatglm-6b +# faster-chatglm-6b readme `faster-chatglm-6b` 是一个使用 [OneFlow](https://github.com/Oneflow-Inc/oneflow) 深度学习框架为后端加速[THUDM/chatglm-6b](https://huggingface.co/THUDM/chatglm-6b)运行的项目。 @@ -17,10 +17,13 @@ python3 -m pip install --pre oneflow -f https://staging.oneflow.info/branch/mast ## 安装方式 下载或 clone 本项目后,在项目目录中运行: + ```shell python3 -m pip install -e . ``` + 或 + ```shell python3 -m pip install git+https://github.com/Oneflow-Inc/faster-chatglm-6b.git ``` @@ -58,6 +61,75 @@ examples/ └── web_demo.py # 网页版对话演示 ``` +## 原理分析 + +在前面的演示中,我们提到,通过增加了一行 `import faster_chatglm_6b`,就可以把ChatGLM运行的后台切换成 OneFlow,具体来说这一行代码: + +1. 设置了 OneFlow 的一些环境变量,用于控制 OneFlow 框架的行为。 +2. 使用 OneFlow 的 `mock_torch` 方法把所有的 PyTorch 模块替换成对应的 OneFlow 模块。 +3. 利用 transformers 模块的动态模块工具,把找到的原 ChatGLM-6B 中的 `ChatGLMForConditionalGeneration` 模块替换成经过 OneFlow 优化的 `ChatGLMForConditionalGeneration` 模块。 + +详细行为,请参考 `faster_chatglm_6b/__init__.py`。 + +另外我们对ChatGLM骨干网的一些模块进行了优化,这些模块包括: + +- fast_gelu + +我们采用`fast_gelu`替换了`gelu_impl`的实现。 + +- fused_apply_rotary_emb + +ChatGLM中,每一个GLMBlock层的SelfAttention模块,都需要对张量query_layer, key_layer进行旋转位置嵌入操作(Rotary Position Embedding),该操作根据当前位置和不同频率的偏移量将位置计算为一个矢量,然后将这个矢量应用于一个矩阵,该矩阵表示为由一组一个复数角度对组成的旋转矩阵。我们采用`fused_apply_rotary_emb`将上述运算放到一个kernel中完成。 + +- fused_attention_concat_past_key_value + +我们将attention function中key和value与过去信息拼接的过程融合到一个`fused_attention_concat_past_key_value`中进行一次计算。 + +- fused_multi_head_attention_inference_v2 + +我们将多头注意力计算融合到`fused_multi_head_attention_inference_v2`中,包括了计算出每个query vector对应所有key vectors的注意力分数;对注意力分数进行缩放,使用softmax函数将其转换为注意力权重;使用注意力权重对所有value vectors进行加权求和等操作。 + +- fused_fast_gelu_mul + +我们将`x1 * F.gelu(x2)`的操作融合成`fused_fast_gelu_mul`算子 + +- fused_matmul_bias + +我们使用`fused_matmul_bias`将`4h_to_h`的操作和第二个残差连接操作融合起来计算。 + +## 测试结果 + +我们对优化后的效果进行了定量的测试,测试脚本请参考:examples/benchmark.py。 + +测试在NVIDIA A100 40G中进行,一共测试了4组参数,每组参数都运行了5次,测试结果如下: + +| Backend | Quantization | Duration(s) | average | +| ------- | ------------ | ----------- | -------- | +| OneFlow | Disable | 30.58 | 1.53s/it | +| OneFlow | Disable | 30.96 | 1.55s/it | +| OneFlow | Disable | 30.52 | 1.53s/it | +| OneFlow | Disable | 31.13 | 1.56s/it | +| OneFlow | Disable | 30.71 | 1.54s/it | +| OneFlow | Enable | 33.30 | 1.66s/it | +| OneFlow | Enable | 33.68 | 1.68s/it | +| OneFlow | Enable | 26.06 | 1.30s/it | +| OneFlow | Enable | 33.77 | 1.69s/it | +| OneFlow | Enable | 29.30 | 1.46s/it | +| Torch | Disable | 110.65 | 5.53s/it | +| Torch | Disable | 112.23 | 5.61s/it | +| Torch | Disable | 135.04 | 6.75s/it | +| Torch | Disable | 109.02 | 5.45s/it | +| Torch | Disable | 114.88 | 5.74s/it | +| Torch | Enable | 161.77 | 8.09s/it | +| Torch | Enable | 162.93 | 8.15s/it | +| Torch | Enable | 185.70 | 9.29s/it | +| Torch | Enable | 159.99 | 8.00s/it | +| Torch | Enable | 161.69 | 8.08s/it | + +## FAQ + + + ## TODOs 1. OneFlow 支持 skip_init 功能之后,`faster_chatglm_6b/__init__.py`中移除`new_skip_init`。 From 13fa0daa3b2650bfb9a53926167343c8804e74b2 Mon Sep 17 00:00:00 2001 From: ShawnXuan Date: Sun, 16 Apr 2023 22:39:17 +0800 Subject: [PATCH 2/4] update --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9935519..cba23a4 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# faster-chatglm-6b readme +# faster-chatglm-6b `faster-chatglm-6b` 是一个使用 [OneFlow](https://github.com/Oneflow-Inc/oneflow) 深度学习框架为后端加速[THUDM/chatglm-6b](https://huggingface.co/THUDM/chatglm-6b)运行的项目。 From d28166dba4969c8d8158bc119b565bd231d78bb5 Mon Sep 17 00:00:00 2001 From: ShawnXuan Date: Sun, 16 Apr 2023 22:42:40 +0800 Subject: [PATCH 3/4] update --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index cba23a4..4278923 100644 --- a/README.md +++ b/README.md @@ -91,7 +91,7 @@ ChatGLM中,每一个GLMBlock层的SelfAttention模块,都需要对张量quer - fused_fast_gelu_mul -我们将`x1 * F.gelu(x2)`的操作融合成`fused_fast_gelu_mul`算子 +我们将`x1 * F.gelu(x2)`的操作融合成`fused_fast_gelu_mul`算子。 - fused_matmul_bias From 0435d8910ea02945604fb610df5be94309c13ec9 Mon Sep 17 00:00:00 2001 From: ShawnXuan Date: Mon, 17 Apr 2023 15:48:23 +0800 Subject: [PATCH 4/4] update benchmark result --- README.md | 26 +++++--------------------- 1 file changed, 5 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index 4278923..aea5027 100644 --- a/README.md +++ b/README.md @@ -101,30 +101,14 @@ ChatGLM中,每一个GLMBlock层的SelfAttention模块,都需要对张量quer 我们对优化后的效果进行了定量的测试,测试脚本请参考:examples/benchmark.py。 -测试在NVIDIA A100 40G中进行,一共测试了4组参数,每组参数都运行了5次,测试结果如下: +测试在NVIDIA A100 80G中进行,一共测试了4组参数,测试结果如下: | Backend | Quantization | Duration(s) | average | | ------- | ------------ | ----------- | -------- | -| OneFlow | Disable | 30.58 | 1.53s/it | -| OneFlow | Disable | 30.96 | 1.55s/it | -| OneFlow | Disable | 30.52 | 1.53s/it | -| OneFlow | Disable | 31.13 | 1.56s/it | -| OneFlow | Disable | 30.71 | 1.54s/it | -| OneFlow | Enable | 33.30 | 1.66s/it | -| OneFlow | Enable | 33.68 | 1.68s/it | -| OneFlow | Enable | 26.06 | 1.30s/it | -| OneFlow | Enable | 33.77 | 1.69s/it | -| OneFlow | Enable | 29.30 | 1.46s/it | -| Torch | Disable | 110.65 | 5.53s/it | -| Torch | Disable | 112.23 | 5.61s/it | -| Torch | Disable | 135.04 | 6.75s/it | -| Torch | Disable | 109.02 | 5.45s/it | -| Torch | Disable | 114.88 | 5.74s/it | -| Torch | Enable | 161.77 | 8.09s/it | -| Torch | Enable | 162.93 | 8.15s/it | -| Torch | Enable | 185.70 | 9.29s/it | -| Torch | Enable | 159.99 | 8.00s/it | -| Torch | Enable | 161.69 | 8.08s/it | +| OneFlow | Disable | 25.674 | 1.28s/it | +| OneFlow | Enable | 23.131 | 1.16s/it | +| Torch | Disable | 79.248 | 3.97s/it | +| Torch | Enable | 138.447 | 6.92s/it | ## FAQ