Skip to content

Commit 29df480

Browse files
authored
Change FT doc filename (#1136)
1 parent 3f57a78 commit 29df480

File tree

3 files changed

+352
-346
lines changed

3 files changed

+352
-346
lines changed

docs/advanced_guide/deployment.rst

Lines changed: 2 additions & 345 deletions
Original file line numberDiff line numberDiff line change
@@ -1,348 +1,5 @@
11
============
2-
文本生成高性能加速
2+
高性能预测部署
33
============
44

5-
6-
使用环境说明
7-
------------
8-
9-
* 本项目依赖于 PaddlePaddle 2.1.0 及以上版本或适当的 develop 版本
10-
* CMake >= 3.10
11-
* CUDA 10.1 或 10.2(需要 PaddlePaddle 框架一致)
12-
* gcc 版本需要与编译 PaddlePaddle 版本一致,比如使用 gcc8.2
13-
* 推荐使用 Python3
14-
* `FasterTransformer <https://github.com/NVIDIA/FasterTransformer/tree/v3.1#setup>`_ 使用必要的环境
15-
* 环境依赖
16-
17-
- attrdict
18-
- pyyaml
19-
20-
.. code-block::
21-
22-
pip install attrdict pyyaml
23-
24-
25-
快速开始
26-
------------
27-
28-
我们实现了基于 FasterTransformer 的自定义 op 的接入,用于加速文本生成模型在 GPU 上的预测性能。接下来,我们将分别介绍基于 Python 动态图和预测库使用 FasterTransformer 自定义 op 的方式,包括 op 的编译与使用。
29-
30-
Python 动态图使用自定义 op
31-
------------
32-
33-
JIT 自动编译
34-
^^^^^^^^^^^^
35-
36-
目前当基于动态图使用 FasterTransformer 预测加速自定义 op 时,PaddleNLP 提供了 Just In Time 的自动编译,在一些 API 上,用户无需关注编译流程,可以直接执行对应的 API,程序会自动编译需要的第三方库。
37-
38-
以 Transformer 为例,可以直接调用 `TransformerGenerator()` 这个 API,程序会自动编译。
39-
40-
目前支持 JIT 的预测加速 API 有:
41-
42-
* `FasterTransformer()/TransformerGenerator()`: 支持 Transformer 模型的预测加速功能。使用示例可以参考 `Transformer 预测加速使用示例-sample <https://github.com/PaddlePaddle/PaddleNLP/blob/develop/paddlenlp/ops/faster_transformer/sample/decoding_sample.py>`_,`Transformer 预测加速使用示例-机器翻译 <https://github.com/PaddlePaddle/PaddleNLP/tree/develop/examples/machine_translation/transformer/faster_transformer>`_。
43-
* `FasterGPT()`: 支持 GPT 模型的预测加速功能。使用示例可以参考 `GPT 预测加速使用示例 <https://github.com/PaddlePaddle/PaddleNLP/tree/develop/examples/language_model/gpt/faster_gpt>`_。
44-
* `FasterUnifiedTransformer()`: 支持 UnifiedTransformer 模型的预测加速功能。使用示例可以参考 `UnifiedTransformer 预测加速使用示例 <https://github.com/PaddlePaddle/PaddleNLP/tree/develop/examples/dialogue/unified_transformer>`_。
45-
* `FasterUNIMOText()`: 支持 UNIMOText 模型预测加速功能。使用示例可以参考 `UNIMOText 预测加速使用示例 <https://github.com/PaddlePaddle/PaddleNLP/tree/develop/examples/text_generation/unimo-text/faster_unimo>`_。
46-
* `FasterBart()`: 支持 BART 模型预测加速功能。使用示例可以参考 `BART 预测加速使用示例 <https://github.com/PaddlePaddle/PaddleNLP/blob/develop/paddlenlp/ops/faster_transformer/sample/bart_decoding_sample.py>`_。
47-
48-
具体使用方法可以参考 API 文档或是使用示例。
49-
50-
编译自定义OP
51-
^^^^^^^^^^^^
52-
53-
除了自动编译外,如果需要自行编译,我们已经提供对应的 CMakeLists.txt,可以参考使用如下的方式完成编译。
54-
55-
PaddleNLP 准备
56-
""""""""""""
57-
58-
首先,如果需要从源码自行编译,可以直接使用 Python 的 package 下的 paddlenlp,或是可从 github 克隆一个 PaddleNLP,并重新编译:
59-
60-
以下以从 github 上 clone 一个新版 PaddleNLP 为例:
61-
62-
.. code-block::
63-
64-
git clone https://github.com/PaddlePaddle/PaddleNLP.git
65-
66-
其次,配置环境变量,让我们可以使用当前 clone 的 paddlenlp,并进入到自定义 OP 的路径,准备后续的编译操作:
67-
68-
.. code-block::
69-
70-
export PYTHONPATH=$PWD/PaddleNLP/:$PYTHONPATH
71-
cd PaddleNLP/paddlenlp/ops/
72-
73-
编译
74-
""""""""""""
75-
76-
编译之前,请确保安装的 PaddlePaddle 的版本高于 2.1.0 或是基于最新的 develop 分支的代码编译,并且正常可用。
77-
78-
编译自定义 OP 可以参照一下步骤:
79-
80-
.. code-block::
81-
82-
mkdir build
83-
cd build/
84-
cmake .. -DSM=xx -DCMAKE_BUILD_TYPE=Release -DPY_CMD=python3.x
85-
make -j
86-
cd ../
87-
88-
可以使用的编译选项包括:
89-
90-
* `-DSM`: 是指的所用 GPU 的 compute capability。举例来说,可以将之指定为 70(V100) 或是 75(T4)
91-
* `-DPY_CMD`: 指定当前装有 PaddlePaddle 版本的 python 环境,比如 `-DPY_CMD=python3.7`。若未指定 `-DPY_CMD` 将会默认使用系统命令 `python` 对应的 Python。
92-
* `-DWITH_GPT`: 是否编译带有 GPT 相关的 lib。若使用 GPT-2 高性能推理,需要加上 `-DWITH_GPT=ON`。默认为 OFF。
93-
* `-DWITH_UNIFIED`: 是否编译带有 Unified Transformer 或是 UNIMOText 相关的 lib。若使用,需要加上 `-DWITH_UNIFIED=ON`。默认为 ON。
94-
* `-DWITH_BART`: 是否编译带有 BART 支持的相关 lib。若使用,需要加上 `-DWITH_BART=ON`。默认为 ON。
95-
* `-DWITH_DECODER`: 是否编译带有 decoder 优化的 lib。默认为 ON。
96-
97-
最终,编译会在 `./build/lib/` 路径下,产出 `libdecoding_op.so`,即需要的 FasterTransformer decoding 执行的库。
98-
99-
使用 Transformer decoding 高性能推理
100-
^^^^^^^^^^^^
101-
102-
编写 python 脚本的时候,调用 `FasterTransformer API <https://paddlenlp.readthedocs.io/zh/latest/source/paddlenlp.ops.faster_transformer.transformer.faster_transformer.html#paddlenlp.ops.faster_transformer.transformer.faster_transformer.FasterTransformer>` 即可实现 Transformer 模型的高性能预测。
103-
104-
举例如下:
105-
106-
.. code-block::
107-
108-
from paddlenlp.ops import FasterTransformer
109-
110-
transformer = FasterTransformer(
111-
src_vocab_size=args.src_vocab_size,
112-
trg_vocab_size=args.trg_vocab_size,
113-
max_length=args.max_length + 1,
114-
n_layer=args.n_layer,
115-
n_head=args.n_head,
116-
d_model=args.d_model,
117-
d_inner_hid=args.d_inner_hid,
118-
dropout=args.dropout,
119-
weight_sharing=args.weight_sharing,
120-
bos_id=args.bos_idx,
121-
eos_id=args.eos_idx,
122-
decoding_strategy=args.decoding_strategy,
123-
beam_size=args.beam_size,
124-
topk=args.topk,
125-
topp=args.topp,
126-
max_out_len=args.max_out_len,
127-
decoding_lib=args.decoding_lib,
128-
use_fp16_decoding=args.use_fp16_decoding)
129-
130-
若当前环境下没有需要的自定义 op 的动态库,将会使用 JIT 自动编译需要的动态库。如果需要自行编译自定义 op 所需的动态库,可以如前文所述进行编译。编译好后,使用 `FasterTransformer(decoding_lib="/path/to/lib", ...)` 可以完成导入。
131-
132-
更详细的例子可以参考 `Transformer 预测加速使用示例-sample <https://github.com/PaddlePaddle/PaddleNLP/blob/develop/paddlenlp/ops/faster_transformer/sample/decoding_sample.py>`_,`Transformer 预测加速使用示例-机器翻译 <https://github.com/PaddlePaddle/PaddleNLP/tree/develop/examples/machine_translation/transformer/faster_transformer>`_,我们提供了更详细用例。
133-
134-
Transformer decoding 示例代码
135-
""""""""""""
136-
137-
使用 PaddlePaddle 仅执行 decoding 测试(float32):
138-
139-
.. code-block::
140-
141-
export CUDA_VISIBLE_DEVICES=0
142-
export FLAGS_fraction_of_gpu_memory_to_use=0.1
143-
# 执行 decoding_gemm 目的是基于当前环境、配置,提前确定一个性能最佳的矩阵乘算法,不是必要的步骤
144-
./build/third-party/build/fastertransformer/bin/decoding_gemm 32 4 8 64 30000 32 512 0
145-
python ./faster_transformer/sample/decoding_sample.py --config ./faster_transformer/sample/config/decoding.sample.yaml --decoding_lib ./build/lib/libdecoding_op.so
146-
147-
使用 PaddlePaddle 仅执行 decoding 测试(float16):
148-
执行 float16 的 decoding,需要在执行的时候,加上 `--use_fp16_decoding` 选项。
149-
150-
.. code-block::
151-
152-
export CUDA_VISIBLE_DEVICES=0
153-
export FLAGS_fraction_of_gpu_memory_to_use=0.1
154-
# 执行 decoding_gemm 目的是基于当前环境、配置,提前确定一个性能最佳的矩阵乘算法,不是必要的步骤
155-
./build/third-party/build/fastertransformer/bin/decoding_gemm 32 4 8 64 30000 32 512 1
156-
python ./faster_transformer/sample/decoding_sample.py --config ./faster_transformer/sample/config/decoding.sample.yaml --decoding_lib ./build/lib/libdecoding_op.so --use_fp16_decoding
157-
158-
其中,`decoding_gemm` 不同参数的意义可以参考 `FasterTransformer 文档 <https://github.com/NVIDIA/FasterTransformer/tree/v3.1#execute-the-decoderdecoding-demos>`_。这里提前执行 `decoding_gemm`,可以在当前路径下生成一个 config 文件,里面会包含针对当前 decoding 部分提供的配置下,性能最佳的矩阵乘的算法,并在执行的时候读入这个数据。
159-
160-
使用 GPT-2 decoding 高性能推理
161-
^^^^^^^^^^^^
162-
163-
与 `FasterTransformer` 类似,可以通过一下方式调用 GPT-2 相关优化:
164-
165-
.. code-block::
166-
167-
from paddlenlp.ops import FasterGPT
168-
from paddlenlp.transformers import GPTModel, GPTForPretraining
169-
170-
MODEL_CLASSES = {
171-
"gpt2-medium-en": (GPTForPretraining, GPTTokenizer),
172-
}
173-
174-
model_class, tokenizer_class = MODEL_CLASSES[args.model_name]
175-
tokenizer = tokenizer_class.from_pretrained(args.model_name)
176-
model = model_class.from_pretrained(args.model_name)
177-
178-
# Define model
179-
gpt = FasterGPT(
180-
model=model,
181-
topk=args.topk,
182-
topp=args.topp,
183-
max_out_len=args.max_out_len,
184-
bos_id=bos_id,
185-
eos_id=eos_id,
186-
temperature=args.temperature,
187-
decoding_lib=args.decoding_lib,
188-
use_fp16_decoding=args.use_fp16_decoding)
189-
190-
目前,GPT-2 的高性能预测接口 `FasterGPT()` 要求 batch 内输入的样本的长度都是相同的。并且,仅支持 topk-sampling 和 topp-sampling,不支持 beam-search。
191-
192-
若当前环境下没有需要的自定义 op 的动态库,将会使用 JIT 自动编译需要的动态库。如果需要自行编译自定义 op 所需的动态库,可以如前文所述进行编译。编译好后,使用 `FasterGPT(decoding_lib="/path/to/lib", ...)` 可以完成导入。
193-
194-
更详细的例子可以参考 `GPT 预测加速使用示例 <https://github.com/PaddlePaddle/PaddleNLP/tree/develop/examples/language_model/gpt/faster_gpt>`_,我们提供了更详细用例。
195-
196-
GPT-2 decoding 示例代码
197-
""""""""""""
198-
199-
使用 PaddlePaddle 仅执行 decoding 测试(float32):
200-
201-
.. code-block::
202-
203-
export CUDA_VISIBLE_DEVICES=0
204-
python ./faster_transformer/sample/gpt_sample.py --model_name_or_path gpt2-medium-en --batch_size 1 --topk 4 --topp 0.0 --max_out_len 32 --start_token "<|endoftext|>" --end_token "<|endoftext|>" --temperature 1.0
205-
206-
其中,各个选项的意义如下:
207-
208-
* `--model_name_or_path`: 预训练模型的名称或是路径。
209-
* `--decoding_lib`: 指向 `libdecoding_op.so` 的路径。需要包含 `libdecoding_op.so`。若不指定或是不存在则将自动进行 jit 编译产出该 lib。
210-
* `--batch_size`: 一个 batch 内,样本数目的大小。
211-
* `--candidate_num`: 执行 topk-sampling 的时候的 `k` 的大小,默认是 4。
212-
* `--probability_threshold`: 执行 topp-sampling 的时候的阈值的大小,默认是 0.0 表示不执行 topp-sampling。
213-
* `--max_seq_len`: 最长的生成长度。
214-
* `--start_token`: 字符串,表示任意生成的时候的开始 token。
215-
* `--end_token`: 字符串,生成的结束 token。
216-
* `--temperature`: temperature 的设定。
217-
* `--use_fp16_decoding`: 是否使用 fp16 进行推理。
218-
219-
若当前环境下没有需要的自定义 op 的动态库,将会使用 JIT 自动编译需要的动态库。如果需要自行编译自定义 op 所需的动态库,可以参考前文。编译好后,可以在执行 `gpt_sample.py` 时使用 `--decoding_lib ../../../../paddlenlp/ops/build/lib/libdecoding_op.so` 可以完成导入。
220-
221-
222-
C++ 预测库使用自定义 op
223-
------------
224-
225-
编译自定义OP
226-
^^^^^^^^^^^^
227-
228-
在 C++ 预测库使用自定义 OP 需要将实现的 C++、CUDA 代码**以及 C++ 预测的 demo**编译成一个可执行文件。因预测库支持方式与 Python 不同,这个过程将不会产生自定义 op 的动态库,将直接得到可执行文件。我们已经提供对应的 CMakeLists.txt ,可以参考使用如下的方式完成编译。并获取执行 demo。
229-
230-
PaddleNLP 准备
231-
""""""""""""
232-
233-
首先,因为需要基于当前环境重新编译,当前的 paddlenlp 的 python 包里面并不包含 FasterTransformer 相关 lib,需要从源码自行编译,可以直接使用 Python 的 package 下的 paddlenlp,或是可从 github 克隆一个 PaddleNLP,并重新编译:
234-
235-
以下以从 github 上 clone 一个新版 PaddleNLP 为例:
236-
237-
.. code-block::
238-
239-
git clone https://github.com/PaddlePaddle/PaddleNLP.git
240-
241-
其次,让我们可以使用当前 clone 的 paddlenlp,并进入到自定义 OP 的路径,准备后续的编译操作:
242-
243-
.. code-block::
244-
245-
cd PaddleNLP/paddlenlp/ops/
246-
247-
编译
248-
""""""""""""
249-
250-
编译之前,请确保安装的 PaddlePaddle 的版本高于 2.1.0 或是基于最新的 develop 分支的代码编译,并且正常可用。
251-
252-
编译自定义 OP 可以参照一下步骤:
253-
254-
.. code-block::
255-
256-
mkdir build
257-
cd build/
258-
cmake .. -DSM=xx -DCMAKE_BUILD_TYPE=Release -DPADDLE_LIB=/path/to/paddle_inference_lib/ -DDEMO=./demo/transformer_e2e.cc -DON_INFER=ON -DWITH_MKL=ON
259-
make -j
260-
cd ../
261-
262-
注意:
263-
264-
* `-DSM`: 是指的所用 GPU 的 compute capability。举例来说,可以将之指定为 70(V100) 或是 75(T4)
265-
* `-DPADDLE_LIB`: 需要指明使用的 PaddlePaddle 预测库的路径 `/path/to/paddle_inference_install_dir/`,需要使用的 PaddlePaddle 的 lib 可以选择自行编译或者直接从官网下载 `paddle_inference_linux_lib <https://paddleinference.paddlepaddle.org.cn/user_guides/download_lib.html#linux>`_。需要注意的是,在该路径下,预测库的组织结构满足:
266-
.. code-block::
267-
268-
.
269-
├── CMakeCache.txt
270-
├── paddle/
271-
├── include/
272-
└── lib/
273-
├── third_party/
274-
├── cudaerror/
275-
├── install/
276-
└── threadpool/
277-
└── version.txt
278-
279-
* `-DDEMO`: 说明预测库使用 demo 的位置。比如指定 -DDEMO=./demo/transformer_e2e.cc 或是 -DDEMO=./demo/gpt.cc。最好使用绝对路径,若使用相对路径,需要是相对于 `PaddleNLP/paddlenlp/ops/faster_transformer/src/` 的相对路径。
280-
* `-DWITH_GPT`: 是否编译带有 GPT 相关的 lib。若使用 GPT-2 高性能推理,需要加上 `-DWITH_GPT=ON`。默认为 OFF。
281-
* `-DWITH_UNIFIED`: 是否编译带有 Unified Transformer 或是 UNIMOText 相关的 lib。若使用,需要加上 `-DWITH_UNIFIED=ON`。默认为 ON。
282-
* `-DWITH_BART`: 是否编译带有 BART 支持的相关 lib。若使用,需要加上 `-DWITH_BART=ON`。默认为 ON。
283-
* `-DWITH_DECODER`: 是否编译带有 decoder 优化的 lib。默认为 ON。
284-
* `-DWITH_MKL`: 若当前是使用的 mkl 的 Paddle lib,那么需要打开 MKL 以引入 MKL 相关的依赖。
285-
* `-DON_INFER`: 是否编译 paddle inference 预测库。
286-
* **当使用预测库的自定义 op 的时候,请务必开启 `-DON_INFER=ON` 选项,否则,不会得到预测库的可执行文件。**
287-
288-
执行 Transformer decoding on PaddlePaddle
289-
""""""""""""
290-
291-
编译完成后,在 `build/bin/` 路径下将会看到 `transformer_e2e` 的一个可执行文件。通过设置对应的设置参数完成执行的过程。
292-
293-
.. code-block::
294-
295-
cd bin/
296-
./transformer_e2e -batch_size <batch_size> -gpu_id <gpu_id> -model_dir <model_directory> -vocab_dir <dict_directory> -data_dir <input_data>
297-
298-
举例说明:
299-
300-
.. code-block::
301-
302-
cd bin/
303-
# 执行 decoding_gemm 目的是基于当前环境、配置,提前确定一个性能最佳的矩阵乘算法,不是必要的步骤
304-
../third-party/build/fastertransformer/bin/decoding_gemm 8 5 8 64 38512 256 512 0
305-
./transformer_e2e -batch_size 8 -gpu_id 0 -model_dir ./infer_model/ -vocab_dir DATA_HOME/WMT14ende/WMT14.en-de/wmt14_ende_data_bpe/vocab_all.bpe.33708 -data_dir DATA_HOME/WMT14ende/WMT14.en-de/wmt14_ende_data_bpe/newstest2014.tok.bpe.33708.en
306-
307-
其中:
308-
309-
* `decoding_gemm` 不同参数的意义可以参考 `FasterTransformer 文档 <https://github.com/NVIDIA/FasterTransformer/tree/v3.1#execute-the-decoderdecoding-demos>`_。这里提前执行 `decoding_gemm`,可以在当前路径下生成一个 config 文件,里面会包含针对当前 decoding 部分提供的配置下,性能最佳的矩阵乘的算法,并在执行的时候读入这个数据。
310-
* `DATA_HOME` 则是 `paddlenlp.utils.env.DATA_HOME` 返回的路径。
311-
312-
预测所需要的模型文件,可以通过 `faster_transformer/README.md <https://github.com/PaddlePaddle/PaddleNLP/blob/develop/examples/machine_translation/transformer/faster_transformer/README.md>`_ 文档中所记述的方式导出。
313-
314-
执行 GPT decoding on PaddlePaddle
315-
""""""""""""
316-
317-
如果需要使用 Paddle Inference 预测库针对 GPT 进行预测,首先,需要导出预测模型,可以通过 `gpt_export_model_sample.py <https://github.com/PaddlePaddle/PaddleNLP/blob/develop/paddlenlp/ops/faster_transformer/sample/gpt_export_model_sample.py>`_ 脚本获取预测库用模型,执行方式如下所示:
318-
319-
.. code-block::
320-
321-
python ./faster_transformer/sample/gpt_export_model_sample.py --model_name_or_path gpt2-medium-en --topk 4 --topp 0.0 --max_out_len 32 --start_token "<|endoftext|>" --end_token "<|endoftext|>" --temperature 1.0 --inference_model_dir ./infer_model/
322-
323-
各个选项的意义与上文的 `gpt_sample.py` 的选项相同。额外新增一个 `--inference_model_dir` 选项用于指定保存的模型文件、词表等文件。
324-
325-
若当前环境下没有需要的自定义 op 的动态库,将会使用 JIT 自动编译需要的动态库。如果需要自行编译自定义 op 所需的动态库,可以参考前文。编译好后,可以在执行 `gpt_export_model_sample.py` 时使用 `--decoding_lib ../../../../paddlenlp/ops/build/lib/libdecoding_op.so` 可以完成导入。
326-
327-
注意:如果是自行编译的话,这里的 `libdecoding_op.so` 的动态库是参照前文中 **`Python 动态图使用自定义 op`** 编译出来的 lib,与 **`C++ 预测库使用自定义 op`** 编译产出不同。因此,在使用预测库前,还需要额外导出模型:
328-
329-
* 一次用于获取 Python 动态图下的 lib,用到 Python 端进行模型导出。
330-
* 一次获取编译的基于预测库的可执行文件
331-
332-
若是使用的模型是 gpt2-medium-en,保存之后,`infer_model/` 目录下组织的结构如下:
333-
334-
.. code-block::
335-
336-
.
337-
├── gpt.pdiparams # 保存的参数文件
338-
├── gpt.pdiparams.info # 保存的一些变量描述信息,预测不会用到
339-
├── gpt.pdmodel # 保存的模型文件
340-
├── merges.txt # bpe
341-
└── vocab.txt # 词表
342-
343-
同理,完成编译后,可以在 `build/bin/` 路径下将会看到 `gpt` 的一个可执行文件。通过设置对应的设置参数完成执行的过程。
344-
345-
.. code-block::
346-
347-
cd bin/
348-
./gpt -batch_size 1 -gpu_id 0 -model_dir path/to/model -vocab_dir path/to/vocab -start_token "<|endoftext|>" -end_token "<|endoftext|>"
5+
高性能预测部署

0 commit comments

Comments
 (0)