From bc214067d603bf95beb8af5d1ce5960e96ba7244 Mon Sep 17 00:00:00 2001 From: byshiue Date: Tue, 16 Aug 2022 11:01:17 +0800 Subject: [PATCH] feat: update v5.1 (#281) --- .gitlab-ci.yml | 256 -- .gitlab/issue_templates/bug.md | 6 - .gitlab/issue_templates/feature.md | 6 - .gitlab/merge_request_templates/merge.md | 7 - 3rdparty/INIReader.h | 4 +- .../fused_multihead_attention.h | 11 +- .../qkvToContext.cu | 44 +- CMakeLists.txt | 75 +- CONTRIBUTING.md | 2 +- README.md | 50 +- benchmarks/bert/pyt_benchmark.sh | 2 +- benchmarks/bert/pyt_int8_benchmark.sh | 2 +- benchmarks/bert/pyt_sp_fp16_benchmark.sh | 4 +- .../bert/pyt_sp_int8_mode2_benchmark.sh | 4 +- benchmarks/bert/pyt_tp_benchmark.sh | 126 + benchmarks/gpt/cpp_benchmark.sh | 120 + benchmarks/t5/pyt_benchmark.sh | 142 +- docker/Dockerfile.tf | 41 + docker/Dockerfile.torch | 59 + docs/bert_guide.md | 741 +++-- docs/decoder_guide.md | 28 +- docs/gpt_guide.md | 592 +++- docs/gptj_guide.md | 233 +- docs/gptneox_guide.md | 135 + docs/images/encoder_flowchart.png | Bin 731110 -> 731248 bytes .../gpt/gpt_interactive_generation.0.png | Bin 0 -> 185776 bytes .../gpt/gpt_interactive_generation.1.png | Bin 0 -> 133193 bytes .../gpt/gpt_interactive_generation.2.png | Bin 0 -> 385557 bytes docs/longformer_guide.md | 6 +- docs/swin_guide.md | 14 +- docs/t5_guide.md | 413 ++- docs/vit_guide.md | 22 +- docs/xlnet_guide.md | 9 +- examples/__init__.py | 0 examples/cpp/CMakeLists.txt | 7 +- examples/cpp/bert/CMakeLists.txt | 6 + examples/cpp/bert/bert_config.ini | 15 + examples/cpp/bert/bert_example.cc | 59 +- examples/cpp/bert/bert_triton_example.cc | 301 ++ examples/cpp/bert_int8/CMakeLists.txt | 2 +- examples/cpp/bert_int8/bert_int8_example.cc | 42 +- examples/cpp/decoding/decoding_example.cc | 74 +- examples/cpp/decoding/layernorm_test.cc | 93 +- examples/cpp/gpt/gpt_config.ini | 3 + examples/cpp/gpt/gpt_example.cc | 107 +- examples/cpp/gptj/CMakeLists.txt | 7 +- examples/cpp/gptj/gptj_config.ini | 17 +- examples/cpp/gptj/gptj_example.cc | 228 +- examples/cpp/gptj/gptj_triton_example.cc | 182 +- examples/cpp/gptneox/CMakeLists.txt | 22 + examples/cpp/gptneox/bad_words.csv | 2 + examples/cpp/gptneox/gptneox_config.ini | 31 + examples/cpp/gptneox/gptneox_example.cc | 481 ++++ .../cpp/gptneox/gptneox_triton_example.cc | 427 +++ examples/cpp/gptneox/start_ids.csv | 8 + examples/cpp/gptneox/stop_words.csv | 2 + examples/cpp/multi_gpu_gpt/CMakeLists.txt | 12 +- .../multi_gpu_gpt/concat_interactive_ids.csv | 8 + examples/cpp/multi_gpu_gpt/gpt_config.ini | 67 +- .../cpp/multi_gpu_gpt/gpt_example_utils.cc | 20 +- .../cpp/multi_gpu_gpt/gpt_example_utils.h | 10 +- .../multi_gpu_gpt/interactive_inputs_ids.csv | 8 + .../multi_gpu_gpt_async_example.cc | 286 +- .../multi_gpu_gpt/multi_gpu_gpt_example.cc | 281 +- .../multi_gpu_gpt_interactive_example.cc | 622 +++++ .../multi_gpu_gpt_triton_example.cc | 164 +- examples/cpp/swin/CMakeLists.txt | 2 +- examples/cpp/swin/functions.h | 18 +- examples/cpp/swin/swin_example.cc | 218 +- examples/cpp/swin_int8/swin_int8_example.cc | 212 +- examples/cpp/vit/vit_example.cc | 34 +- examples/cpp/vit_int8/CMakeLists.txt | 2 +- examples/cpp/vit_int8/vit_int8_example.cc | 41 +- examples/cpp/xlnet/cnpy.cpp | 80 +- examples/cpp/xlnet/cnpy.h | 34 +- .../cpp/xlnet/xlnet_correctness_example.cc | 143 +- examples/cpp/xlnet/xlnet_example.cc | 37 +- examples/pytorch/__init__.py | 0 .../bert/bert-quantization-sparsity/README.md | 2 +- .../apex_sparsity/asp.py | 4 +- .../bert-quantization-sparsity/modeling.py | 4 +- .../run_pretraining.py | 2 +- .../tokenization.py | 4 +- examples/pytorch/bert/bert_example.py | 215 +- examples/pytorch/bert/run_glue.py | 31 +- examples/pytorch/bert/run_squad.py | 9 +- examples/pytorch/bert/scripts/run_mrpc.sh | 6 +- examples/pytorch/bert/scripts/run_squad.sh | 14 +- examples/pytorch/bert/utils/encoder.py | 202 +- .../bert/utils/huggingface_bert_convert.py | 149 + .../pytorch/bert/utils/update_bert_config.py | 65 + examples/pytorch/decoder/decoder_example.py | 5 +- examples/pytorch/decoder/utils/ft_decoder.py | 4 + examples/pytorch/decoding/decoding_example.py | 20 +- .../pytorch/decoding/translate_example.py | 2 +- examples/pytorch/decoding/utils/bleu_score.py | 42 + examples/pytorch/decoding/utils/decoding.py | 22 +- .../pytorch/decoding/utils/ft_decoding.py | 4 + .../decoding/utils/translation_model.py | 10 + examples/pytorch/encoder/encoder_example.py | 9 +- examples/pytorch/encoder/utils/ft_encoder.py | 4 + examples/pytorch/gpt/duplicate_input_ids.txt | 8 + examples/pytorch/gpt/evaluate_zeroshot_gpt.py | 32 +- examples/pytorch/gpt/gpt_example.py | 64 +- examples/pytorch/gpt/gpt_summarization.py | 62 +- examples/pytorch/gpt/lambada_task_example.py | 266 ++ examples/pytorch/gpt/multi_gpu_gpt_example.py | 75 +- examples/pytorch/gpt/opt_summarization.py | 301 ++ examples/pytorch/gpt/requirement.txt | 9 +- .../gpt/scripts/evaluate_zeroshot_gpt.sh | 28 +- .../checkpoint_saver_fastertransformer.py | 1 - .../pytorch/gpt/utils/generate_gpt_config.py | 9 +- examples/pytorch/gpt/utils/gpt.py | 358 ++- .../pytorch/gpt/utils/gpt_token_converter.py | 9 +- .../pytorch/gpt/utils/gpt_token_encoder.py | 2 +- .../gpt/utils/huggingface_gpt_convert.py | 34 +- .../gpt/utils/huggingface_jp_gpt_convert.py | 31 +- .../gpt/utils/huggingface_opt_convert.py | 250 ++ .../gpt/utils/megatron_ckpt_convert.py | 675 +++-- .../pytorch/gpt/utils/nemo_ckpt_convert.py | 954 ++++--- examples/pytorch/gpt/utils/parallel_gpt.py | 18 +- .../pytorch/gpt/utils/update_gpt_config.py | 105 + .../gptj/utils/generate_gptj_config.py | 112 + .../pytorch/gptj/utils/gptj_ckpt_convert.py | 25 +- .../utils/huggingface_gptj_ckpt_convert.py | 152 + examples/pytorch/gptj/utils/reference_gptj.py | 10 +- .../utils/eleutherai_gpt_neox_convert.py | 309 +++ examples/pytorch/gptneox/utils/hftokenizer.py | 92 + .../utils/huggingface_jp_gptneox_convert.py | 262 ++ examples/pytorch/longformer/longformer_qa.py | 43 +- examples/pytorch/longformer/model.py | 17 +- examples/pytorch/nemo.py | 188 ++ .../Swin-Transformer-Quantization/main.py | 2 +- .../Swin-Transformer-Quantization/models.py | 4 +- .../quant_utils.py | 4 +- ...SwinTransformerWeightTransposeQKVWeight.py | 4 + .../swin/infer_swintransformer_int8_op.py | 9 +- .../pytorch/swin/infer_swintransformer_op.py | 37 +- examples/pytorch/t5/mnli_task_example.py | 394 +++ examples/pytorch/t5/perf_benchmark.py | 50 +- examples/pytorch/t5/requirement.txt | 12 +- examples/pytorch/t5/summarization.py | 375 +++ examples/pytorch/t5/translate_example.py | 124 +- examples/pytorch/t5/utils/ft_decoding.py | 274 +- examples/pytorch/t5/utils/ft_encoder.py | 193 +- .../t5/utils/huggingface_t5_ckpt_convert.py | 56 +- .../t5/utils/megatron_t5_ckpt_convert.py | 21 +- .../pytorch/t5/utils/nemo_t5_ckpt_convert.py | 1304 ++++++--- examples/pytorch/t5/xnli_task_example.py | 416 +++ examples/pytorch/tokenizer.py | 50 + examples/pytorch/utils.py | 66 +- .../vit/VisionTransformerINT8WeightLoader.py | 26 +- .../vit/VisionTransformerWeightLoader.py | 8 +- .../pytorch/vit/infer_visiontransformer_op.py | 8 +- .../bert/bert-quantization/README_orig.md | 141 +- .../python/calib/calibrator.py | 8 +- .../python/calib/max.py | 2 +- .../bert/bert-quantization/run_pretraining.py | 2 +- .../bert/bert-quantization/run_squad.py | 2 +- .../bert/bert-quantization/tokenization.py | 2 +- examples/tensorflow/bert/utils/bert.py | 2 +- examples/tensorflow/bert/utils/common.py | 2 +- examples/tensorflow/common_utils/common.py | 2 +- .../tensorflow/decoder/decoder_example.py | 6 +- examples/tensorflow/decoder/utils/common.py | 2 +- examples/tensorflow/decoder/utils/decoder.py | 8 +- examples/tensorflow/decoder/utils/decoding.py | 4 +- .../tensorflow/decoding/decoding_example.py | 4 +- .../tensorflow/decoding/translate_example.py | 11 +- .../tensorflow/decoding/utils/ft_decoding.py | 4 +- examples/tensorflow/encoder/utils/encoder.py | 2 +- examples/tensorflow/gpt/gpt_example.py | 16 +- .../tensorflow/gpt/utils/gpt_token_encoder.py | 2 +- examples/tensorflow/xlnet/modeling.py | 10 +- examples/tensorrt/swin/builder_fp16.py | 5 +- examples/tensorrt/swin/builder_fp32.py | 4 +- examples/tensorrt/swin/builder_int8.py | 4 +- .../swin/infer_swintransformer_plugin.py | 59 +- .../swin/infer_swintransformer_plugin_int8.py | 49 +- examples/tensorrt/swin/run_builder_int8.sh | 1 + examples/tensorrt/t5/extractT5ModelToBIN.py | 84 +- examples/tensorrt/t5/testT5Plugin.py | 345 ++- .../infer_visiontransformer_int8_plugin.py | 196 ++ .../vit/infer_visiontransformer_plugin.py | 3 +- examples/tensorrt/vit/plugin_loader.py | 2 +- examples/tensorrt/vit/plugin_loader_int8.py | 198 ++ src/fastertransformer/kernels/CMakeLists.txt | 6 +- .../kernels/activation_int8_kernels.cu | 440 +-- .../kernels/activation_int8_kernels.h | 52 +- .../kernels/activation_kernels.cu | 617 ++++- .../kernels/activation_kernels.h | 18 + .../kernels/add_bias_transpose_kernels.cu | 175 +- .../kernels/add_bias_transpose_kernels.h | 28 +- .../kernels/add_residual_kernels.cu | 362 ++- .../kernels/add_residual_kernels.h | 69 +- .../kernels/ban_bad_words.cu | 121 +- src/fastertransformer/kernels/ban_bad_words.h | 24 +- .../kernels/beam_search_penalty_kernels.cu | 322 ++- .../kernels/beam_search_penalty_kernels.h | 35 +- .../kernels/beam_search_topk_kernels.cu | 353 ++- .../kernels/beam_search_topk_kernels.h | 30 +- .../kernels/bert_preprocess_kernels.cu | 208 +- .../kernels/bert_preprocess_kernels.h | 42 +- .../kernels/bfloat16_fallback_kenrels.cuh | 252 +- .../calibrate_quantize_weight_kernels.cu | 20 +- .../kernels/custom_ar_kernels.cu | 38 +- .../kernels/custom_ar_kernels.h | 16 +- .../decoder_masked_multihead_attention.cu | 1279 +-------- .../decoder_masked_multihead_attention.h | 78 +- .../decoder_masked_multihead_attention_128.cu | 79 + .../decoder_masked_multihead_attention_160.cu | 79 + .../decoder_masked_multihead_attention_192.cu | 79 + .../decoder_masked_multihead_attention_224.cu | 79 + .../decoder_masked_multihead_attention_256.cu | 79 + .../decoder_masked_multihead_attention_32.cu | 79 + .../decoder_masked_multihead_attention_64.cu | 79 + .../decoder_masked_multihead_attention_80.cu | 79 + .../decoder_masked_multihead_attention_96.cu | 79 + ...er_masked_multihead_attention_template.hpp | 1403 ++++++++++ ...decoder_masked_multihead_attention_utils.h | 438 ++- .../kernels/decoding_kernels.cu | 492 ++-- .../kernels/decoding_kernels.h | 119 +- .../kernels/dequantize_kernels.cu | 70 +- .../kernels/dequantize_kernels.h | 10 +- .../kernels/gen_relative_pos_bias.cu | 68 +- .../kernels/gen_relative_pos_bias.h | 10 +- src/fastertransformer/kernels/gpt_kernels.cu | 1073 ++++++-- src/fastertransformer/kernels/gpt_kernels.h | 219 +- .../kernels/layernorm_int8_kernels.cu | 1426 +++++----- .../kernels/layernorm_int8_kernels.h | 176 +- .../kernels/layernorm_kernels.cu | 1613 ++++++----- .../kernels/layernorm_kernels.h | 170 +- .../layout_transformer_int8_kernels.cu | 28 +- .../kernels/logprob_kernels.cu | 83 +- .../kernels/logprob_kernels.h | 12 +- .../kernels/longformer_kernels.cu | 298 +- .../kernels/longformer_kernels.h | 34 +- .../kernels/matrix_transpose_kernels.cu | 8 +- .../kernels/matrix_vector_multiplication.cu | 98 +- .../kernels/matrix_vector_multiplication.h | 14 +- .../online_softmax_beamsearch_kernels.cu | 384 ++- .../online_softmax_beamsearch_kernels.h | 28 +- .../kernels/quantization_int8_kernels.cu | 28 +- .../kernels/quantize_weight.cu | 68 +- .../kernels/quantize_weight.h | 12 +- .../kernels/reduce_kernel_utils.cuh | 28 +- .../kernels/reverse_roll_kernels.cu | 159 +- .../kernels/reverse_roll_kernels.h | 40 +- .../kernels/sampling_penalty_kernels.cu | 427 ++- .../kernels/sampling_penalty_kernels.h | 59 +- .../kernels/sampling_topk_kernels.cu | 673 +++-- .../kernels/sampling_topk_kernels.h | 89 +- .../kernels/sampling_topp_kernels.cu | 697 +++-- .../kernels/sampling_topp_kernels.h | 110 +- .../kernels/softmax_int8_kernels.cu | 508 ++-- .../kernels/softmax_int8_kernels.h | 56 +- .../kernels/stop_criteria_kernels.cu | 109 +- .../kernels/stop_criteria_kernels.h | 27 +- .../kernels/transform_mask_kernels.cu | 80 +- .../kernels/transpose_int8_kernels.cu | 298 +- .../kernels/transpose_int8_kernels.h | 100 +- .../kernels/unfused_attention_int8_kernels.cu | 2438 ++++++++--------- .../kernels/unfused_attention_int8_kernels.h | 334 +-- .../kernels/unfused_attention_kernels.cu | 1889 +++++++------ .../kernels/unfused_attention_kernels.h | 254 +- src/fastertransformer/kernels/vit_kernels.cu | 152 +- src/fastertransformer/kernels/vit_kernels.h | 16 +- .../kernels/xlnet_attention_kernels.cu | 1199 ++++---- .../kernels/xlnet_attention_kernels.h | 74 +- .../kernels/xlnet_preprocess_kernels.cu | 244 +- .../kernels/xlnet_preprocess_kernels.h | 16 +- src/fastertransformer/layers/BaseLayer.h | 18 +- src/fastertransformer/layers/CMakeLists.txt | 20 +- src/fastertransformer/layers/DenseWeight.h | 6 +- .../layers/DynamicDecodeBaseLayer.h | 21 +- .../layers/DynamicDecodeLayer.cc | 392 +-- .../layers/DynamicDecodeLayer.h | 32 +- src/fastertransformer/layers/FfnLayer.cc | 190 +- src/fastertransformer/layers/FfnLayer.h | 162 +- src/fastertransformer/layers/FfnLayerINT8.cc | 82 +- src/fastertransformer/layers/FfnLayerINT8.h | 70 +- src/fastertransformer/layers/FfnWeight.h | 1 + .../layers/TensorParallelGeluFfnLayer.cc | 47 +- .../layers/TensorParallelGeluFfnLayer.h | 39 +- .../layers/TensorParallelReluFfnLayer.cc | 43 +- .../layers/TensorParallelReluFfnLayer.h | 37 +- .../layers/TensorParallelSiluFfnLayer.cc | 96 + .../layers/TensorParallelSiluFfnLayer.h | 60 + .../attention_layers/BaseAttentionLayer.h | 18 +- .../layers/attention_layers/CMakeLists.txt | 2 +- .../DecoderCrossAttentionLayer.cu | 584 ++-- .../DecoderCrossAttentionLayer.h | 60 +- .../DecoderSelfAttentionLayer.cc | 415 +-- .../DecoderSelfAttentionLayer.h | 217 +- .../attention_layers/FusedAttentionLayer.cu | 155 +- .../attention_layers/FusedAttentionLayer.h | 63 +- .../GptContextAttentionLayer.cc | 279 +- .../GptContextAttentionLayer.h | 88 +- .../LongformerAttentionLayer.cc | 120 +- .../LongformerAttentionLayer.h | 28 +- ...ensorParallelDecoderCrossAttentionLayer.cc | 47 +- ...TensorParallelDecoderCrossAttentionLayer.h | 52 +- ...TensorParallelDecoderSelfAttentionLayer.cc | 123 +- .../TensorParallelDecoderSelfAttentionLayer.h | 123 +- .../TensorParallelGptContextAttentionLayer.cc | 74 +- .../TensorParallelGptContextAttentionLayer.h | 66 +- .../TensorParallelUnfusedAttentionLayer.cc | 33 +- .../TensorParallelUnfusedAttentionLayer.h | 36 +- .../attention_layers/UnfusedAttentionLayer.cc | 154 +- .../attention_layers/UnfusedAttentionLayer.h | 74 +- .../attention_layers/WindowAttention.cc | 102 +- .../layers/attention_layers/WindowAttention.h | 44 +- .../attention_layers_int8/CMakeLists.txt | 6 +- .../FusedAttentionLayerINT8.cu | 255 +- .../FusedAttentionLayerINT8.h | 42 +- .../UnfusedAttentionLayerINT8.cc | 149 +- .../UnfusedAttentionLayerINT8.h | 32 +- .../WindowAttentionINT8.cu | 193 +- .../WindowAttentionINT8.h | 52 +- .../beam_search_layers/BaseBeamSearchLayer.cu | 106 +- .../beam_search_layers/BaseBeamSearchLayer.h | 63 +- .../beam_search_layers/BeamSearchLayer.cu | 178 +- .../beam_search_layers/BeamSearchLayer.h | 32 +- .../OnlineBeamSearchLayer.cu | 113 +- .../OnlineBeamSearchLayer.h | 32 +- .../sampling_layers/BaseSamplingLayer.cc | 233 +- .../sampling_layers/BaseSamplingLayer.h | 64 +- .../layers/sampling_layers/CMakeLists.txt | 2 +- .../sampling_layers/TopKSamplingLayer.cu | 220 +- .../sampling_layers/TopKSamplingLayer.h | 47 +- .../sampling_layers/TopKTopPSamplingLayer.cu | 108 +- .../sampling_layers/TopKTopPSamplingLayer.h | 34 +- .../sampling_layers/TopPSamplingLayer.cu | 231 +- .../sampling_layers/TopPSamplingLayer.h | 54 +- .../XlnetAttentionLayer.cc | 137 +- .../XlnetAttentionLayer.h | 52 +- src/fastertransformer/models/BaseWeight.h | 49 + src/fastertransformer/models/CMakeLists.txt | 1 + src/fastertransformer/models/bert/Bert.cc | 914 +++--- src/fastertransformer/models/bert/Bert.h | 123 +- .../models/bert/BertLayerWeight.h | 294 +- .../models/bert/BertWeight.h | 94 +- .../models/bert/CMakeLists.txt | 6 +- .../models/bert/bert_gemm.cc | 40 +- .../models/bert_int8/BertINT8.cc | 83 +- .../models/bert_int8/BertINT8.h | 70 +- .../models/bert_int8/BertLayerINT8.cc | 74 +- .../models/bert_int8/BertLayerINT8.h | 58 +- .../models/bert_int8/BertLayerINT8Weight.h | 112 +- .../models/bert_int8/CMakeLists.txt | 4 +- .../models/decoder/CMakeLists.txt | 2 +- .../models/decoder/Decoder.cc | 106 +- .../models/decoder/Decoder.h | 43 +- .../models/decoder/DecoderLayerWeight.h | 96 +- .../models/decoding/CMakeLists.txt | 2 +- .../models/decoding/Decoding.cc | 283 +- .../models/decoding/Decoding.h | 126 +- .../models/decoding/DecodingWeight.h | 54 +- .../models/decoding/decoding_gemm.cc | 20 +- .../models/gptj/CMakeLists.txt | 3 + src/fastertransformer/models/gptj/GptJ.cc | 870 +++--- src/fastertransformer/models/gptj/GptJ.h | 216 +- .../models/gptj/GptJContextDecoder.cc | 157 +- .../models/gptj/GptJContextDecoder.h | 65 +- .../models/gptj/GptJDecoder.cc | 145 +- .../models/gptj/GptJDecoder.h | 67 +- .../models/gptj/GptJDecoderLayerWeight.cc | 56 +- .../models/gptj/GptJDecoderLayerWeight.h | 12 +- .../models/gptj/GptJWeight.cc | 186 +- .../models/gptj/GptJWeight.h | 47 +- .../models/gptneox/CMakeLists.txt | 63 + .../models/gptneox/GptNeoX.cc | 1197 ++++++++ .../models/gptneox/GptNeoX.h | 211 ++ .../models/gptneox/GptNeoXContextDecoder.cc | 442 +++ .../models/gptneox/GptNeoXContextDecoder.h | 111 + .../models/gptneox/GptNeoXDecoder.cc | 385 +++ .../models/gptneox/GptNeoXDecoder.h | 104 + .../gptneox/GptNeoXDecoderLayerWeight.cc | 220 ++ .../gptneox/GptNeoXDecoderLayerWeight.h | 62 + .../models/gptneox/GptNeoXWeight.cc | 290 ++ .../models/gptneox/GptNeoXWeight.h | 99 + .../models/longformer/CMakeLists.txt | 2 +- .../models/longformer/LongformerEncoder.cc | 110 +- .../models/longformer/LongformerEncoder.h | 117 +- .../models/multi_gpu_gpt/CMakeLists.txt | 8 +- .../models/multi_gpu_gpt/ParallelGpt.cc | 1253 +++++---- .../models/multi_gpu_gpt/ParallelGpt.h | 204 +- .../ParallelGptContextDecoder.cc | 507 +++- .../multi_gpu_gpt/ParallelGptContextDecoder.h | 85 +- .../multi_gpu_gpt/ParallelGptDecoder.cc | 301 +- .../models/multi_gpu_gpt/ParallelGptDecoder.h | 66 +- .../ParallelGptDecoderLayerWeight.cc | 415 ++- .../ParallelGptDecoderLayerWeight.h | 54 +- .../models/multi_gpu_gpt/ParallelGptWeight.cc | 199 +- .../models/multi_gpu_gpt/ParallelGptWeight.h | 91 +- .../models/multi_gpu_gpt/gpt_gemm.cc | 24 +- .../models/swin/CMakeLists.txt | 2 +- src/fastertransformer/models/swin/Swin.cc | 111 +- src/fastertransformer/models/swin/Swin.h | 113 +- .../models/swin/SwinBasicLayer.cc | 96 +- .../models/swin/SwinBasicLayer.h | 50 +- .../models/swin/SwinBlock.cc | 89 +- src/fastertransformer/models/swin/SwinBlock.h | 38 +- .../models/swin/SwinWeight.h | 16 +- .../models/swin/swin_gemm.cc | 20 +- .../models/swin_int8/CMakeLists.txt | 6 +- .../models/swin_int8/SwinBasicLayerINT8.cc | 105 +- .../models/swin_int8/SwinBasicLayerINT8.h | 72 +- .../models/swin_int8/SwinBlockINT8.cc | 89 +- .../models/swin_int8/SwinBlockINT8.h | 46 +- .../models/swin_int8/SwinINT8.cc | 106 +- .../models/swin_int8/SwinINT8.h | 125 +- .../models/swin_int8/SwinINT8Weight.h | 22 +- .../models/t5/CMakeLists.txt | 10 +- src/fastertransformer/models/t5/T5Decoder.cc | 138 +- src/fastertransformer/models/t5/T5Decoder.h | 69 +- .../models/t5/T5DecoderLayerWeight.cc | 306 ++- .../models/t5/T5DecoderLayerWeight.h | 18 +- src/fastertransformer/models/t5/T5Decoding.cc | 452 +-- src/fastertransformer/models/t5/T5Decoding.h | 163 +- .../models/t5/T5DecodingWeight.cc | 111 +- .../models/t5/T5DecodingWeight.h | 50 +- src/fastertransformer/models/t5/T5Encoder.cc | 281 +- src/fastertransformer/models/t5/T5Encoder.h | 112 +- .../models/t5/T5EncoderLayerWeight.cc | 260 +- .../models/t5/T5EncoderLayerWeight.h | 21 +- .../models/t5/T5EncoderWeight.cc | 104 +- .../models/t5/T5EncoderWeight.h | 48 +- src/fastertransformer/models/t5/t5_gemm.cc | 36 +- .../models/vit/CMakeLists.txt | 4 +- src/fastertransformer/models/vit/ViT.cc | 118 +- src/fastertransformer/models/vit/ViT.h | 97 +- .../models/vit/ViTLayerWeight.h | 132 +- src/fastertransformer/models/vit/ViTWeight.h | 86 +- src/fastertransformer/models/vit/vit_gemm.cc | 18 +- .../models/vit_int8/CMakeLists.txt | 2 +- .../models/vit_int8/ViTINT8.cc | 130 +- .../models/vit_int8/ViTINT8.h | 109 +- .../models/vit_int8/ViTINT8Weight.h | 318 ++- .../models/vit_int8/ViTLayerINT8Weight.h | 445 +-- .../models/xlnet/CMakeLists.txt | 4 +- src/fastertransformer/models/xlnet/Xlnet.cc | 62 +- src/fastertransformer/models/xlnet/Xlnet.h | 43 +- .../models/xlnet/XlnetLayerWeight.h | 98 +- .../models/xlnet/xlnet_gemm.cc | 14 +- .../tensorrt_plugin/swin/serialize.hpp | 2 +- .../swin/swinTransformerINT8Plugin.cpp | 311 ++- .../swin/swinTransformerINT8Plugin.h | 206 +- .../swin/swinTransformerPlugin.cpp | 258 +- .../swin/swinTransformerPlugin.h | 190 +- .../tensorrt_plugin/t5/README.md | 5 +- .../tensorrt_plugin/t5/T5Plugin.cu | 1041 +++---- .../tensorrt_plugin/t5/T5Plugin.h | 423 ++- .../tensorrt_plugin/t5/T5PluginGemm.cc | 34 +- .../tensorrt_plugin/vit/CMakeLists.txt | 3 +- .../tensorrt_plugin/vit/ViTINT8Plugin.cpp | 592 ++++ .../tensorrt_plugin/vit/ViTINT8Plugin.h | 169 ++ .../tensorrt_plugin/vit/ViTPlugin.cpp | 108 +- .../tensorrt_plugin/vit/ViTPlugin.h | 130 +- src/fastertransformer/tf_op/BaseOp.h | 10 +- .../tf_op/bert/BertINT8Op.cc | 38 +- src/fastertransformer/tf_op/bert/BertOp.cc | 39 +- .../tf_op/bert/weight_quantize_op.cc | 66 +- .../tf_op/decoder/DecoderOp.cc | 41 +- .../tf_op/decoder/FusedSelfAttentionOp.cc | 55 +- .../tf_op/decoding/DecodingOp.cc | 59 +- .../tf_op/encoder/EncoderOp.cc | 24 +- src/fastertransformer/tf_op/gpt/GptOp.cc | 135 +- src/fastertransformer/th_op/CMakeLists.txt | 10 +- .../th_op/bert/BertINT8Op.cc | 46 +- src/fastertransformer/th_op/bert/BertINT8Op.h | 86 +- src/fastertransformer/th_op/bert/BertOp.cc | 97 +- src/fastertransformer/th_op/bert/BertOp.h | 168 +- .../th_op/bert/CMakeLists.txt | 2 +- .../th_op/bert/WeightQuantizeOp.cc | 10 +- .../th_op/decoder/DecoderOp.cc | 28 +- .../th_op/decoder/DecoderOp.h | 73 +- .../th_op/decoding/DecodingOp.cc | 81 +- .../th_op/decoding/DecodingOp.h | 127 +- .../th_op/decoding/GatherTreeOp.cc | 10 +- .../th_op/encoder/EncoderOp.cc | 58 +- .../th_op/encoder/EncoderOp.h | 95 +- src/fastertransformer/th_op/gpt/GptOp.cc | 122 +- src/fastertransformer/th_op/gpt/GptOp.h | 281 +- .../th_op/longformer/LongformerEncoderOp.cc | 41 +- .../th_op/longformer/LongformerEncoderOp.h | 24 +- .../th_op/multi_gpu_gpt/CMakeLists.txt | 3 +- .../th_op/multi_gpu_gpt/ParallelGptOp.cc | 157 +- .../th_op/multi_gpu_gpt/ParallelGptOp.h | 421 ++- .../WeightTransposeCalibrateQuantizeOp.cc | 10 +- .../th_op/swin/SwinINT8Op.cc | 106 +- src/fastertransformer/th_op/swin/SwinINT8Op.h | 172 +- src/fastertransformer/th_op/swin/SwinOp.cc | 115 +- src/fastertransformer/th_op/swin/SwinOp.h | 185 +- .../th_op/swin/WeightQuantizeOp.cc | 6 +- src/fastertransformer/th_op/t5/CMakeLists.txt | 2 +- src/fastertransformer/th_op/t5/T5DecoderOp.cc | 147 +- src/fastertransformer/th_op/t5/T5DecoderOp.h | 256 +- .../th_op/t5/T5DecodingOp.cc | 302 +- src/fastertransformer/th_op/t5/T5DecodingOp.h | 559 ++-- src/fastertransformer/th_op/t5/T5EncoderOp.cc | 204 +- src/fastertransformer/th_op/t5/T5EncoderOp.h | 386 ++- src/fastertransformer/th_op/th_utils.cu | 31 +- src/fastertransformer/th_op/th_utils.h | 3 + src/fastertransformer/th_op/vit/ViTINT8Op.cc | 58 +- src/fastertransformer/th_op/vit/ViTINT8Op.h | 152 +- src/fastertransformer/th_op/vit/ViTOp.cc | 54 +- src/fastertransformer/th_op/vit/ViTOp.h | 134 +- .../th_op/vit/WeightQuantizeOp.cc | 4 +- .../triton_backend/CMakeLists.txt | 13 +- .../triton_backend/bert/BertTritonModel.cc | 225 ++ .../triton_backend/bert/BertTritonModel.h | 70 + .../bert/BertTritonModelInstance.cc | 144 + .../bert/BertTritonModelInstance.h | 62 + .../triton_backend/bert/CMakeLists.txt | 24 + .../triton_backend/gptj/CMakeLists.txt | 2 +- .../triton_backend/gptj/GptJTritonModel.cc | 364 ++- .../triton_backend/gptj/GptJTritonModel.h | 93 +- .../gptj/GptJTritonModelInstance.cc | 150 +- .../gptj/GptJTritonModelInstance.h | 49 +- .../triton_backend/gptneox/CMakeLists.txt | 24 + .../gptneox/GptNeoXTritonModel.cc | 234 ++ .../gptneox/GptNeoXTritonModel.h | 82 + .../gptneox/GptNeoXTritonModelInstance.cc | 239 ++ .../gptneox/GptNeoXTritonModelInstance.h | 78 + .../multi_gpu_gpt/CMakeLists.txt | 2 +- .../multi_gpu_gpt/ParallelGptTritonModel.cc | 392 ++- .../multi_gpu_gpt/ParallelGptTritonModel.h | 94 +- .../ParallelGptTritonModelInstance.cc | 167 +- .../ParallelGptTritonModelInstance.h | 50 +- .../triton_backend/t5/CMakeLists.txt | 2 +- .../triton_backend/t5/T5TritonModel.cc | 410 ++- .../triton_backend/t5/T5TritonModel.h | 49 +- .../t5/T5TritonModelInstance.cc | 76 +- .../triton_backend/t5/T5TritonModelInstance.h | 46 +- .../transformer_triton_backend.cpp | 76 + .../transformer_triton_backend.hpp | 114 +- .../triton_backend/triton_utils.hpp | 21 +- src/fastertransformer/utils/CMakeLists.txt | 15 +- src/fastertransformer/utils/ScaleList.h | 8 +- src/fastertransformer/utils/Tensor.cc | 422 +++ src/fastertransformer/utils/Tensor.h | 401 +-- src/fastertransformer/utils/allocator.h | 167 +- src/fastertransformer/utils/conv2d.h | 37 +- .../utils/convert_data_type.h | 2 +- src/fastertransformer/utils/cublasAlgoMap.cc | 44 +- src/fastertransformer/utils/cublasAlgoMap.h | 24 +- .../utils/cublasINT8MMWrapper.cc | 154 +- .../utils/cublasINT8MMWrapper.h | 62 +- .../utils/cublasMMWrapper.cc | 400 +-- src/fastertransformer/utils/cublasMMWrapper.h | 230 +- src/fastertransformer/utils/cuda_utils.h | 162 +- src/fastertransformer/utils/custom_ar_comm.cc | 46 +- src/fastertransformer/utils/custom_ar_comm.h | 20 +- src/fastertransformer/utils/gemm.cc | 470 ++-- src/fastertransformer/utils/gemm.h | 388 +-- .../utils/gemm_test/decoding_gemm_func.cc | 172 +- .../utils/gemm_test/decoding_gemm_func.h | 34 +- .../utils/gemm_test/encoder_gemm_func.cc | 167 +- .../utils/gemm_test/encoder_gemm_func.h | 9 +- .../utils/gemm_test/encoder_igemm_func.cc | 352 +-- .../utils/gemm_test/encoder_igemm_func.h | 46 +- .../utils/gemm_test/gemm_func.cc | 380 +-- .../utils/gemm_test/gemm_func.h | 68 +- .../utils/gemm_test/gpt_gemm_func.cc | 272 +- .../utils/gemm_test/gpt_gemm_func.h | 34 +- .../utils/gemm_test/swin_gemm_func.cc | 104 +- .../utils/gemm_test/swin_igemm_func.cc | 68 +- .../utils/gemm_test/t5_gemm_func.cc | 366 +-- .../utils/gemm_test/t5_gemm_func.h | 56 +- .../utils/gemm_test/xlnet_gemm_func.cc | 278 +- .../utils/gemm_test/xlnet_gemm_func.h | 14 +- src/fastertransformer/utils/logger.h | 20 +- src/fastertransformer/utils/memory_utils.cu | 217 +- src/fastertransformer/utils/memory_utils.h | 36 +- src/fastertransformer/utils/mpi_utils.cc | 122 + src/fastertransformer/utils/mpi_utils.h | 67 +- src/fastertransformer/utils/nccl_utils.cc | 295 +- src/fastertransformer/utils/nccl_utils.h | 77 +- src/fastertransformer/utils/nvtx_utils.h | 8 +- src/fastertransformer/utils/prompt_learning.h | 29 + src/fastertransformer/utils/string_utils.h | 5 +- src/fastertransformer/utils/word_list.cc | 6 +- tests/bert/tf_bert_unit_test.py | 246 +- tests/bert/th_bert_unit_test.py | 84 +- .../GPU-batch_to_compact_idx.npy | Bin 0 -> 96 bytes .../GPU-compact_idx.npy | Bin 0 -> 96 bytes .../GPU-context_decoder_input.npy | Bin 0 -> 294992 bytes .../GPU-input_attention_mask.npy | Bin 0 -> 5264 bytes .../GPU-tiled_input_lengths.npy | Bin 0 -> 96 bytes tests/decoding/tf_decoding_unit_test.py | 72 +- ...used_self_multihead_attention_unit_test.py | 4 +- tests/longformer/py_longformer_unit_test.py | 73 +- tests/unittests/CMakeLists.txt | 29 +- tests/unittests/test_activation.cu | 120 + tests/unittests/test_context_decoder_layer.cu | 263 ++ tests/unittests/test_gemm.cu | 4 +- tests/unittests/test_gpt_kernels.cu | 338 +++ tests/unittests/test_logprob_kernels.cu | 230 +- tests/unittests/test_penalty_kernels.cu | 872 ++++++ tests/unittests/test_sampling.cu | 1133 ++++++-- tests/unittests/test_sampling_kernels.cu | 908 ++++++ tests/unittests/test_tensor.cu | 262 ++ tests/unittests/unittest_utils.h | 192 ++ 604 files changed, 57827 insertions(+), 29517 deletions(-) delete mode 100644 .gitlab-ci.yml delete mode 100644 .gitlab/issue_templates/bug.md delete mode 100644 .gitlab/issue_templates/feature.md delete mode 100644 .gitlab/merge_request_templates/merge.md create mode 100644 benchmarks/bert/pyt_tp_benchmark.sh create mode 100644 benchmarks/gpt/cpp_benchmark.sh create mode 100644 docker/Dockerfile.tf create mode 100644 docker/Dockerfile.torch create mode 100644 docs/gptneox_guide.md create mode 100644 docs/images/gpt/gpt_interactive_generation.0.png create mode 100644 docs/images/gpt/gpt_interactive_generation.1.png create mode 100644 docs/images/gpt/gpt_interactive_generation.2.png create mode 100644 examples/__init__.py create mode 100644 examples/cpp/bert/bert_config.ini create mode 100644 examples/cpp/bert/bert_triton_example.cc create mode 100644 examples/cpp/gptneox/CMakeLists.txt create mode 100644 examples/cpp/gptneox/bad_words.csv create mode 100644 examples/cpp/gptneox/gptneox_config.ini create mode 100644 examples/cpp/gptneox/gptneox_example.cc create mode 100644 examples/cpp/gptneox/gptneox_triton_example.cc create mode 100644 examples/cpp/gptneox/start_ids.csv create mode 100644 examples/cpp/gptneox/stop_words.csv create mode 100644 examples/cpp/multi_gpu_gpt/concat_interactive_ids.csv create mode 100644 examples/cpp/multi_gpu_gpt/interactive_inputs_ids.csv create mode 100644 examples/cpp/multi_gpu_gpt/multi_gpu_gpt_interactive_example.cc create mode 100644 examples/pytorch/__init__.py create mode 100644 examples/pytorch/bert/utils/huggingface_bert_convert.py create mode 100644 examples/pytorch/bert/utils/update_bert_config.py create mode 100644 examples/pytorch/decoding/utils/bleu_score.py create mode 100644 examples/pytorch/gpt/duplicate_input_ids.txt create mode 100644 examples/pytorch/gpt/lambada_task_example.py create mode 100644 examples/pytorch/gpt/opt_summarization.py create mode 100644 examples/pytorch/gpt/utils/huggingface_opt_convert.py create mode 100644 examples/pytorch/gpt/utils/update_gpt_config.py create mode 100644 examples/pytorch/gptj/utils/generate_gptj_config.py create mode 100644 examples/pytorch/gptj/utils/huggingface_gptj_ckpt_convert.py create mode 100755 examples/pytorch/gptneox/utils/eleutherai_gpt_neox_convert.py create mode 100755 examples/pytorch/gptneox/utils/hftokenizer.py create mode 100644 examples/pytorch/gptneox/utils/huggingface_jp_gptneox_convert.py create mode 100644 examples/pytorch/nemo.py create mode 100644 examples/pytorch/t5/mnli_task_example.py create mode 100644 examples/pytorch/t5/summarization.py create mode 100644 examples/pytorch/t5/xnli_task_example.py create mode 100644 examples/pytorch/tokenizer.py create mode 100644 examples/tensorrt/vit/infer_visiontransformer_int8_plugin.py create mode 100644 examples/tensorrt/vit/plugin_loader_int8.py create mode 100644 src/fastertransformer/kernels/decoder_masked_multihead_attention/decoder_masked_multihead_attention_128.cu create mode 100644 src/fastertransformer/kernels/decoder_masked_multihead_attention/decoder_masked_multihead_attention_160.cu create mode 100644 src/fastertransformer/kernels/decoder_masked_multihead_attention/decoder_masked_multihead_attention_192.cu create mode 100644 src/fastertransformer/kernels/decoder_masked_multihead_attention/decoder_masked_multihead_attention_224.cu create mode 100644 src/fastertransformer/kernels/decoder_masked_multihead_attention/decoder_masked_multihead_attention_256.cu create mode 100644 src/fastertransformer/kernels/decoder_masked_multihead_attention/decoder_masked_multihead_attention_32.cu create mode 100644 src/fastertransformer/kernels/decoder_masked_multihead_attention/decoder_masked_multihead_attention_64.cu create mode 100644 src/fastertransformer/kernels/decoder_masked_multihead_attention/decoder_masked_multihead_attention_80.cu create mode 100644 src/fastertransformer/kernels/decoder_masked_multihead_attention/decoder_masked_multihead_attention_96.cu create mode 100644 src/fastertransformer/kernels/decoder_masked_multihead_attention/decoder_masked_multihead_attention_template.hpp create mode 100644 src/fastertransformer/layers/TensorParallelSiluFfnLayer.cc create mode 100644 src/fastertransformer/layers/TensorParallelSiluFfnLayer.h create mode 100644 src/fastertransformer/models/BaseWeight.h create mode 100644 src/fastertransformer/models/gptneox/CMakeLists.txt create mode 100644 src/fastertransformer/models/gptneox/GptNeoX.cc create mode 100644 src/fastertransformer/models/gptneox/GptNeoX.h create mode 100644 src/fastertransformer/models/gptneox/GptNeoXContextDecoder.cc create mode 100644 src/fastertransformer/models/gptneox/GptNeoXContextDecoder.h create mode 100644 src/fastertransformer/models/gptneox/GptNeoXDecoder.cc create mode 100644 src/fastertransformer/models/gptneox/GptNeoXDecoder.h create mode 100644 src/fastertransformer/models/gptneox/GptNeoXDecoderLayerWeight.cc create mode 100644 src/fastertransformer/models/gptneox/GptNeoXDecoderLayerWeight.h create mode 100644 src/fastertransformer/models/gptneox/GptNeoXWeight.cc create mode 100644 src/fastertransformer/models/gptneox/GptNeoXWeight.h create mode 100644 src/fastertransformer/tensorrt_plugin/vit/ViTINT8Plugin.cpp create mode 100644 src/fastertransformer/tensorrt_plugin/vit/ViTINT8Plugin.h create mode 100644 src/fastertransformer/triton_backend/bert/BertTritonModel.cc create mode 100644 src/fastertransformer/triton_backend/bert/BertTritonModel.h create mode 100644 src/fastertransformer/triton_backend/bert/BertTritonModelInstance.cc create mode 100644 src/fastertransformer/triton_backend/bert/BertTritonModelInstance.h create mode 100644 src/fastertransformer/triton_backend/bert/CMakeLists.txt create mode 100644 src/fastertransformer/triton_backend/gptneox/CMakeLists.txt create mode 100644 src/fastertransformer/triton_backend/gptneox/GptNeoXTritonModel.cc create mode 100644 src/fastertransformer/triton_backend/gptneox/GptNeoXTritonModel.h create mode 100644 src/fastertransformer/triton_backend/gptneox/GptNeoXTritonModelInstance.cc create mode 100644 src/fastertransformer/triton_backend/gptneox/GptNeoXTritonModelInstance.h create mode 100644 src/fastertransformer/triton_backend/transformer_triton_backend.cpp create mode 100644 src/fastertransformer/utils/Tensor.cc create mode 100644 src/fastertransformer/utils/mpi_utils.cc create mode 100644 src/fastertransformer/utils/prompt_learning.h create mode 100644 tests/data/gpt_context_decoder_inputs/GPU-batch_to_compact_idx.npy create mode 100644 tests/data/gpt_context_decoder_inputs/GPU-compact_idx.npy create mode 100644 tests/data/gpt_context_decoder_inputs/GPU-context_decoder_input.npy create mode 100644 tests/data/gpt_context_decoder_inputs/GPU-input_attention_mask.npy create mode 100644 tests/data/gpt_context_decoder_inputs/GPU-tiled_input_lengths.npy create mode 100644 tests/unittests/test_activation.cu create mode 100644 tests/unittests/test_context_decoder_layer.cu create mode 100644 tests/unittests/test_gpt_kernels.cu create mode 100644 tests/unittests/test_penalty_kernels.cu create mode 100644 tests/unittests/test_sampling_kernels.cu create mode 100644 tests/unittests/test_tensor.cu create mode 100644 tests/unittests/unittest_utils.h diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml deleted file mode 100644 index 1dd8e6429..000000000 --- a/.gitlab-ci.yml +++ /dev/null @@ -1,256 +0,0 @@ -stages: - - build - - test - -build_pyt_release: - image: nvcr.io/nvidia/pytorch:21.02-py3 - tags: - - fastertransformer - stage: build - only: - - main - - merge_requests - artifacts: - paths: - - ${CI_PROJECT_DIR}/build/ - expire_in: 1 week - script: - - cd ${CI_PROJECT_DIR} && mkdir build && cd build - - git submodule init && git submodule update - - cmake -DSM=xx -DCMAKE_BUILD_TYPE=Release -DBUILD_PYT=ON -DBUILD_GPT=ON .. - - make -j12 - -build_pyt_release_sparse: - image: nvcr.io/nvidia/pytorch:21.02-py3 - tags: - - fastertransformer - stage: build - only: - - main - - merge_requests - artifacts: - paths: - - ${CI_PROJECT_DIR}/build/ - expire_in: 1 week - script: - - cd ${CI_PROJECT_DIR} && mkdir build && cd build - - git submodule init && git submodule update - - wget https://developer.download.nvidia.com/compute/libcusparse-lt/0.1.0/local_installers/libcusparse_lt-linux-x86_64-0.1.0.2.tar.gz - - tar -xzvf libcusparse_lt-linux-x86_64-0.1.0.2.tar.gz - - cmake -DSM=xx -DCMAKE_BUILD_TYPE=Release -DBUILD_PYT=ON -DSPARSITY_SUPPORT=ON -DCUSPARSELT_PATH=${CI_PROJECT_DIR}/build/libcusparse_lt/ .. - - make -j12 - -build_tf_release: - image: nvcr.io/nvidia/tensorflow:21.02-tf1-py3 - tags: - - fastertransformer - stage: build - only: - - main - - merge_requests - artifacts: - paths: - - ${CI_PROJECT_DIR}/build/ - expire_in: 1 week - script: - - cd ${CI_PROJECT_DIR} && mkdir build && cd build - - git submodule init && git submodule update - - cmake -DSM=xx -DCMAKE_BUILD_TYPE=Release -DBUILD_TF=ON -DTF_PATH=/usr/local/lib/python3.8/dist-packages/tensorflow_core/ -DBUILD_GPT=ON .. - - make -j12 - - apt-get update && apt-get install bc - -# 1. Get accuracy on LAMBADA dataset -# 2. Run pytorch gpt op as basline -# 3. Run pytorch piepline parallel and compare difference with baseline -# 4. Run pytorch tensor parallel and compare difference with baseline -pyt_gpt_test: - image: nvcr.io/nvidia/pytorch:21.02-py3 - tags: - - fastertransformer - stage: test - only: - - main - - merge_requests - needs: - - job: build_pyt_release - artifacts: true - script: - - cd ${CI_PROJECT_DIR}/build/ - - git submodule init && git submodule update - - export PYTHONPATH="${CI_PROJECT_DIR}/:$PYTHONPATH" - - export NVIDIA_TF32_OVERRIDE=0 # Disable the TF32 - - export CUDA_VISIBLE_DEVICES=0 - - wget https://s3.amazonaws.com/models.huggingface.co/bert/gpt2-vocab.json -P ../models - - wget https://s3.amazonaws.com/models.huggingface.co/bert/gpt2-merges.txt -P ../models - - wget --content-disposition https://api.ngc.nvidia.com/v2/models/nvidia/megatron_lm_345m/versions/v0.0/zip -O megatron_lm_345m_v0.0.zip - - wget https://github.com/cybertronai/bflm/raw/master/lambada_test.jsonl -P ../models/megatron-models - - unzip megatron_lm_345m_v0.0.zip -d ../models/megatron-models/345m - - python ../examples/pytorch/gpt/utils/megatron_ckpt_convert.py -head_num 16 -i ../models/megatron-models/345m/release/ -o ../models/megatron-models/c-model/345m/ -t_g 1 -i_g 1 - - bash ../examples/pytorch/gpt/scripts/evaluate_zeroshot_gpt.sh - - python ../examples/pytorch/gpt/gpt_example.py --ckpt_path=../models/megatron-models/c-model/345m/1-gpu/ --top_p 0.5 --sample_output_file single-gpu-out.txt - - export CUDA_VISIBLE_DEVICES=0,1 - - mpirun -n 2 --allow-run-as-root python ../examples/pytorch/gpt/multi_gpu_gpt_example.py --tensor_para_size=1 --pipeline_para_size=2 --ckpt_path=../models/megatron-models/c-model/345m/1-gpu/ --top_p 0.5 --sample_output_file pipeline-parallel-2-gpu-out.txt - - diff single-gpu-out.txt pipeline-parallel-2-gpu-out.txt - - python ../examples/pytorch/gpt/utils/megatron_ckpt_convert.py -head_num 16 -i ../models/megatron-models/345m/release/ -o ../models/megatron-models/c-model/345m/ -t_g 1 -i_g 2 - - mpirun -n 2 --allow-run-as-root python ../examples/pytorch/gpt/multi_gpu_gpt_example.py --tensor_para_size=2 --pipeline_para_size=1 --ckpt_path=../models/megatron-models/c-model/345m/2-gpu/ --top_p 0.5 --sample_output_file tensor-parallel-2-gpu-out.txt - - diff single-gpu-out.txt tensor-parallel-2-gpu-out.txt - timeout: 4h 30m - -tf_test: - image: nvcr.io/nvidia/tensorflow:21.02-tf1-py3 - tags: - - fastertransformer - stage: test - only: - - main - - merge_requests - needs: - - job: build_tf_release - artifacts: true - script: - - cd ${CI_PROJECT_DIR}/build/ - - apt-get update && apt-get install bc - - export PYTHONPATH="${CI_PROJECT_DIR}/:$PYTHONPATH" - - export NVIDIA_TF32_OVERRIDE=0 # Disable the TF32 - - export CUDA_VISIBLE_DEVICES=0 - - bash ${CI_PROJECT_DIR}/examples/tensorflow/decoding/utils/translation/download_model_data.sh - - mkdir -p ${CI_PROJECT_DIR}/translation/ckpt_fp16 - - python ${CI_PROJECT_DIR}/tests/bert/tf_bert_unit_test.py - - python ${CI_PROJECT_DIR}/tests/bert/tf_encoder_unit_test.py - - python ${CI_PROJECT_DIR}/examples/tensorflow/ckpt_type_convert.py --init_checkpoint=${CI_PROJECT_DIR}/translation/ckpt/model.ckpt-500000 --fp16_checkpoint=${CI_PROJECT_DIR}/translation/ckpt_fp16/model.ckpt-500000 - - python ${CI_PROJECT_DIR}/tests/decoding/tf_decoding_unit_test.py - timeout: 4h 30m - -tf_xlnet_test: - image: nvcr.io/nvidia/tensorflow:21.02-tf1-py3 - tags: - - fastertransformer - stage: test - only: - - master - - v4.1 - - main - - merge_requests - needs: - - job: build_tf_release - artifacts: true - script: - - cd ${CI_PROJECT_DIR}/examples/tensorflow/xlnet - - bash downloadModel.sh - - bash verifyCorrectness.sh # For FP32 model - -pyt_sp_test: - image: nvcr.io/nvidia/pytorch:21.02-py3 - tags: - - fastertransformer - stage: test - only: - - main - - merge_requests - needs: - - job: build_pyt_release_sparse - artifacts: true - script: - - cd ${CI_PROJECT_DIR}/build/ - - export PYTHONPATH="${CI_PROJECT_DIR}/:$PYTHONPATH" - - export NVIDIA_TF32_OVERRIDE=0 # Disable the TF32 - - export CUDA_VISIBLE_DEVICES=0 - - pip install transformers==2.5.1 - # GOS has no Ampere GPU, so no sparse tests can be done. only test some dense cases - - ${CI_PROJECT_DIR}/build/bin/bert_gemm 32 64 12 64 1 0 - - python ${CI_PROJECT_DIR}/examples/pytorch/bert/bert_example.py 32 12 64 12 64 --fp16 - - ${CI_PROJECT_DIR}/build/bin/bert_gemm 32 64 12 64 1 1 - - python ${CI_PROJECT_DIR}/examples/pytorch/bert/bert_example.py 32 12 64 12 64 --fp16 --int8_mode 1 - - python ${CI_PROJECT_DIR}/examples/pytorch/bert/bert_example.py 32 12 64 12 64 --fp16 --int8_mode 2 - - python ${CI_PROJECT_DIR}/examples/pytorch/bert/bert_example.py 32 12 64 12 64 --fp16 --int8_mode 3 - -pyt_longformer_test: - image: nvcr.io/nvidia/pytorch:21.02-py3 - tags: - - fastertransformer - stage: test - only: - - main - - merge_requests - needs: - - job: build_pyt_release - artifacts: true - script: - - cd ${CI_PROJECT_DIR}/examples/pytorch/longformer - - apt-get update && apt-get install git-lfs - - git lfs install - - git config lfs.fetchinclude "pytorch_model.bin,config.json" - - git clone https://huggingface.co/allenai/longformer-large-4096-finetuned-triviaqa - - cd ${CI_PROJECT_DIR} - - export PYTHONPATH="${CI_PROJECT_DIR}/:$PYTHONPATH" - - export NVIDIA_TF32_OVERRIDE=0 # Disable the TF32 - - export CUDA_VISIBLE_DEVICES=0 - - pip install transformers==4.8.2 - - python3 tests/longformer/py_longformer_unit_test.py - -pyt_decoding_test: - image: nvcr.io/nvidia/pytorch:21.02-py3 - tags: - - fastertransformer - stage: test - only: - - main - - merge_requests - needs: - - job: build_pyt_release - artifacts: true - script: - - cd ${CI_PROJECT_DIR}/build/ - - export PYTHONPATH="${CI_PROJECT_DIR}/:$PYTHONPATH" - - export NVIDIA_TF32_OVERRIDE=0 # Disable the TF32 - - export CUDA_VISIBLE_DEVICES=0 - - apt-get update && apt-get install bc - - pip install sacrebleu - - pip install opennmt-py==1.1.1 - - bash ../examples/pytorch/decoding/utils/download_model.sh - - mkdir pytorch/translation/data -p - - cp ../examples/tensorflow/decoding/utils/translation/test* pytorch/translation/data - - python ../examples/pytorch/decoding/utils/recover_bpe.py pytorch/translation/data/test.de debpe_ref.txt - - echo "Run decoding fp32" # decoding fp32 testing - - python ../examples/pytorch/decoding/translate_example.py --batch_size 128 --beam_size 4 --model_type decoding_ext --decoding_ths_path ./lib/libth_decoding.so --data_type fp32 --output_file output.txt - - python ../examples/pytorch/decoding/utils/recover_bpe.py output.txt debpe_output.txt - - cat debpe_output.txt | sacrebleu debpe_ref.txt - - echo "Run decoder fp32" # decoder fp32 testing - - python ../examples/pytorch/decoding/translate_example.py --batch_size 128 --beam_size 4 --model_type torch_decoding_with_decoder_ext --decoder_ths_path ./lib/libth_decoder.so --data_type fp32 --output_file output.txt - - python ../examples/pytorch/decoding/utils/recover_bpe.py output.txt debpe_output.txt - - cat debpe_output.txt | sacrebleu debpe_ref.txt - - echo "Run decoding fp16" # decoding fp16 testing - - python ../examples/pytorch/decoding/translate_example.py --batch_size 128 --beam_size 4 --model_type decoding_ext --decoding_ths_path ./lib/libth_decoding.so --data_type fp16 --output_file output.txt - - python ../examples/pytorch/decoding/utils/recover_bpe.py output.txt debpe_output.txt - - cat debpe_output.txt | sacrebleu debpe_ref.txt - - echo "Run decoder fp16" # decoder fp16 testing - - python ../examples/pytorch/decoding/translate_example.py --batch_size 128 --beam_size 4 --model_type torch_decoding_with_decoder_ext --decoder_ths_path ./lib/libth_decoder.so --data_type fp16 --output_file output.txt - - python ../examples/pytorch/decoding/utils/recover_bpe.py output.txt debpe_output.txt - - cat debpe_output.txt | sacrebleu debpe_ref.txt - timeout: 4h - -t5_test: - image: nvcr.io/nvidia/pytorch:21.02-py3 - tags: - - fastertransformer - stage: test - only: - - main - - merge_requests - needs: - - job: build_pyt_release - artifacts: true - script: - - cd ${CI_PROJECT_DIR}/build/ - - export PYTHONPATH="${CI_PROJECT_DIR}/:$PYTHONPATH" - - export NVIDIA_TF32_OVERRIDE=0 # Disable the TF32 - - export CUDA_VISIBLE_DEVICES=0 - - apt-get update && apt-get install bc - - pip install transformers huggingface_hub tokenizers sacrebleu SentencePiece - - python ../examples/pytorch/t5/translate_example.py -batch 32 -time 0123 - - python ../examples/pytorch/t5/translate_example.py -batch 32 -time 0123 -d fp16 - - python ../examples/pytorch/t5/translate_example.py -batch 4 -time 0123 -d fp16 --model t5-3b - - export CUDA_VISIBLE_DEVICES=0,2 - - mpirun -n 2 --allow-run-as-root python ../examples/pytorch/t5/translate_example.py -batch 4 -time 13 -d fp16 --model t5-3b --tensor_para_size 2 - - mpirun -n 2 --allow-run-as-root python ../examples/pytorch/t5/translate_example.py -batch 4 -time 13 -d fp16 --model t5-3b --pipeline_para_size 2 - timeout: 4h diff --git a/.gitlab/issue_templates/bug.md b/.gitlab/issue_templates/bug.md deleted file mode 100644 index 5a9897a27..000000000 --- a/.gitlab/issue_templates/bug.md +++ /dev/null @@ -1,6 +0,0 @@ -Bug title: - -Description: - -Assign: -/assign diff --git a/.gitlab/issue_templates/feature.md b/.gitlab/issue_templates/feature.md deleted file mode 100644 index d876df20e..000000000 --- a/.gitlab/issue_templates/feature.md +++ /dev/null @@ -1,6 +0,0 @@ -Feature title: - -Description: - -Assign: -/assign @bhsueh @juney diff --git a/.gitlab/merge_request_templates/merge.md b/.gitlab/merge_request_templates/merge.md deleted file mode 100644 index 28f9a0b34..000000000 --- a/.gitlab/merge_request_templates/merge.md +++ /dev/null @@ -1,7 +0,0 @@ -Related Issue: Closed # - -Assign: -/assign @bhsueh - -Reviewers: -/assign_reviewer @yudong @jkosek @pziecina @juney diff --git a/3rdparty/INIReader.h b/3rdparty/INIReader.h index 8edc6dfdd..7d40f0638 100644 --- a/3rdparty/INIReader.h +++ b/3rdparty/INIReader.h @@ -316,7 +316,7 @@ class INIReader // Construct INIReader and parse given file. See ini.h for more info // about the parsing. INIReader(FILE *file); - + ~INIReader(); // Return the result of ini_parse(), i.e., 0 on success, line number of // first error on parse error, or -1 on file open error. int ParseError() const; @@ -384,6 +384,8 @@ inline int INIReader::ParseError() const return _error; } +inline INIReader::~INIReader() { } + inline const std::set& INIReader::Sections() const { return _sections; diff --git a/3rdparty/trt_fused_multihead_attention/fused_multihead_attention.h b/3rdparty/trt_fused_multihead_attention/fused_multihead_attention.h index 4daf9de93..b058e1e2e 100644 --- a/3rdparty/trt_fused_multihead_attention/fused_multihead_attention.h +++ b/3rdparty/trt_fused_multihead_attention/fused_multihead_attention.h @@ -313,8 +313,15 @@ class TFusedMHAKernelFactory static TFusedMHAKernelFactory& Get() { - static TFusedMHAKernelFactory s_factory; - return s_factory; + int device_id; + cudaGetDevice(&device_id); + static std::unique_ptr> s_factory[32] = {nullptr}; + if (s_factory[device_id] == nullptr) { + assert(device_id <= 32); + s_factory[device_id] = std::make_unique>(TFusedMHAKernelFactory()); + } + + return *(s_factory[device_id]); } private: diff --git a/3rdparty/trt_fused_multihead_attention/qkvToContext.cu b/3rdparty/trt_fused_multihead_attention/qkvToContext.cu index 6b5c448f4..b5d86df09 100644 --- a/3rdparty/trt_fused_multihead_attention/qkvToContext.cu +++ b/3rdparty/trt_fused_multihead_attention/qkvToContext.cu @@ -24,16 +24,28 @@ namespace fastertransformer { +union __half2_uint32_t_union { + half2 fp162; + uint32_t u32; +}; +union __float_uint32_t_union { + float fp32; + uint32_t u32; +}; + static inline void set_alpha(uint32_t& alpha, float norm, Data_type dtype) { if (dtype == DATA_TYPE_FP16) { - half2 h2 = __float2half2_rn(norm); - alpha = reinterpret_cast(h2); + __half2_uint32_t_union temp; + temp.fp162 = __float2half2_rn(norm); + alpha = temp.u32; } else if (dtype == DATA_TYPE_FP32) { - alpha = reinterpret_cast(norm); + __float_uint32_t_union temp; + temp.fp32 = norm; + alpha = temp.u32; } else if (dtype == DATA_TYPE_INT32) { @@ -365,7 +377,7 @@ public: void setup(const int S, const int B, const int window_num) { - size_t warps_m, warps_n, warps_k = 1; + size_t warps_m = 1, warps_n = 1, warps_k = 1; if (S == 64) { warps_m = 2; warps_n = 2; @@ -413,9 +425,14 @@ public: float scaleBmm2 = scaleCtx; float scaleSoftmax = interface->mDqProbs; - params.scale_bmm1 = reinterpret_cast(scaleBmm1); - params.scale_bmm2 = reinterpret_cast(scaleBmm2); - params.scale_softmax = reinterpret_cast(scaleSoftmax); + __float_uint32_t_union temp; + + temp.fp32 = scaleBmm1; + params.scale_bmm1 = temp.u32; + temp.fp32 = scaleBmm2; + params.scale_bmm2 = temp.u32; + temp.fp32 = scaleSoftmax; + params.scale_softmax = temp.u32; params.enable_i2f_trick = -double(1 << 22) * double(scaleBmm2) <= -128.f && double(1 << 22) * double(scaleBmm2) >= 127.f; @@ -446,7 +463,7 @@ public: void setup(const int S, const int B) { - size_t warps_m, warps_n, warps_k = 1; + size_t warps_m = 1, warps_n = 1, warps_k = 1; if ((sm == 75 || sm == 80) && S == 64) { warps_m = 2; @@ -495,9 +512,14 @@ public: float scaleBmm2 = interface->mDqProbs * scaleQkv / scaleCtx; float scaleSoftmax = 1.f / interface->mDqProbs; - params.scale_bmm1 = reinterpret_cast(scaleBmm1); - params.scale_bmm2 = reinterpret_cast(scaleBmm2); - params.scale_softmax = reinterpret_cast(scaleSoftmax); + __float_uint32_t_union temp; + + temp.fp32 = scaleBmm1; + params.scale_bmm1 = temp.u32; + temp.fp32 = scaleBmm2; + params.scale_bmm2 = temp.u32; + temp.fp32 = scaleSoftmax; + params.scale_softmax = temp.u32; params.enable_i2f_trick = -double(1 << 22) * double(scaleBmm2) <= -128.f && double(1 << 22) * double(scaleBmm2) >= 127.f; diff --git a/CMakeLists.txt b/CMakeLists.txt index 43f64f4d4..76a5e0655 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -33,6 +33,8 @@ endif() option(SPARSITY_SUPPORT "Build project with Ampere sparsity feature support" OFF) +option(BUILD_FAST_MATH "Build in fast math mode" ON) + if(BUILD_MULTI_GPU) message(STATUS "Add DBUILD_MULTI_GPU, requires MPI and NCCL") add_definitions("-DBUILD_MULTI_GPU") @@ -157,6 +159,10 @@ set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} --std=c++${CXX_STD}") set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3") # set(CMAKE_CUDA_FLAGS_RELEASE "${CMAKE_CUDA_FLAGS_RELEASE} -Xcompiler -O3 --ptxas-options=--verbose") set(CMAKE_CUDA_FLAGS_RELEASE "${CMAKE_CUDA_FLAGS_RELEASE} -Xcompiler -O3") +if(BUILD_FAST_MATH) +set(CMAKE_CUDA_FLAGS_RELEASE "${CMAKE_CUDA_FLAGS_RELEASE} --use_fast_math") +message("CMAKE_CUDA_FLAGS_RELEASE: ${CMAKE_CUDA_FLAGS_RELEASE}") +endif() set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) @@ -227,7 +233,10 @@ print(torch._C._GLIBCXX_USE_CXX11_ABI,end='');" endif() endif() -list(APPEND COMMON_HEADER_DIRS ${MPI_INCLUDE_PATH}) +if (BUILD_MULTI_GPU) + list(APPEND COMMON_HEADER_DIRS ${MPI_INCLUDE_PATH}) + list(APPEND COMMON_LIB_DIRS /usr/local/mpi/lib) +endif() if(USE_TRITONSERVER_DATATYPE) list(APPEND COMMON_HEADER_DIRS ${PROJECT_SOURCE_DIR}/../repo-core-src/include) @@ -237,9 +246,6 @@ include_directories( ${COMMON_HEADER_DIRS} ) -# set path of mpi -list(APPEND COMMON_LIB_DIRS /usr/local/mpi/lib) - link_directories( ${COMMON_LIB_DIRS} ) @@ -249,9 +255,16 @@ add_subdirectory(src) add_subdirectory(examples) add_subdirectory(tests) +# # Mesaure the compile time +option(MEASURE_BUILD_TIME "Measure the build time of each module" OFF) +if (MEASURE_BUILD_TIME) + set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "${CMAKE_COMMAND} -E time") + set_property(GLOBAL PROPERTY RULE_LAUNCH_CUSTOM "${CMAKE_COMMAND} -E time") + set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK "${CMAKE_COMMAND} -E time") +endif() + ######################################## -if(BUILD_MULTI_GPU) # Following feature requires cmake 3.15 # TODO Remove this part or modify such that we can run it under cmake 3.10 cmake_minimum_required(VERSION 3.15 FATAL_ERROR) @@ -259,6 +272,8 @@ add_library(transformer-static STATIC $ $ $ + $ + $ $ $ $ @@ -271,6 +286,12 @@ add_library(transformer-static STATIC $ $ $ + $ + $ + $ + $ + $ + $ $ $ $ @@ -285,55 +306,65 @@ add_library(transformer-static STATIC $ $ $ + $ $ $ $ + $ $ $ $ + $ $ $ $ $ $ $ - $ $ $ $ $ $ $ + $ + $ $ $ $ $ $ $ + $ $ $ $ $ + $ $ - $ $ $ $ $ $ $ + $ + $ $ $ $ - $) + $ +) set_property(TARGET transformer-static PROPERTY POSITION_INDEPENDENT_CODE ON) set_property(TARGET transformer-static PROPERTY CUDA_RESOLVE_DEVICE_SYMBOLS ON) -target_link_libraries(transformer-static PUBLIC -lcudart -lnccl -lmpi -lcublas -lcublasLt -lcurand) +target_link_libraries(transformer-static PUBLIC -lcudart -lcublas -lcublasLt -lcurand) add_library(transformer-shared SHARED $ $ $ + $ + $ $ $ $ @@ -346,6 +377,12 @@ add_library(transformer-shared SHARED $ $ $ + $ + $ + $ + $ + $ + $ $ $ $ @@ -360,53 +397,59 @@ add_library(transformer-shared SHARED $ $ $ + $ $ $ $ + $ $ $ $ + $ $ $ $ $ $ $ - $ $ $ $ $ $ $ + $ + $ $ $ $ $ $ $ + $ $ $ $ $ + $ $ - $ - $ - $ $ $ $ $ $ $ + $ + $ $ $ $ - $) + $ +) set_target_properties(transformer-shared PROPERTIES POSITION_INDEPENDENT_CODE ON) set_target_properties(transformer-shared PROPERTIES CUDA_RESOLVE_DEVICE_SYMBOLS ON) set_target_properties(transformer-shared PROPERTIES LINKER_LANGUAGE CXX) -target_link_libraries(transformer-shared PUBLIC -lcudart -lnccl -lmpi -lcublas -lcublasLt -lcurand) +target_link_libraries(transformer-shared PUBLIC -lcudart -lcublas -lcublasLt -lcurand) include(GNUInstallDirs) set(INSTALL_CONFIGDIR ${CMAKE_INSTALL_LIBDIR}/cmake/FasterTransformer) @@ -465,5 +508,3 @@ export( ) export(PACKAGE FasterTransformer) - -endif() # BUILD_MULTI_GPU diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index d511a88b5..9f9403bf0 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -47,4 +47,4 @@ (c) The contribution was provided directly to me by some other person who certified (a), (b) or (c) and I have not modified it. (d) I understand and agree that this project and the contribution are public and that a record of the contribution (including all personal information I submit with it, including my sign-off) is maintained indefinitely and may be redistributed consistent with this project or the open source license(s) involved. - ``` + ``` \ No newline at end of file diff --git a/README.md b/README.md index 45b5374b7..fe94e8f8d 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,8 @@ FasterTransformer is built on top of CUDA, cuBLAS, cuBLASLt and C++. We provide | Models | Framework | FP16 | INT8 (after Turing) | Sparsity (after Ampere) | Tensor parallel | Pipeline parallel | | ---------------- | -------------- | ---- | ------------------- | ----------------------- | --------------- | ----------------- | | BERT | TensorFlow | Yes | Yes | - | - | - | -| BERT | PyTorch | Yes | Yes | Yes | - | - | +| BERT | PyTorch | Yes | Yes | Yes | Yes | Yes | +| BERT | Triton backend | Yes | - | - | Yes | Yes | | XLNet | C++ | Yes | - | - | - | - | | Encoder | TensorFlow | Yes | Yes | - | - | - | | Encoder | PyTorch | Yes | Yes | Yes | - | - | @@ -52,7 +53,8 @@ FasterTransformer is built on top of CUDA, cuBLAS, cuBLASLt and C++. We provide | Swin Transformer | PyTorch | Yes | Yes | - | - | - | | Swin Transformer | TensorRT | Yes | Yes | - | - | - | | ViT | PyTorch | Yes | Yes | - | - | - | -| ViT | TensorRT | Yes | - | - | - | - | +| ViT | TensorRT | Yes | Yes | - | - | - | +| GPT-NeoX | Triton backend | Yes | - | - | Yes | Yes | * Note that the FasterTransformer supports the models above on C++ because all source codes are built on C++. @@ -65,7 +67,7 @@ The following code lists the directory structure of FasterTransformer: ```bash /src/fastertransformer: source code of FasterTransformer |--/models: Implementation of different models, like BERT, GPT. - |--/layers: Implementation of layer modeuls, like attention layer, ffn layer. + |--/layers: Implementation of layer modules, like attention layer, ffn layer. |--/kernels: CUDA kernels for different models/layers and operations, like addBiasResiual. |--/tensorrt_plugin: encapluate FasterTransformer into TensorRT plugin. |--/tf_op: custom Tensorflow OP implementation @@ -181,7 +183,7 @@ In the experiments of decoding, we updated the following parameters: * top_p = 0.9 * tensor parallel size = 8 * input sequence length = 512 -* ouptut sequence length = 32 +* output sequence length = 32
@@ -189,17 +191,45 @@ In the experiments of decoding, we updated the following parameters: ### Changelog +Aug 2022 +- **Release the FasterTransformer 5.1** +- Support for interactive generation +- Support for attention time-limited memory +- Support mt5 and t5-v1.1 + +July 2022 +- Support UL2 huggingface ckpt. ([link](https://huggingface.co/google/ul2)) + - Fix bug of T5 under bfloat16. +- Add ViT INT8 TensorRT Plugin +- Support batch sampling +- Support shared context optimization in GPT model + +June 2022 +- Support streaming generation for triton backend. +- Support OPT. +- Support multi-node multi-GPU BERT under FP32, FP16 and BF16. + +May 2022 +- Support bfloat16 on most models. +- Support [prefix-prompt](https://arxiv.org/pdf/2101.00190.pdf) for GPT-J. +- Support GPT-NeoX. + - epsilon value used in layernorm is now a parameter + - rotary embedding GPT-NeoX style (only GPT-J was implemented) + - load per-GPU layernorm and bias parameters + - weight conversion from EleutherAI checkpoint + April 2022 -- Change the default accumulation type of all gemm to FP32. -- Support bfloat16 inference in GPT model. -- Support Nemo Megatron T5 and Megatron-LM T5 model. -- Support ViT. +- **Release the FasterTransformer 5.0** + - Change the default accumulation type of all gemm to FP32. + - Support bfloat16 inference in GPT model. + - Support Nemo Megatron T5 and Megatron-LM T5 model. + - Support ViT. March 2022 - Support `stop_ids` and `ban_bad_ids` in GPT-J. - Support dynamice `start_id` and `end_id` in GPT-J, GPT, T5 and Decoding. -Febuary 2022 +February 2022 - Support Swin Transformer. - Optimize the k/v cache update of beam search by in-direction buffer. - Support runtime input for GPT-J, T5 and GPT. @@ -317,7 +347,7 @@ March 2020 - Add a layer normalization layer after decoder. - Add a normalization for inputs of decoder -Febuary 2020 +February 2020 - **Release the FasterTransformer 2.0** - Provide a highly optimized OpenNMT-tf based decoder and decoding, including C++ API and TensorFlow op. - Refine the sample codes of encoder. diff --git a/benchmarks/bert/pyt_benchmark.sh b/benchmarks/bert/pyt_benchmark.sh index a8c866828..b8d56de57 100644 --- a/benchmarks/bert/pyt_benchmark.sh +++ b/benchmarks/bert/pyt_benchmark.sh @@ -54,7 +54,7 @@ if [ -f "gemm_config.in" ] ; then tmp_log_ths=${logdir}/batchsize-${batch_size}-seq-${seq_len}-${precision}-ths-log.log if [ "$precision" = "fp16" ]; then - python ../examples/pytorch/bert/bert_example.py ${batch_size} 12 ${seq_len} 12 64 --fp16 --time 2>&1 | tee $tmp_log_ths + python ../examples/pytorch/bert/bert_example.py ${batch_size} 12 ${seq_len} 12 64 --data_type fp16 --time 2>&1 | tee $tmp_log_ths else python ../examples/pytorch/bert/bert_example.py ${batch_size} 12 ${seq_len} 12 64 --time 2>&1 | tee $tmp_log_ths fi diff --git a/benchmarks/bert/pyt_int8_benchmark.sh b/benchmarks/bert/pyt_int8_benchmark.sh index 97dede8b8..8aaf0be89 100644 --- a/benchmarks/bert/pyt_int8_benchmark.sh +++ b/benchmarks/bert/pyt_int8_benchmark.sh @@ -43,7 +43,7 @@ do ../build/bin/bert_gemm ${batch_size} ${seq_len} 12 64 1 ${int8_mode} tmp_log_ths=${logdir}/batchsize-${batch_size}-seq-${seq_len}-fp16-ths-log.log - python ../examples/pytorch/bert/bert_example.py ${batch_size} 12 ${seq_len} 12 64 --fp16 --time --int8_mode ${int8_mode} 2>&1 | tee $tmp_log_ths + python ../examples/pytorch/bert/bert_example.py ${batch_size} 12 ${seq_len} 12 64 --data_type fp16 --time --int8_mode ${int8_mode} 2>&1 | tee $tmp_log_ths ths_time=`tail -n 3 ${tmp_log_ths} | head -n 1 | awk '{print $5}'` ft_time=`tail -n 2 ${tmp_log_ths} | head -n 1 | awk '{print $5}'` diff --git a/benchmarks/bert/pyt_sp_fp16_benchmark.sh b/benchmarks/bert/pyt_sp_fp16_benchmark.sh index 8d477724f..2dd00349b 100644 --- a/benchmarks/bert/pyt_sp_fp16_benchmark.sh +++ b/benchmarks/bert/pyt_sp_fp16_benchmark.sh @@ -56,9 +56,9 @@ do tmp_log_pt=${logdir}/batchsize-${batch_size}-seq-${seq_len}-log.log tmp_log_pt_sp=${logdir}/batchsize-${batch_size}-seq-${seq_len}-sp-log.log - python ../examples/pytorch/bert/bert_example.py ${batch_size} ${layer_num} ${seq_len} ${head_num} ${head_size} --fp16 --time 2>&1 | tee $tmp_log_pt + python ../examples/pytorch/bert/bert_example.py ${batch_size} ${layer_num} ${seq_len} ${head_num} ${head_size} --data_type fp16 --time 2>&1 | tee $tmp_log_pt sleep 5s - python ../examples/pytorch/bert/bert_example.py ${batch_size} ${layer_num} ${seq_len} ${head_num} ${head_size} --fp16 --sparse --time 2>&1 | tee $tmp_log_pt_sp + python ../examples/pytorch/bert/bert_example.py ${batch_size} ${layer_num} ${seq_len} ${head_num} ${head_size} --data_type fp16 --sparse --time 2>&1 | tee $tmp_log_pt_sp sleep 5s ft_o_time=`tail -n 2 ${tmp_log_pt} | head -n 1 | awk '{print $5}'` diff --git a/benchmarks/bert/pyt_sp_int8_mode2_benchmark.sh b/benchmarks/bert/pyt_sp_int8_mode2_benchmark.sh index 4665180c7..c793c6a5e 100644 --- a/benchmarks/bert/pyt_sp_int8_mode2_benchmark.sh +++ b/benchmarks/bert/pyt_sp_int8_mode2_benchmark.sh @@ -56,9 +56,9 @@ do tmp_log_pt=${logdir}/batchsize-${batch_size}-seq-${seq_len}-log.log tmp_log_pt_sp=${logdir}/batchsize-${batch_size}-seq-${seq_len}-sp-log.log - python ../examples/pytorch/bert/bert_example.py ${batch_size} ${layer_num} ${seq_len} ${head_num} ${head_size} --fp16 --int8_mode 2 --time 2>&1 | tee $tmp_log_pt + python ../examples/pytorch/bert/bert_example.py ${batch_size} ${layer_num} ${seq_len} ${head_num} ${head_size} --data_type fp16 --int8_mode 2 --time 2>&1 | tee $tmp_log_pt sleep 5s - python ../examples/pytorch/bert/bert_example.py ${batch_size} ${layer_num} ${seq_len} ${head_num} ${head_size} --fp16 --int8_mode 2 --sparse --time 2>&1 | tee $tmp_log_pt_sp + python ../examples/pytorch/bert/bert_example.py ${batch_size} ${layer_num} ${seq_len} ${head_num} ${head_size} --data_type fp16 --int8_mode 2 --sparse --time 2>&1 | tee $tmp_log_pt_sp sleep 5s ft_o_time=`tail -n 2 ${tmp_log_pt} | head -n 1 | awk '{print $5}'` diff --git a/benchmarks/bert/pyt_tp_benchmark.sh b/benchmarks/bert/pyt_tp_benchmark.sh new file mode 100644 index 000000000..bc8df3162 --- /dev/null +++ b/benchmarks/bert/pyt_tp_benchmark.sh @@ -0,0 +1,126 @@ +# Copyright (c) 2022, NVIDIA CORPORATION. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# apt-get update +# apt-get install bc +set -x +export NVIDIA_TF32_OVERRIDE=0 + +MODEL_LAYER=32 +HEAD_NUM=32 +SIZE_PER_HEAD=128 +HIDDEN_SIZE=$(echo "${HEAD_NUM} * ${SIZE_PER_HEAD}" | bc) +INTER_SIZE=$(echo "${HIDDEN_SIZE} * 4" | bc) +for precision in fp16; +do + +if [ "$precision" = "fp16" ]; then + echo "Using fp16." + precision_num=1 + precision_larger="FP16" +else + echo "Using fp32" + precision_num=0 + precision_larger="FP32" +fi + +logdir="bert-6B-log-${precision}-triton" +if [ ! -f ${logdir} ] ; then + mkdir ${logdir} -p +fi +all_log="${logdir}/all-log.log" +echo -e "| Batch_size | Seq_len | Precision | TP1, PP1
Latency (ms) | TP2, PP1
Latency (ms) | TP4, PP1
Latency (ms) | TP1, PP2
Latency (ms) | TP1, PP4
Latency (ms) | " > $all_log +echo -e "|:----------:|:-------:|:---------:|:---------------------------:|:---------------------------:|:---------------------------:|:---------------------------:|:---------------------------:| " >> $all_log + +cat /proc/cpuinfo > ${logdir}/cpuinfo.txt +nvidia-smi > ${logdir}/gpuinfo.txt + +echo "[bert] + model_name = bert + position_embedding_type = absolute + hidden_size = ${HIDDEN_SIZE} + num_layer = ${MODEL_LAYER} + head_num = ${HEAD_NUM} + size_per_head = ${SIZE_PER_HEAD} + activation_type = gelu + inter_size = ${INTER_SIZE} + max_position_embeddings = 512 + layer_norm_eps = 1e-12 + weight_data_type = fp32 + tensor_para_size = 1" > config.ini + +for batch_size in 1 4 32 128 ; +do +for seq_len in 32 128 384 1024 ; +do + # tp 1, pp 1 + python ../examples/pytorch/bert/utils/update_bert_config.py \ + --model-dir ./ \ + --config-ini-path config.ini \ + --pipeline-para-size 1 \ + --tensor-para-size 1 \ + --data-type fp16 \ + --request-batch-size ${batch_size} \ + --request-seq-len ${seq_len} + tmp_log=${logdir}/batchsize-${batch_size}-seq-${seq_len}-${precision}-tp-1-pp-1.log + CUDA_VISIBLE_DEVICES=4 ./bin/bert_triton_example config.ini 2>&1 | tee ${tmp_log} + ft_tp1_pp1_time=`tail -n 1 ${tmp_log} | head -n 1 | awk '{print $7}'` + sleep 5 + + # tp 2, pp 1 + python ../examples/pytorch/bert/utils/update_bert_config.py \ + --model-dir ./ \ + --config-ini-path config.ini \ + --pipeline-para-size 1 \ + --tensor-para-size 2 \ + --data-type fp16 \ + --request-batch-size ${batch_size} \ + --request-seq-len ${seq_len} + tmp_log=${logdir}/batchsize-${batch_size}-seq-${seq_len}-${precision}-tp-2-pp-1.log + CUDA_VISIBLE_DEVICES=4,5 ./bin/bert_triton_example config.ini 2>&1 | tee ${tmp_log} + ft_tp2_pp1_time=`tail -n 1 ${tmp_log} | head -n 1 | awk '{print $7}'` + sleep 5 + + # tp 4, pp 1 + python ../examples/pytorch/bert/utils/update_bert_config.py \ + --model-dir ./ \ + --config-ini-path config.ini \ + --pipeline-para-size 1 \ + --tensor-para-size 4 \ + --data-type fp16 \ + --request-batch-size ${batch_size} \ + --request-seq-len ${seq_len} + tmp_log=${logdir}/batchsize-${batch_size}-seq-${seq_len}-${precision}-tp-4-pp-1.log + CUDA_VISIBLE_DEVICES=4,5,6,7 ./bin/bert_triton_example config.ini 2>&1 | tee ${tmp_log} + ft_tp4_pp1_time=`tail -n 1 ${tmp_log} | head -n 1 | awk '{print $7}'` + sleep 5 + + # tp 1, pp 2 + python ../examples/pytorch/bert/utils/update_bert_config.py \ + --model-dir ./ \ + --config-ini-path config.ini \ + --pipeline-para-size 2 \ + --tensor-para-size 1 \ + --data-type fp16 \ + --request-batch-size ${batch_size} \ + --request-seq-len ${seq_len} + tmp_log=${logdir}/batchsize-${batch_size}-seq-${seq_len}-${precision}-tp-1-pp-2.log + CUDA_VISIBLE_DEVICES=4,5 ./bin/bert_triton_example config.ini 2>&1 | tee ${tmp_log} + ft_tp1_pp2_time=`tail -n 1 ${tmp_log} | head -n 1 | awk '{print $7}'` + sleep 5 + + echo "| ${batch_size} | ${seq_len} | fp16 | ${ft_tp1_pp1_time} | ${ft_tp2_pp1_time} | ${ft_tp4_pp1_time} | ${ft_tp1_pp2_time} | " >> ${all_log} +done +done +done \ No newline at end of file diff --git a/benchmarks/gpt/cpp_benchmark.sh b/benchmarks/gpt/cpp_benchmark.sh new file mode 100644 index 000000000..824beada6 --- /dev/null +++ b/benchmarks/gpt/cpp_benchmark.sh @@ -0,0 +1,120 @@ +# Copyright (c) 2022, NVIDIA CORPORATION. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# $1: TP size +# $2: PP size + +export NVIDIA_TF32_OVERRIDE=0 +tensor_para_size=$1 +pipeline_para_size=$2 +total_gpu_count=$(echo "scale=2; ${tensor_para_size} * ${pipeline_para_size} " | bc) + +vocab_size=51200 + +logdir="gpt-TP${tensor_para_size}-PP${pipeline_para_size}-log" +if [ ! -f ${logdir} ]; then + mkdir ${logdir} -p +fi + +all_log="${logdir}/all-log.log" + +echo -e "| model size | Batch Size | Input length | Output length | Decode value | Precision | FT latency (ms) |" > $all_log +echo -e "|:----------:|:----------:|:------------:|:-------------:|:------------:|:---------:|:---------------:|" >> $all_log + +cat /proc/cpuinfo > ${logdir}/cpuinfo.txt +nvidia-smi > ${logdir}/gpuinfo.txt + +for model_size in "345m" "5b"; +do + if [ "$model_size" = "345m" ]; then + head_num=16 + size_per_head=64 + inter_size=$(echo "scale=2; $head_num * ${size_per_head} * 4 " | bc) + num_layer=24 + elif [ "$model_size" = "5b" ]; then + head_num=32 + size_per_head=128 + inter_size=$(echo "scale=2; $head_num * ${size_per_head} * 4 " | bc) + num_layer=24 + fi + +for decode_type in "beamsearch" "sampling"; +do + + if [ "$decode_type" = "beamsearch" ]; then + decode_values=(4) + elif [ "$decode_type" = "sampling" ]; then + decode_values=(4 0.5) + fi + +for request_batch_size in 1 4 16; +do +for input_length in 60; +do +for request_output_len in 80; +do +for decode_value in ${decode_values[@]}; +do + +if [ "$decode_type" = "beamsearch" ]; then + beam_width=$decode_value + topk=0 + topp=0.0 +elif [ "$decode_type" = "sampling" ]; then + beam_width=1 + if [[ $decode_value == +([[:digit:]]) ]]; then + topk=$decode_value + topp=0.0 + else + topk=0 + topp=$decode_value + fi +fi + +tmp_log=${logdir}/batchsize-${request_batch_size}-decode_value-${decode_value}-${input_length}-${request_output_len}-${decode_type}-${decode_value}.log + +python ../examples/pytorch/gpt/utils/generate_start_ids.py --max_batch_size ${request_batch_size} --max_input_length ${input_length} +./bin/gpt_gemm ${request_batch_size} ${beam_width} ${input_length} ${head_num} ${size_per_head} ${inter_size} ${vocab_size} 1 ${tensor_para_size} +python ../examples/pytorch/gpt/utils/generate_gpt_config.py \ + --max_seq_len 1024 \ + --beam_width ${beam_width} \ + --head_num ${head_num} \ + --size_per_head ${size_per_head} \ + --inter_size ${inter_size} \ + --num_layer ${num_layer} \ + -v 51200 \ + -d fp16 \ + -topk ${topk} \ + -topp ${topp} \ + --tensor_para_size ${tensor_para_size} \ + --pipeline_para_size ${pipeline_para_size} \ + -request_batch_size ${request_batch_size} \ + --request_output_len ${request_output_len} +mpirun -n ${total_gpu_count} --allow-run-as-root ./bin/multi_gpu_gpt_example .tmp.config.ini 2>&1 | tee ${tmp_log} +ft_latency=`tail -n 1 ${tmp_log} | head -n 1 | awk '{print $17}'` +echo "" | awk -v ft_latency=$ft_latency \ + -v batch_size=$request_batch_size \ + -v input_length=${input_length} -v request_output_len="$request_output_len" \ + -v model_size=${model_size} -v decode_value="$decode_value" -v decode_type="$decode_type" \ + '{printf "| %5s | %3d | %4d | %4d | %10s %5s | FP16 | %7.2f |\n", model_size, batch_size, input_length, request_output_len, + decode_type, decode_value, ft_latency}' >> $all_log + +rm .tmp.config.ini + +done # decode_values +done # request_output_len +done # input_length +done # batch_size +done # decode_type +done # model_size \ No newline at end of file diff --git a/benchmarks/t5/pyt_benchmark.sh b/benchmarks/t5/pyt_benchmark.sh index 49c2ad016..3157bb49f 100644 --- a/benchmarks/t5/pyt_benchmark.sh +++ b/benchmarks/t5/pyt_benchmark.sh @@ -12,6 +12,17 @@ # See the License for the specific language governing permissions and # limitations under the License. +# $1: RUNNING the Huggingface in the benchmark or not +# $2: model_size like t5-base, t5-3b. Useless when $3 is given +# $3: model_path for t5 model. We can use the downloaded model directly, +# preventing wasting time to download model. + +if [ "$1" = 0 ]; then + IS_RUN_HF=0 +else + IS_RUN_HF=1 +fi + if [ $FT_REPO_PATH ];then echo "FT_REPO_PATH = $FT_REPO_PATH" else @@ -21,52 +32,13 @@ fi export NVIDIA_TF32_OVERRIDE=0 -for model_size in "t5-base"; -do -if [ "$model_size" = "t5-small" ]; then - encoder_head_num=8 - encoder_size_per_head=64 - encoder_d_model=512 - encoder_num_layer=6 - encoder_inter_size=2048 - - decoder_head_num=8 - decoder_size_per_head=64 - decoder_d_model=512 - decoder_num_layer=6 - decoder_inter_size=2048 - decoder_vocab_size=32128 -elif [ "$model_size" = "t5-base" ]; then - encoder_head_num=12 - encoder_size_per_head=64 - encoder_d_model=768 - encoder_num_layer=12 - encoder_inter_size=3072 - - decoder_head_num=12 - decoder_size_per_head=64 - decoder_d_model=768 - decoder_num_layer=12 - decoder_inter_size=3072 - decoder_vocab_size=32128 -elif [ "$model_size" = "t5-3b" ]; then - encoder_head_num=32 - encoder_size_per_head=128 - encoder_d_model=1024 - encoder_num_layer=24 - encoder_inter_size=16384 - - decoder_head_num=32 - decoder_size_per_head=128 - decoder_d_model=1024 - decoder_num_layer=24 - decoder_inter_size=16384 - decoder_vocab_size=32128 +if [ "$2" != "" ]; then + model_size=$2 else - echo "[ERROR] no model_size $model_size" + model_size="t5-base" fi -for precision in fp32; +for precision in fp16; do if [ "$precision" = "fp16" ]; then @@ -94,8 +66,14 @@ if [ ! -f ${logdir} ] ; then fi all_log="${logdir}/all-log.log" -echo -e "| Batch Size | ${decode_type} | Precision | Huggingface
Throughput (token/sec) | FT Decoding
Throughput (token/sec) | FT Decoding
Speedup |" > $all_log -echo -e "|:----------:|:--------------:|:---------:|:----------------------------------------:|:----------------------------------------:|:-------------------------:|" >> $all_log + +if [ "$IS_RUN_HF" == "1" ]; then + echo -e "| Batch Size | ${decode_type} | Precision | Huggingface
Throughput (token/sec) | FT Decoding
Throughput (token/sec) | FT Decoding
Speedup |" > $all_log + echo -e "|:----------:|:--------------:|:---------:|:----------------------------------------:|:----------------------------------------:|:-------------------------:|" >> $all_log +else + echo -e "| Batch Size | ${decode_type} | Precision | FT Decoding
Throughput (token/sec) |" > $all_log + echo -e "|:----------:|:--------------:|:---------:|:----------------------------------------:|" >> $all_log +fi cat /proc/cpuinfo > ${logdir}/cpuinfo.txt nvidia-smi > ${logdir}/gpuinfo.txt @@ -108,7 +86,11 @@ do beam_width=$decode_value topk=0 topp=0.0 - test_time="01" + if [ "$IS_RUN_HF" == "1" ]; then + test_time="01" + else + test_time="1" + fi elif [ "$decode_type" = "sampling" ]; then beam_width=1 if [[ $decode_value == +([[:digit:]]) ]]; then @@ -118,7 +100,11 @@ do topk=0 topp=$decode_value fi - test_time="23" + if [ "$IS_RUN_HF" == "1" ]; then + test_time="23" + else + test_time="3" + fi fi if [ -f "gemm_config.in" ] ; then @@ -126,35 +112,57 @@ do fi tmp_log_th=${logdir}/batchsize-${batch_size}-beamwidth-${beam_width}-seq-128-${precision}-${decode_type}-${decode_value}-th-log.log - ./bin/t5_gemm ${batch_size} ${beam_width} 128 \ - ${encoder_d_model} ${encoder_head_num} ${encoder_size_per_head} ${encoder_inter_size} \ - ${decoder_d_model} ${decoder_head_num} ${decoder_size_per_head} ${decoder_inter_size} \ - ${decoder_vocab_size} ${precision_num} > ${logdir}/batchsize-${batch_size}-beamwidth-${beam_width}-seq-128-${precision}-th-log.gemm.log - - python ${FT_REPO_PATH}/examples/pytorch/t5/translate_example.py \ + + if [ "$3" != "" ]; then + python ${FT_REPO_PATH}/examples/pytorch/t5/translate_example.py \ --batch_size ${batch_size} \ --beam_width ${beam_width} \ --max_seq_len 128 \ --data_type ${precision} \ --beam_search_diversity_rate 0.0 \ - --model ${model_size} \ + --model_path $3 \ + --model "t5-base" \ --sampling_topk ${topk} \ --sampling_topp ${topp} \ + --max_iteration 200 \ --test_time ${test_time} 2>&1 | tee ${tmp_log_th} - ft_decoding_throughput=`tail -n 1 ${tmp_log_th} | awk '{print $16}'` - th_throughput=`tail -n 2 ${tmp_log_th} | head -n 1 | awk '{print $16}'` - ft_decoding_speedup=$(echo "scale=2; $ft_decoding_throughput / $th_throughput " | bc) - - echo "" | awk -v th_throughput=$th_throughput \ - -v ft_decoding_throughput=$ft_decoding_throughput \ - -v ft_decoding_speedup=$ft_decoding_speedup -v batch_size=$batch_size -v decode_value="$decode_value" \ - -v precision_large=$precision_large \ - '{printf "| %3d | %4s | %s | %5d | %5d | %5.2f |\n", batch_size, decode_value, - precision_large, th_throughput, ft_decoding_throughput, - ft_decoding_speedup }' >> $all_log + else + python ${FT_REPO_PATH}/examples/pytorch/t5/translate_example.py \ + --batch_size ${batch_size} \ + --beam_width ${beam_width} \ + --max_seq_len 128 \ + --data_type ${precision} \ + --beam_search_diversity_rate 0.0 \ + --model ${model_size} \ + --sampling_topk ${topk} \ + --sampling_topp ${topp} \ + --max_iteration 200 \ + --test_time ${test_time} 2>&1 | tee ${tmp_log_th} + fi + + if [ "$IS_RUN_HF" == "1" ]; then + ft_decoding_throughput=`tail -n 1 ${tmp_log_th} | awk '{print $19}'` + th_throughput=`tail -n 2 ${tmp_log_th} | head -n 1 | awk '{print $19}'` + ft_decoding_speedup=$(echo "scale=2; $ft_decoding_throughput / $th_throughput " | bc) + + echo "" | awk -v th_throughput=$th_throughput \ + -v ft_decoding_throughput=$ft_decoding_throughput \ + -v ft_decoding_speedup=$ft_decoding_speedup -v batch_size=$batch_size -v decode_value="$decode_value" \ + -v precision_large=$precision_large \ + '{printf "| %3d | %4s | %s | %5d | %5d | %5.2f |\n", batch_size, decode_value, + precision_large, th_throughput, ft_decoding_throughput, + ft_decoding_speedup }' >> $all_log + else + ft_decoding_throughput=`tail -n 1 ${tmp_log_th} | awk '{print $19}'` + + echo "" | awk -v ft_decoding_throughput=$ft_decoding_throughput \ + -v batch_size=$batch_size -v decode_value="$decode_value" \ + -v precision_large=$precision_large \ + '{printf "| %3d | %4s | %s | %5d |\n", batch_size, decode_value, + precision_large, ft_decoding_throughput}' >> $all_log + fi done # decode_value done # batch_size done # decode_type -done # for precision -done # for model_size \ No newline at end of file +done # for precision \ No newline at end of file diff --git a/docker/Dockerfile.tf b/docker/Dockerfile.tf new file mode 100644 index 000000000..4e2ce0281 --- /dev/null +++ b/docker/Dockerfile.tf @@ -0,0 +1,41 @@ +# Copyright (c) 2022, NVIDIA CORPORATION. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +# -------------------------------------------------- # +# This is a Docker image dedicated to develop +# FasterTransformer. +# -------------------------------------------------- # + +ARG DOCKER_VERSION=22.07 +ARG BASE_IMAGE=nvcr.io/nvidia/tensorflow:${DOCKER_VERSION}-tf1-py3 +FROM ${BASE_IMAGE} + +RUN apt-get update && \ + apt-get install -y --no-install-recommends bc && \ + apt-get clean && \ + rm -rf /var/lib/apt/lists/* + +# backend build +WORKDIR /workspace/FasterTransformer +ADD . /workspace/FasterTransformer + +RUN git submodule update --init --recursive + +ARG SM=80 +ARG FORCE_BACKEND_REBUILD=0 +RUN mkdir /var/run/sshd -p && \ + mkdir build -p && cd build && \ + cmake -DSM=${SM} -DCMAKE_BUILD_TYPE=Release -DBUILD_TF=ON -DTF_PATH=/usr/local/lib/python3.8/dist-packages/tensorflow_core/ -DBUILD_MULTI_GPU=ON .. && \ + make -j"$(grep -c ^processor /proc/cpuinfo)" diff --git a/docker/Dockerfile.torch b/docker/Dockerfile.torch new file mode 100644 index 000000000..dea54b6b6 --- /dev/null +++ b/docker/Dockerfile.torch @@ -0,0 +1,59 @@ +# Copyright (c) 2022, NVIDIA CORPORATION. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +# -------------------------------------------------- # +# This is a Docker image dedicated to develop +# FasterTransformer. +# -------------------------------------------------- # + +ARG DOCKER_VERSION=22.07 +ARG BASE_IMAGE=nvcr.io/nvidia/pytorch:${DOCKER_VERSION}-py3 +FROM ${BASE_IMAGE} + +RUN apt-get update && \ + apt-get install -y --no-install-recommends bc && \ + apt-get clean && \ + rm -rf /var/lib/apt/lists/* + +# backend build +WORKDIR /workspace/FasterTransformer +ADD . /workspace/FasterTransformer + +RUN git submodule update --init --recursive && \ + git clone https://github.com/NVIDIA/NeMo /workspace/FasterTransformer/3rdparty/NeMo && \ + cd /workspace/FasterTransformer/3rdparty/NeMo && \ + git checkout 66c7677cd4a68d78965d4905dd1febbf5385dff3 && \ + cd - + +# Originally, we need to re-install the apex package for NeMo. +# However, we don't really need apex in tests about NeMo because we +# only use NeMo to do tokenization, dataset loading and model conversion. +# So, remove the re-installation because it is time-consuming. +# RUN pip uninstall -y apex && \ +# pip install git+https://github.com/NVIDIA/apex --global-option="--cpp_ext" --global-option="--cuda_ext" --global-option="--fast_layer_norm" && \ +# pip install 3rdparty/NeMo[nlp] +RUN pip install 3rdparty/NeMo[nlp] + +ARG SM=80 +ARG FORCE_BACKEND_REBUILD=0 +ARG SPARSITY_SUPPORT=OFF +ARG BUILD_MULTI_GPU=ON +RUN mkdir /var/run/sshd -p && \ + mkdir build -p && cd build && \ + wget https://developer.download.nvidia.com/compute/libcusparse-lt/0.1.0/local_installers/libcusparse_lt-linux-x86_64-0.1.0.2.tar.gz && \ + tar -xzvf libcusparse_lt-linux-x86_64-0.1.0.2.tar.gz && \ + cmake -DSM=${SM} -DCMAKE_BUILD_TYPE=Release -DBUILD_PYT=ON -DSPARSITY_SUPPORT=${SPARSITY_SUPPORT} -DMEASURE_BUILD_TIME=ON \ + -DCUSPARSELT_PATH=/workspace/FasterTransformer/build/libcusparse_lt/ -DBUILD_MULTI_GPU=${BUILD_MULTI_GPU} -DBUILD_TRT=ON .. && \ + make -j"$(grep -c ^processor /proc/cpuinfo)" diff --git a/docs/bert_guide.md b/docs/bert_guide.md index a618a9b4f..f4ae49258 100644 --- a/docs/bert_guide.md +++ b/docs/bert_guide.md @@ -14,15 +14,20 @@ The FasterTransformer BERT contains the optimized BERT model, Effective FasterTr - [Prepare](#prepare) - [Build the project](#build-the-project) - [How to use](#how-to-use) - - [BERT process](#bert-process) + - [Run FasterTransformer BERT on C++](#run-fastertransformer-bert-on-c) + - [Run FasterTransformer BERT on TensorFlow](#run-fastertransformer-bert-on-tensorflow) + - [Run FasterTransformer BERT on PyTorch](#run-fastertransformer-bert-on-pytorch) + - [Run the PyTorch BERT sample with multi-GPU:](#run-the-pytorch-bert-sample-with-multi-gpu) - [Performance](#performance) - - [BERT performance](#bert-performance) + - [Multi-GPU BERT-6B performance on A100 and triton example](#multi-gpu-bert-6b-performance-on-a100-and-triton-example) + - [Single GPU BERT performance](#single-gpu-bert-performance) - [BERT performance on A100 and TensorFlow](#bert-performance-on-a100-and-tensorflow) - [BERT performance on T4 and TensorFlow](#bert-performance-on-t4-and-tensorflow) - [BERT performance on V100 and TensorFlow](#bert-performance-on-v100-and-tensorflow) - [BERT performance comparison between T4, V100, A100 and A100 with MIG mode on TensorFlow](#bert-performance-comparison-between-t4-v100-a100-and-a100-with-mig-mode-on-tensorflow) - [BERT performance comparison between different features on T4 and TensorFlow](#bert-performance-comparison-between-different-features-on-t4-and-tensorflow) - [BERT performance on A100 and PyTorch](#bert-performance-on-a100-and-pytorch) + - [BERT performance on A10 and PyTorch](#bert-performance-on-a10-and-pytorch) - [BERT performance on T4 and PyTorch](#bert-performance-on-t4-and-pytorch) - [BERT performance on V100 and PyTorch](#bert-performance-on-v100-and-pytorch) - [Performance on BERT Applications: SQuAD MRPC](#performance-on-bert-applications-squad-mrpc) @@ -38,13 +43,14 @@ The following configurations are supported in the FasterTransformer encoder. - Sequence length (S): smaller or equal to 4096. For INT8 mode=1, S should be a multiple of 32 when S > 384. - Size per head (N): Even number and smaller than 128. - Head number (H): Any number satisfying that H * N <= 1024 under FP32, or H * N <= 2048 under FP16. -- Data type: FP32, FP16 and INT8 +- Data type: FP32, FP16, BF16 and INT8 - Any number layer (N1) if the memory is enough -In the FasterTransformer v1.0, we provide a highly optimized BERT-equivalent encoder model. Next, based on the idea of [Effective Transformer](https://github.com/bytedance/effective_transformer), we further optimize BERT inference by removing the useless padding in FasterTransformer v2.1 and provide the Effective FasterTransformer. In FasterTransformer v3.0, we provide INT8 quantization inference to get better performance. In FasterTransformer v3.1, we optimize the INT8 kernels to improve the performance of INT8 inference and integrate the multi-head attention of TensorRT plugin into FasterTransformer. In FasterTransformer v4.0, we add the multi-head attention kernel to support FP16 on V100 and INT8 on T4, A100. The following graph demonstrates the flow chart of these optimization, except INT8. In FasterTransformer v5.0, we refactor the codes, encapsulating the mask building and padding removing into the Bert forward function, and add the sparsity feature of Ampere GPU to accelerate the GEMM. +In the FasterTransformer v1.0, we provide a highly optimized BERT-equivalent encoder model. Next, based on the idea of [Effective Transformer](https://github.com/bytedance/effective_transformer), we further optimize BERT inference by removing the useless padding in FasterTransformer v2.1 and provide the Effective FasterTransformer. In FasterTransformer v3.0, we provide INT8 quantization inference to get better performance. In FasterTransformer v3.1, we optimize the INT8 kernels to improve the performance of INT8 inference and integrate the multi-head attention of TensorRT plugin into FasterTransformer. In FasterTransformer v4.0, we add the multi-head attention kernel to support FP16 on V100 and INT8 on T4, A100. The following graph demonstrates the flow chart of these optimization, except INT8. In FasterTransformer v5.0, we refactor the codes, encapsulating the mask building and padding removing into the Bert forward function, and add the sparsity feature of Ampere GPU to accelerate the GEMM. In FasterTransformer v5.1, we support multi-node multi-GPU inference on Bert FP16.
Fig. 1 Flowchart of encoder.
+

The BERT model is proposed by google in 2018. The encoder of FasterTransformer is equivalent to BERT model, but do lots of optimization. The leftmost flow of Fig. 1 shows the optimization in FasterTransformer. After optimization, FasterTransformer only uses 8 or 6 gemms (blue blocks) and 6 custom CUDA kernels (green blocks) to implement one transformer block. @@ -54,40 +60,57 @@ To further improve the performance of multi head attention, we integrate the mul
Fig. 2 Effective Transformer.
+

Besides, we find that the padding would affect the accuracy for some tasks although they should be useless. So, we recommend removing the padding in the final outputs of downstream tasks. The arguments, inputs, and outputs of encoder: -* Arguments: - 1. Maximum batch size - 2. Maximum sequence length - 3. Head number - 4. Size per head - 5. Intermediate size. The inter size of feed forward network. It is often set to 4 * head_num * size_per_head. - 6. Number of decoder layers - 7. SM version of GPU device. Some kernel chosen depend on the GPU device. - 8. Query scaling. It is used to scale the query before the batch multiplication of query and key. - 9. CUDA stream. - 10. Pointer of cuBLAS wrapper, which is declared in `src/fastertransformer/utils/cublasMMWrapper.h`. - 11. Pointer of memory allocator, which is declared in `src/fastertransformer/utils/allocator.h` - 12. “is_free_buffer_after_forward” flag. If setting to be true, FasterTransformer will allocate buffer before forward, and free buffer after forward. If the memory is controlled by memory pool and the cost of allocating/releasing memory is small, setting the flag to be true can save some memory. - 13. Attention type. There are four different types. Users can use `getAttentionType(size_per_head, sm, remove_padding, seq_len)` to determine the attention type automatically. - 14. The flag of sparsity. This feature requires Ampere GPU and a sparse model. If setting to true, then FT will use sparse gemm to accelerate the gemm computation. - 15. Activation type. There are two options, GeLU and ReLU now. - 16. LayerNorm type. There are two options, post layernorm and pre layernorm. -* Inputs: - 1. Bert input feature. This feature should be after the embedding lookup and position embedding. The shape is \[ request batch size, maximum sequence length, hidden dimension \]. - 2. Sequence length. The shape is \[ request batch size \]. -* Outputs: - 1. Bert output feature. The shape is \[ request batch size, maximum sequence length, hidden dimension \]. +* Constructor of BERT + +| Classification | Name | Data Type | Description | +| :------------: | :--------------------------: | :----------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| [0] | max_batch_size | int | **Deprecated, move to input** | +| [1] | max_seq_len | int | **Deprecated, move to input** | +| [2] | head_num | int | Head number for model configuration | +| [3] | size_per_head | int | Size per head for model configuration | +| [4] | inter_size | int | The inter size of feed forward network. It is often set to 4 * head_num * size_per_head. | +| [5] | num_layer | int | Number of transformer layers for model configuration | +| [6] | sm | int | The compute capacity of GPU | +| [7] | q_scaling | float | It is used to scale the query before the batch multiplication of query and key | +| [8] | stream | cudaStream_t | CUDA stream | +| [9] | cublas_wrapper | cublasMMWrapper* | Pointer of cuBLAS wrapper, which is declared in `src/fastertransformer/utils/cublasMMWrapper.h` | +| [10] | allocator | IAllocator* | Pointer of memory allocator, which is declared in `src/fastertransformer/utils/allocator.h` | +| [11] | is_free_buffer_after_forward | bool | If setting to be `true`, FasterTransformer will allocate buffer before forward, and free buffer after forward. When the allocator is based on memory pool, setting to `true` may help reducing the memory usage during inference. | +| [12] | attention_type | AttentionType | Determine fusing the attention or not, remove padding or not, which is declared in `src/fastertransformer/layers/attention_layers/BaseAttentionLayer.h` | +| [13] | sparse | bool | Is using sparsity. **Experimental feature** | +| [14] | activation_type | ActivationType | Determine the activation in FFN, which is declared in `src/fastertransformer/layers/attention_layers/FfnLayer.h` | +| [15] | layernorm_type | LayerNormType | Determine using pre-layernorm or post-layernorm, which is declared in `src/fastertransformer/kernels/layernorm_kernels.h` | +| [16] | tensor_para | NcclParam | Tensor Parallel information, which is declared in `src/fastertransformer/utils/nccl_utils.h` | +| [17] | pipeline_para | NcclParam | Pipeline Parallel information, which is declared in `src/fastertransformer/utils/nccl_utils.h` | +| [18] | custom_all_reduce_comm | AbstractCustomComm | Custom all reduction communication for custom all reduction in model parallelism. It is only supported in 8-way tensor parallelism | +| [19] | enable_custom_all_reduce | int | Flag of enabling custom all reduction or not | + +* Input of BERT + +| Name | Tensor/Parameter Shape | Location | Data Type | Description | +| :----------------: | :-----------------------------------------------------: | :------: | :------------: | :-------------------------------: | +| input_hidden_state | [batch_size, sequence_length, head_num * size_per_head] | GPU | fp32/fp16/bf16 | The input of transformer layer | +| input_lengths | [batch_size] | GPU | int | The lengths of input_hidden_state | + +* Output of BERT + +| Name | Tensor/Parameter Shape | Location | Data Type | Description | +| :-----------------: | :-----------------------------------------------------: | :------: | :------------: | :-----------------------------: | +| output_hidden_state | [batch_size, sequence_length, head_num * size_per_head] | GPU | fp32/fp16/bf16 | The output of transformer layer | Besides, notice that the multi-head attention kernel from TensorRT is powerful but have some limitation. First, this kernel requires Turing or new GPU and the size per head must be 64. When the conditions are not satisfied, we use original multi-head attention implementation of FasterTransformer. Second, it requires an additional sequence length offset like fig 2 shows. More details are in [link](https://github.com/NVIDIA/TensorRT/tree/release/7.2/plugin/embLayerNormPlugin). When the input has padding, the shape of the sequence length offset is \[2 x B1 + 1 \]. Assume there are three sentences with sequence length s1, s2 and s3, and the sequence length after padding is S. Then the sequence length offset is \[0, s1, S, s2 + S, 2 x S, 2 x S + s3, 3 x S\]. On the other hand, when we remove the padding, the shape of the sequence length offset is \[B1 + 1\], and the sequence length offset is \[0, s1, s1 + s2, s1 + s2 + s3 \]. Namely, the sequence length offset records the sequence length for each sentence. When we have padding, we view the padding as some independent sentences. -In FasterTransformer v4.0, we implement two pipelines of INT8 inference, as shown in Fig. 3.. For int8_mode == 1 (int8v1), we don't quantize residual connection, use int32 as the output of int8 gemms and use per-channel quantization for weights. For int8_mode == 2 (int8v2), we quantize residual connection, use int8 as the output of int8 gemms and use per-tensor quantization for weights. Generally speaking, int8_mode == 1 will have higher accuracy while int8_mode == 2 will have better performance. +In FasterTransformer v4.0, we implement two pipelines of INT8 inference, as shown in Fig. 3. For int8_mode == 1 (int8v1), we don't quantize residual connection, use int32 as the output of int8 gemms and use per-channel quantization for weights. For int8_mode == 2 (int8v2), we quantize residual connection, use int8 as the output of int8 gemms and use per-tensor quantization for weights. Generally speaking, int8_mode == 1 will have higher accuracy while int8_mode == 2 will have better performance.
Fig. 3 Workflow of int8 inference.
+

| feature | int8_mode == 1 | int8_mode == 2 | | :---------------------------------: | :------------: | :------------: | @@ -99,6 +122,8 @@ For INT8 inference, quantized model is needed. We provide TensorFlow quantizatio In FasterTransformer v5.0, we support the sparsity gemm to leverage the sparsity feature of Ampere GPU. We also provide an example on PyTorch. +In FasterTransformer v5.1, we support the multi-GPU multi-node inference for BERT model. + ## Setup The following section lists the requirements to use FasterTransformer BERT. @@ -107,7 +132,7 @@ The following section lists the requirements to use FasterTransformer BERT. - CMake >= 3.8 for Tensorflow, CMake >= 3.13 for PyTorch - CUDA 11.0 or newer version -- Python 3 is recommended because some features are not supported in python 2 +- Python: Only verify on python 3 - Tensorflow: Verify on 1.15, 1.13 and 1.14 should work. - PyTorch: Verify on 1.8.0, >= 1.5.0 should work. @@ -138,10 +163,20 @@ For those unable to use the NGC container, to set up the required environment or - `nvcr.io/nvidia/pytorch:20.07-py3` contains the PyTorch 1.6.0 and python 3.6 - `nvcr.io/nvidia/pytorch:20.12-py3` contains the PyTorch 1.8.0 and python 3.8 - To achieve best performance, we recommend to use the latest image. For example, running image `nvcr.io/nvidia/tensorflow:20.12-tf1-py3` by + To achieve best performance, we recommend to use the latest image. For example, running image `nvcr.io/nvidia/tensorflow:22.04-tf1-py3` by + + ```bash + nvidia-docker run -ti --rm nvcr.io/nvidia/tensorflow:22.04-tf1-py3 bash + git clone https://github.com/NVIDIA/FasterTransformer.git + mkdir -p FasterTransformer/build + cd FasterTransformer/build + git submodule init && git submodule update + ``` + + For pytorch, it is similar ```bash - nvidia-docker run -ti --rm nvcr.io/nvidia/tensorflow:20.12-tf1-py3 bash + nvidia-docker run -ti --rm nvcr.io/nvidia/pytorch:22.04-py3 bash git clone https://github.com/NVIDIA/FasterTransformer.git mkdir -p FasterTransformer/build cd FasterTransformer/build @@ -150,7 +185,19 @@ For those unable to use the NGC container, to set up the required environment or #### Build the project -* Note: the `xx` of `-DSM=xx` in following scripts means the compute capability of your GPU. For example, 60 (P40) or 61 (P4) or 70 (V100) or 75(T4) or 80 (A100). Default setting is including 70, 75, 80 and 86. +* Note: the `xx` of `-DSM=xx` in following scripts means the compute capability of your GPU. The following table shows the compute capability of common GPUs. + +| GPU | compute capacity | +| :---: | :--------------: | +| P40 | 60 | +| P4 | 61 | +| V100 | 70 | +| T4 | 75 | +| A100 | 80 | +| A30 | 80 | +| A10 | 86 | + +By default, `-DSM` is set by 70, 75, 80 and 86. When users set more kinds of `-DSM`, it requires longer time to compile. So, we suggest setting the `-DSM` for the device you use only. Here, we use `xx` as an example due to convenience. 1. build with C++ @@ -161,7 +208,7 @@ For those unable to use the NGC container, to set up the required environment or 2. build with TensorFlow - Uses need to set the path of TensorFlow. For example, if we use `nvcr.io/nvidia/tensorflow:20.12-tf1-py3`, then + Uses need to set the path of TensorFlow. For example, if we use `nvcr.io/nvidia/tensorflow:22.04-tf1-py3`, then ```bash cmake -DSM=xx -DCMAKE_BUILD_TYPE=Release -DBUILD_TF=ON -DTF_PATH=/usr/local/lib/python3.8/dist-packages/tensorflow_core/ .. @@ -171,7 +218,7 @@ For those unable to use the NGC container, to set up the required environment or 3. build with PyTorch ```bash - cmake -DSM=xx -DCMAKE_BUILD_TYPE=Release -DBUILD_PYT=ON .. + cmake -DSM=xx -DCMAKE_BUILD_TYPE=Release -DBUILD_PYT=ON -DBUILD_MULTI_GPU=ON .. make ``` @@ -188,28 +235,22 @@ For those unable to use the NGC container, to set up the required environment or ## How to use -### BERT process - -1. Run FasterTransformer BERT on C++ +### Run FasterTransformer BERT on C++ - 1.1 Generate the `gemm_config.in` file for FP32/FP16 and the `igemm_config.in` file for INT8 + 1. Generate the `gemm_config.in` file for FP32/FP16/BF16 and the `igemm_config.in` file for INT8 There are two methods to generate the best GEMM configuration - 1.1.1 Using `./bin/bert_gemm` to generate the best GEMM configuration. + 1.1 Using `./bin/bert_gemm` to generate the best GEMM configuration. - ```bash - ./bin/bert_gemm - ``` - - 1.1.2 Generate the best GEMM configuration when running BERT. - - When == 1, it will first check if the corresponding GEMM configuration exists, if not, it will automatically generate the best GEMM configuration. + Data Type = 0 (FP32) or 1 (FP16) or 2 (BF16) ```bash - ./bin/bert_example + ./bin/bert_gemm ``` + 1.2 Generate the best GEMM configuration when running BERT. + The generation of best GEMM configuration is recommended no matter what platform we use when we use FasterTransformer. If we do not generate the configure file, the FasterTransformer will use the default configuration and the inference speed may be slower. Assume the settings of the BERT are as follows: @@ -230,13 +271,14 @@ For those unable to use the NGC container, to set up the required environment or In the following subsection, we use the same settings and 12 transformer layers unless specified. - 1.2 Run FasterTransformer BERT under FP32 on C++ + 2 Run FasterTransformer BERT under FP32 on C++ `./bin/bert_example` runs the BERT in the `C++`. The arguments of `bert_example` is: ```bash - ./bin/bert_example + ./bin/bert_example ``` + Data Type = 0 (FP32) or 1 (FP16) or 2 (BF16) Then the following scripts can run the BERT under the above settings. @@ -253,18 +295,20 @@ For those unable to use the NGC container, to set up the required environment or [INFO] batch_size 32 seq_len 32 layer 12 FT-CPP-time 16.51 ms (100 iterations) ``` - 1.3 Run FasterTransformer BERT under FP16 on C++ + 3 Run FasterTransformer BERT under FP16/BF16 on C++ - So far, we use the FP32 to run the FasterTransformer. If we use the volta or newer NVIDIA GPU, we can use tensor core when we use the FP16. + So far, we use the FP32 to run the FasterTransformer. If we use the volta or newer NVIDIA GPU, we can use tensor core when we use the FP16. BF16 is only supported after Ampere NVIDIA GPU (SM 80). - To use the FP16, we only need to set the `` flag to 1 like following: + To use the FP16, we only need to set the `` flag to 1 like following: ```bash ./bin/bert_gemm 32 32 12 64 1 0 ./bin/bert_example 32 12 32 12 64 1 0 0 ``` - Note that the configuration of FP32 and FP16 are different, so we need to generate the configuration again. + To use the BF16, we only need to set the `` flag to 2. + + Note that the configuration of FP32 and FP16/BF16 are different, so we need to generate the configuration again. The outputs should be like to the following: @@ -275,7 +319,7 @@ For those unable to use the NGC container, to set up the required environment or [INFO] batch_size 32 seq_len 32 layer 12 FT-CPP-time 4.00 ms ``` - 1.4 Run FasterTransformer BERT under INT8 on C++ + 4 Run FasterTransformer BERT under INT8 on C++ If we use the Turing or newer NVIDIA GPUs, we can use tensor core when we use the INT8. @@ -311,7 +355,7 @@ For those unable to use the NGC container, to set up the required environment or [INFO] batch_size 32 seq_len 32 layer 12 FT-CPP-time 4.79 ms ( 50 iterations) ``` - 1.5 Run Effective FasterTransformer under FP32 on C++ + 5 Run Effective FasterTransformer under FP32 on C++ To use the Effective FasterTransformer, we only need to set the `` flag to 1 like following: @@ -322,14 +366,14 @@ For those unable to use the NGC container, to set up the required environment or The outputs should be like to the following: - ```bash + ```bash Device Tesla V100-PCIE-32GB before allocate free 29.46 GB total 31.75 GB After allocate free 29.40 GB used 2.35 GB total 31.75 GB [INFO] batch_size 32 seq_len 32 layer 12 FT-CPP-time 9.77 ms ``` - 1.6 Run Effective FasterTransformer under INT8 on C++ + 6 Run Effective FasterTransformer under INT8 on C++ To use the Effective FasterTransformer under INT8, we need to set the `` flag to 1 and `` flag to 1 or 2 like following. Since the sequence length in INT8 should be a multiple of 32, Effective FasterTransformer could be a good choice for INT8. @@ -345,7 +389,7 @@ For those unable to use the NGC container, to set up the required environment or The outputs should be like to the following: - ```bash + ```bash #For int8_mode == 1 Device Tesla T4 Device Tesla T4 @@ -362,9 +406,9 @@ For those unable to use the NGC container, to set up the required environment or [INFO] batch_size 32 seq_len 32 layer 12 FT-CPP-time 2.69 ms ( 50 iterations) ``` -2. Run FasterTransformer on TensorFlow (on T4 GPU) +### Run FasterTransformer BERT on TensorFlow - 2.1 Run FasterTransformer encoder under FP32 on TensorFlow + 1 Run FasterTransformer encoder under FP32 on TensorFlow ```bash ./bin/bert_gemm 32 32 12 64 0 0 @@ -395,7 +439,7 @@ For those unable to use the NGC container, to set up the required environment or Note: We can also generate the best GEMM configuration when running encoder by setting `--allow_gemm_test True`. Note: If users use Ampere GPUs, then TensorFlow will uses TF32 by default, and hence TensorFlow will be faster than FasterTransformer, and have large value differences. - 2.2 Run FasterTransformer BERT under FP16 on TensorFlow + 2 Run FasterTransformer BERT under FP16 on TensorFlow To use the FP16 in TensorFlow, we only need to set the `--data_type fp16` like following: @@ -425,7 +469,7 @@ For those unable to use the NGC container, to set up the required environment or [INFO] batch_size 32 max_seq_len 32 precision FP16 12 layer EFF-OP-while-time 4.98 ms ( 50 iterations) ``` - 2.3 Run FasterTransformer and Effective FasterTransformer encoder under INT8 on TensorFlow + 3 Run FasterTransformer and Effective FasterTransformer encoder under INT8 on TensorFlow To use the INT8 in TensorFlow, we only need to set the `--int8_mode 1` or `--int8_mode 2` like following: @@ -483,11 +527,11 @@ For those unable to use the NGC container, to set up the required environment or Note: since we do not use the correct scales for quantization in this test, the Cross Check between TF and FT should fail. - 2.5 Run FasterTransformer for GLUE dataset + 4 Run FasterTransformer for GLUE dataset This subsection demonstrates how to integrate the FasterTransformer in TensorFlow and evaluate the accuracy of FasterTransformer on GLUE dataset. To evaluate on GLUE dataset, it requires the repo of [BERT](https://github.com/google-research/bert). - 2.5.1 Prepare the BERT codes, Download the BERT pretrained model. + 4.1 Prepare the BERT codes, Download the BERT pretrained model. ```bash git clone https://github.com/google-research/bert.git tensorflow/tensorflow_bert/bert @@ -495,7 +539,7 @@ For those unable to use the NGC container, to set up the required environment or unzip uncased_L-12_H-768_A-12.zip ``` - 2.5.2 Download the GLUE MRPC dataset. Note that the file `download_glue_data.py` can only executed under python3. + 4.2 Download the GLUE MRPC dataset. Note that the file `download_glue_data.py` can only executed under python3. ```bash wget https://gist.githubusercontent.com/W4ngatang/60c2bdb54d156a41194446737ce03e2e/raw/1502038877f6a88c225a34450793fbc3ea87eaba/download_glue_data.py @@ -504,7 +548,7 @@ For those unable to use the NGC container, to set up the required environment or Note: If the `download_glue_data.py` has some issues, try to use [this](https://gist.github.com/vlasenkoalexey/fef1601580f269eca73bf26a198595f3). - 2.5.3 Finetune the pretrained model on MRPC datasets. This takes some minutes. + 4.3 Finetune the pretrained model on MRPC datasets. This takes some minutes. ```bash export BERT_BASE_DIR=${PWD}/uncased_L-12_H-768_A-12 @@ -541,11 +585,11 @@ For those unable to use the NGC container, to set up the required environment or ``` - 2.5.4 Evaluate the accuracy of FasterTransformer under FP32 + 4.4 Evaluate the accuracy of FasterTransformer under FP32 To evaluate the accuracy of FasterTransformer, we can use `tensorflow/tensorflow_bert/run_classifier_wrap.py`. This file uses `run_classifier.py` of BERT repo, replacing the transformer model by FasterTransformer and add some additional arguments like `--floatx`. - ```bash + ```bash ./bin/bert_gemm 8 128 12 64 0 0 python ../examples/tensorflow/bert/tensorflow_bert/run_classifier_wrap.py \ --floatx=float32 \ @@ -575,7 +619,7 @@ For those unable to use the NGC container, to set up the required environment or I1204 01:25:59.203072 140314814412608 run_classifier.py:925] loss = 0.50261945 ``` - 2.5.5 Convert the finetuned checkpoint to FP16 and evaluate the accuracy of FasterTransformer under FP16. + 4.5 Convert the finetuned checkpoint to FP16 and evaluate the accuracy of FasterTransformer under FP16. To convert the checkpoint from FP32 to FP16, we can use `../examples/tensorflow/bert/tensorflow_bert/ckpt_type_convert.py` to convert the checkpoint. This file requires two arguments, the location of FP32 checkpoint, and the location putting the FP16 checkpoint. @@ -612,7 +656,7 @@ For those unable to use the NGC container, to set up the required environment or I1204 01:27:49.962604 139736813242176 run_classifier.py:925] loss = 0.5103358 ``` - 2.5.6 Compare the speed of BERT of TensorFlow and FasterTransformer under both FP32 and FP16. + 4.6 Compare the speed of BERT of TensorFlow and FasterTransformer under both FP32 and FP16. To compare the speed of TensorFlow and FasterTransformer on BERT model directly, we can use `../examples/tensorflow/bert/tensorflow_bert/profile_transformer_inferece.py`. @@ -649,11 +693,11 @@ For those unable to use the NGC container, to set up the required environment or average time (seconds) elapsed fast transformer: 0.009342837333679199 sec ``` - 2.7 Run FasterTransformer for SQuAD 1.1 dataset + 5 Run FasterTransformer for SQuAD 1.1 dataset This subsection demonstrates how to integrate the FasterTransformer in TensorFlow and evaluates the accuracy of FasterTransformer on SQuAD 1.1 dataset. To evaluate on SQuAD 1.1 dataset, it requires the repo of [BERT](https://github.com/google-research/bert). - 2.7.1 Prepare the BERT codes and download the fine-tuned model of SQuAD 1.1 from NGC + 5.1 Prepare the BERT codes and download the fine-tuned model of SQuAD 1.1 from NGC Because the training time of SQuAD is longer, and the NVIDIA NGC has provided the fine-tuned BERT model, we download the fine-tuned model directly. @@ -663,7 +707,7 @@ For those unable to use the NGC container, to set up the required environment or unzip bert_tf_ckpt_base_qa_squad11_amp_128_19.03.1.zip -d squad_model ``` - 2.7.2 Download the SQuAD dataset. + 5.2 Download the SQuAD dataset. ```bash mkdir squad_data @@ -671,7 +715,7 @@ For those unable to use the NGC container, to set up the required environment or wget -P squad_data https://rajpurkar.github.io/SQuAD-explorer/dataset/dev-v1.1.json ``` - 2.7.3 Evaluate the accuracy of TensorFlow under FP32 + 5.3 Evaluate the accuracy of TensorFlow under FP32 ```bash python ../examples/tensorflow/bert/tensorflow_bert/bert/run_squad.py \ @@ -694,7 +738,7 @@ For those unable to use the NGC container, to set up the required environment or {"exact_match": 78.9120151371807, "f1": 86.22012390507868} ``` - 2.7.4 Evaluate the accuracy of FasterTransformer under FP32 + 5.4 Evaluate the accuracy of FasterTransformer under FP32 To evaluate the accuracy of FasterTransformer, we can use `../examples/tensorflow/bert/tensorflow_bert/run_squad_wrap.py`. This file uses `run_squad.py` of BERT repo, replacing the transformer model by FasterTransformer, and add some additional arguments like `--floatx`. @@ -722,7 +766,7 @@ For those unable to use the NGC container, to set up the required environment or {"exact_match": 78.9120151371807, "f1": 86.22012390507868} ``` - 2.7.5 Convert the checkpoint to FP16 and evaluate the accuracy of TensorFlow and FasterTransformer under FP16 + 5.5 Convert the checkpoint to FP16 and evaluate the accuracy of TensorFlow and FasterTransformer under FP16 To convert the checkpoint from FP32 to FP16, we can use `tensorflow/tensorflow_bert/ckpt_type_convert.py` to convert the checkpoint. This file requires two arguments, the location of FP32 checkpoint, and the location putting the FP16 checkpoint. @@ -752,216 +796,230 @@ For those unable to use the NGC container, to set up the required environment or {"exact_match": 79.03500473036897, "f1": 86.23027825772257} ``` - 2.7.6 Evaluate the accuracy of Effective FasterTransformer under FP16 - - Since the total sequence length is not fixed, we recommend using the default gemm configuration directly for Effective FasterTransformer. - - ```bash - python ../examples/tensorflow/bert/tensorflow_bert/run_squad_wrap.py \ - --floatx=float16 \ - --predict_batch_size=8 \ - --vocab_file=squad_model/vocab.txt \ - --bert_config_file=squad_model/bert_config.json \ - --init_checkpoint=squad_fp16_model/model.ckpt \ - --train_file=squad_data/train-v1.1.json \ - --do_predict=True \ - --predict_file=squad_data/dev-v1.1.json \ - --max_seq_length=384 \ - --output_dir=./squad_ft_output/fp_16/ \ - --allow_gemm_test=False \ - --remove_padding=True - - python ../examples/tensorflow/bert/tensorflow_bert/squad_evaluate_v1_1.py squad_data/dev-v1.1.json squad_ft_output/fp_16/predictions.json - ``` - - The results of TensorFlow would be like: - - ```bash - {"exact_match": 79.04446546830653, "f1": 86.23343183703513} - ``` - - 2.7.7 Evaluate the accuracy of FasterTransformer under INT8 - - Please refer to the directory `examples/tensorflow/bert/bert-quantization` first for how to get a quantized model. In `section 2.7.7` and `section 2.7.8`, to keep consistent with the procedures described in `examples/tensorflow/bert/bert-quantization`, we use `https://storage.googleapis.com/bert_models/2020_02_20/uncased_L-12_H-768_A-12.zip` as initial checkpoint with finetuned accuracy of == <89.57, 82.44>. - - In `bert-tf-quantization`, we give detailed procedure of Post Training Quantization (PTQ), Quantization Aware Training (QAT) and QAT with Knowledge-distillation. Since they have the same inference procedure, we use QAT-KD checkpoint to show how to evaluate the accuracy of FasterTransformer under INT8. - - Suppose we already fine-tuned a FP32 checkpoint using QAT-KD with int8_mode == 2 as described in `bert-quantization`. The path to checkpoint is `squad_model/QAT_KD_mode_2/`. - - We first convert the checkpoint from FP32 to FP16 (this step is not necessary, but it will give us a better performance) and then quantize the FP16 checkpoint using `../examples/tensorflow/bert/tensorflow_bert/ckpt_quantization.py`. This file requires three arguments, the location of initial checkpoint, the location putting the quantized checkpoint and the int8_mode. - - ```bash - python ../examples/tensorflow/bert/tensorflow_bert/ckpt_type_convert.py --init_checkpoint=squad_model/QAT_KD_mode_2/model.ckpt-27374 --fp16_checkpoint=squad_model/QAT_KD_mode_2_fp16/model.ckpt - - python ../examples/tensorflow/bert/tensorflow_bert/ckpt_quantization.py --init_checkpoint=squad_model/QAT_KD_mode_2_fp16/model.ckpt --quantized_checkpoint=squad_model/QAT_KD_mode_2_fp16_quantized/model.ckpt --int8_mode=2 - - ./bin/bert_gemm 8 384 12 64 1 1 - python ../examples/tensorflow/bert/tensorflow_bert/run_squad_wrap.py \ - --floatx=float16 \ - --predict_batch_size=8 \ - --vocab_file=squad_model/vocab.txt \ - --bert_config_file=squad_model/bert_config.json \ - --init_checkpoint=squad_model/QAT_KD_mode_2_fp16_quantized/model.ckpt \ - --train_file=squad_data/train-v1.1.json \ - --do_predict=True \ - --predict_file=squad_data/dev-v1.1.json \ - --max_seq_length=384 \ - --output_dir=./squad_ft_output/int8_mode_2/ \ - --int8_mode=2 \ - --allow_gemm_test=False - - python ../examples/tensorflow/bert/tensorflow_bert/squad_evaluate_v1_1.py squad_data/dev-v1.1.json squad_ft_output/int8_mode_2/predictions.json - ``` - - The results of TensorFlow would be like: - - ```bash - {"exact_match": 83.85052034058657, "f1": 90.46351799300075} - ``` - - 2.7.8 Evaluate the accuracy of Effective FasterTransformer under INT8 - - To evaluate the accuracy of Effective FasterTransformer under INT8, we follow the steps described in above section to get the correct checkpoint, and then run `../examples/tensorflow/bert/tensorflow_bert/run_squad_wrap.py` with `--remove_padding True` flag. - - ```bash - ./bin/bert_gemm 8 384 12 64 1 1 - python ../examples/tensorflow/bert/tensorflow_bert/run_squad_wrap.py \ - --floatx=float16 \ - --predict_batch_size=8 \ - --vocab_file=squad_model/vocab.txt \ - --bert_config_file=squad_model/bert_config.json \ - --init_checkpoint=squad_model/QAT_KD_mode_2_fp16_quantized/model.ckpt \ - --train_file=squad_data/train-v1.1.json \ - --do_predict=True \ - --predict_file=squad_data/dev-v1.1.json \ - --max_seq_length=384 \ - --output_dir=./squad_ft_output/int8_mode_2_effectiveTransformer/ \ - --remove_padding=True \ - --int8_mode=2 \ - --allow_gemm_test=False - - python ../examples/tensorflow/bert/tensorflow_bert/squad_evaluate_v1_1.py squad_data/dev-v1.1.json squad_ft_output/int8_mode_2_effectiveTransformer/predictions.json - ``` - - The results of TensorFlow would be like: - - ```bash - {"exact_match": 83.85052034058657, "f1": 90.46351799300075} - ``` - -3. Run FasterTransformer on PyTorch - - Please install HuggingFace's `transformers` first before running the demos by - ```bash - pip install transformers==2.5.1 - ``` - - 3.1 Generate the `gemm_config.in` file: - - ```bash - ./bin/bert_gemm - ./bin/bert_gemm 1 32 12 64 1 0 - ``` - If you want to use the library in other directory, please generate this file according to your setting and copy it to your working directory. - - 3.2 Run the PyTorch BERT sample: - - ```bash - python ../examples/pytorch/bert/bert_example.py <--fp16> <--int8_mode 0/1/2/3> <--sparse> <--time> - python ../examples/pytorch/bert/bert_example.py 1 12 32 12 64 --fp16 --time - ``` - - Remove `--fp16` for fp32 mode. `--int8_mode 1` or `--int8_mode 2` or `--int8_mode 3` will use int8_mode 1 or 2 or 3 in FasterTransformer. `--sparse` will use Ampere sparsity feature if FasterTransformer is built with sparsity support. - - The outputs should be like to the following: - - ```bash - FT Mean diff: 0.0004119873046875 - FT Max diff: 0.00830078125 - FT Min diff: 0.0 - EFF-FT Mean diff: 0.0004119873046875 - EFF-FT Max diff: 0.00830078125 - EFF-FT Min diff: 0.0 - [INFO] HuggingFaceEnocder time costs: 5.77 ms - [INFO] FasterTransformer time costs: 1.12 ms - [INFO] EFF-FasterTransformer time costs: 1.33 ms - ``` - - 3.3 Run the BERT MRPC sample code: - - ```bash - bash ../examples/pytorch/bert/scripts/run_mrpc.sh - ``` - the `` can be: - - `ori`: original HuggingFace's BERT encoder - - `ths`: original HuggingFace's BERT encoder in TorchScript mode - - `thsext`: our TorchScript custom class - - the `` can be `fp32` or `fp16` - - For example, run HuggingFace's BERT under FP32 by following scripts: - - ```bash - bash ../examples/pytorch/bert/scripts/run_mrpc.sh ori fp32 - ``` - - The outputs should be like to the following: - - ```bash - 06/28/2020 07:29:59 - INFO - __main__ - Evaluation for mrpc done in total 4.646116 secs (0.011388 sec per example) - 06/28/2020 07:29:59 - INFO - __main__ - ***** Eval results ***** - 06/28/2020 07:29:59 - INFO - __main__ - acc = 0.8284313725490197 - 06/28/2020 07:29:59 - INFO - __main__ - acc_and_f1 = 0.8556872581808643 - 06/28/2020 07:29:59 - INFO - __main__ - f1 = 0.8829431438127091 - ``` - - For example, run our PyTorch custom op under FP16 by following scripts: - - ```bash - bash ../examples/pytorch/bert/scripts/run_mrpc.sh thsext fp16 - ``` - - The outputs should be like to the following: - - ```bash - 06/28/2020 07:30:19 - INFO - __main__ - Evaluation for mrpc done in total 1.725153 secs (0.004228 sec per example) - 06/28/2020 07:30:19 - INFO - __main__ - ***** Eval results ***** - 06/28/2020 07:30:19 - INFO - __main__ - acc = 0.8284313725490197 - 06/28/2020 07:30:19 - INFO - __main__ - acc_and_f1 = 0.8556872581808643 - 06/28/2020 07:30:19 - INFO - __main__ - f1 = 0.8829431438127091 - ``` - - 3.4 Run the BERT SQuAD sample code: - - ```bash - bash ../examples/pytorch/bert/scripts/run_squad.sh --mtype --dtype --path --head_num --head_size --bs --seqlen --sparse --remove_padding - ``` - - the `` can be: - - `ori`: original HuggingFace's BERT encoder - - `ths`: original HuggingFace's BERT encoder in TorchScript mode - - `thsext`: our TorchScript custom class - - the `` can be `fp32` or `fp16` or `int8_1` or `int8_2` or `int8_3` - - `` is the directory containing the checkpoint - - ``, ``, ``, and `` are the model and running parameters - - `` can be `true` or `false` - - `` can be `true` or `false` - - For example, run our PyTorch custom op under FP16 by following scripts (using HuggingFace's checkpoint): - - ```bash - bash ../examples/pytorch/bert/scripts/run_squad.sh --mtype thsext --dtype fp16 - ``` - - If we want to do INT8 or sparse tests, please refer to the directory `examples/pytorch/bert/bert-quantization-sparsity` first for how to get a trained model. After we obtained a model checkpoint, we can run it by specify the `` and the related parameters. For example, run a BERT base model with INT8 mode 2 and sparse mode (need to do sparse training and QAT simultaneously for the checkpoint): - ```bash - bash ../examples/pytorch/bert/scripts/run_squad.sh \ - --mtype thsext \ - --dtype int8_2 \ - --path \ - --head_num 12 \ - -head_size 64 \ - --sparse true - ``` + 5.6 Evaluate the accuracy of Effective FasterTransformer under FP16 + + Since the total sequence length is not fixed, we recommend using the default gemm configuration directly for Effective FasterTransformer. + + ```bash + python ../examples/tensorflow/bert/tensorflow_bert/run_squad_wrap.py \ + --floatx=float16 \ + --predict_batch_size=8 \ + --vocab_file=squad_model/vocab.txt \ + --bert_config_file=squad_model/bert_config.json \ + --init_checkpoint=squad_fp16_model/model.ckpt \ + --train_file=squad_data/train-v1.1.json \ + --do_predict=True \ + --predict_file=squad_data/dev-v1.1.json \ + --max_seq_length=384 \ + --output_dir=./squad_ft_output/fp_16/ \ + --allow_gemm_test=False \ + --remove_padding=True + + python ../examples/tensorflow/bert/tensorflow_bert/squad_evaluate_v1_1.py squad_data/dev-v1.1.json squad_ft_output/fp_16/predictions.json + ``` + + The results of TensorFlow would be like: + + ```bash + {"exact_match": 79.04446546830653, "f1": 86.23343183703513} + ``` + + 5.7 Evaluate the accuracy of FasterTransformer under INT8 + + Please refer to the directory `examples/tensorflow/bert/bert-quantization` first for how to get a quantized model. In `section 5.7` and `section 5.8`, to keep consistent with the procedures described in `examples/tensorflow/bert/bert-quantization`, we use `https://storage.googleapis.com/bert_models/2020_02_20/uncased_L-12_H-768_A-12.zip` as initial checkpoint with finetuned accuracy of == <89.57, 82.44>. + + In `bert-tf-quantization`, we give detailed procedure of Post Training Quantization (PTQ), Quantization Aware Training (QAT) and QAT with Knowledge-distillation. Since they have the same inference procedure, we use QAT-KD checkpoint to show how to evaluate the accuracy of FasterTransformer under INT8. + + Suppose we already fine-tuned a FP32 checkpoint using QAT-KD with int8_mode == 2 as described in `bert-quantization`. The path to checkpoint is `squad_model/QAT_KD_mode_2/`. + + We first convert the checkpoint from FP32 to FP16 (this step is not necessary, but it will give us a better performance) and then quantize the FP16 checkpoint using `../examples/tensorflow/bert/tensorflow_bert/ckpt_quantization.py`. This file requires three arguments, the location of initial checkpoint, the location putting the quantized checkpoint and the int8_mode. + + ```bash + python ../examples/tensorflow/bert/tensorflow_bert/ckpt_type_convert.py --init_checkpoint=squad_model/QAT_KD_mode_2/model.ckpt-27374 --fp16_checkpoint=squad_model/QAT_KD_mode_2_fp16/model.ckpt + + python ../examples/tensorflow/bert/tensorflow_bert/ckpt_quantization.py --init_checkpoint=squad_model/QAT_KD_mode_2_fp16/model.ckpt --quantized_checkpoint=squad_model/QAT_KD_mode_2_fp16_quantized/model.ckpt --int8_mode=2 + + ./bin/bert_gemm 8 384 12 64 1 1 + python ../examples/tensorflow/bert/tensorflow_bert/run_squad_wrap.py \ + --floatx=float16 \ + --predict_batch_size=8 \ + --vocab_file=squad_model/vocab.txt \ + --bert_config_file=squad_model/bert_config.json \ + --init_checkpoint=squad_model/QAT_KD_mode_2_fp16_quantized/model.ckpt \ + --train_file=squad_data/train-v1.1.json \ + --do_predict=True \ + --predict_file=squad_data/dev-v1.1.json \ + --max_seq_length=384 \ + --output_dir=./squad_ft_output/int8_mode_2/ \ + --int8_mode=2 \ + --allow_gemm_test=False + + python ../examples/tensorflow/bert/tensorflow_bert/squad_evaluate_v1_1.py squad_data/dev-v1.1.json squad_ft_output/int8_mode_2/predictions.json + ``` + + The results of TensorFlow would be like: + + ```bash + {"exact_match": 83.85052034058657, "f1": 90.46351799300075} + ``` + + 5.8 Evaluate the accuracy of Effective FasterTransformer under INT8 + + To evaluate the accuracy of Effective FasterTransformer under INT8, we follow the steps described in above section to get the correct checkpoint, and then run `../examples/tensorflow/bert/tensorflow_bert/run_squad_wrap.py` with `--remove_padding True` flag. + + ```bash + ./bin/bert_gemm 8 384 12 64 1 1 + python ../examples/tensorflow/bert/tensorflow_bert/run_squad_wrap.py \ + --floatx=float16 \ + --predict_batch_size=8 \ + --vocab_file=squad_model/vocab.txt \ + --bert_config_file=squad_model/bert_config.json \ + --init_checkpoint=squad_model/QAT_KD_mode_2_fp16_quantized/model.ckpt \ + --train_file=squad_data/train-v1.1.json \ + --do_predict=True \ + --predict_file=squad_data/dev-v1.1.json \ + --max_seq_length=384 \ + --output_dir=./squad_ft_output/int8_mode_2_effectiveTransformer/ \ + --remove_padding=True \ + --int8_mode=2 \ + --allow_gemm_test=False + + python ../examples/tensorflow/bert/tensorflow_bert/squad_evaluate_v1_1.py squad_data/dev-v1.1.json squad_ft_output/int8_mode_2_effectiveTransformer/predictions.json + ``` + + The results of TensorFlow would be like: + + ```bash + {"exact_match": 83.85052034058657, "f1": 90.46351799300075} + ``` + +### Run FasterTransformer BERT on PyTorch + + Please install HuggingFace's `transformers` first before running the demos by + + ```bash + pip install transformers==2.5.1 + ``` + + 1 Generate the `gemm_config.in` file: + + ```bash + ./bin/bert_gemm + ./bin/bert_gemm 1 32 12 64 1 0 + ``` + Data Type = 0 (FP32) or 1 (FP16) or 2 (BF16) + + If you want to use the library in other directory, please generate this file according to your setting and copy it to your working directory. + + 2 Run the PyTorch BERT sample: + + ```bash + python ../examples/pytorch/bert/bert_example.py <--data_type fp32/fp16/bf16> <--int8_mode 0/1/2/3> <--sparse> <--time> + python ../examples/pytorch/bert/bert_example.py 1 12 32 12 64 --data_type fp16 --time + ``` + + Set `--data_type fp32` for fp32 mode, and set `--data_type bf16` for bf16 mode. `--int8_mode 1` or `--int8_mode 2` or `--int8_mode 3` will use int8_mode 1 or 2 or 3 in FasterTransformer. `--sparse` will use Ampere sparsity feature if FasterTransformer is built with sparsity support. + + The outputs should be like to the following: + + ```bash + FT Mean diff: 0.0004119873046875 + FT Max diff: 0.00830078125 + FT Min diff: 0.0 + EFF-FT Mean diff: 0.0004119873046875 + EFF-FT Max diff: 0.00830078125 + EFF-FT Min diff: 0.0 + [INFO] HuggingFaceEnocder time costs: 5.77 ms + [INFO] FasterTransformer time costs: 1.12 ms + [INFO] EFF-FasterTransformer time costs: 1.33 ms + ``` + + 3 Run the BERT MRPC sample code: + + ```bash + bash ../examples/pytorch/bert/scripts/run_mrpc.sh + ``` + the `` can be: + - `ori`: original HuggingFace's BERT encoder + - `ths`: original HuggingFace's BERT encoder in TorchScript mode + - `thsext`: our TorchScript custom class + + the `` can be `fp32` or `fp16` or `bf16` + + For example, run HuggingFace's BERT under FP32 by following scripts: + + ```bash + bash ../examples/pytorch/bert/scripts/run_mrpc.sh ori fp32 + ``` + + The outputs should be like to the following: + + ```bash + 06/28/2020 07:29:59 - INFO - __main__ - Evaluation for mrpc done in total 4.646116 secs (0.011388 sec per example) + 06/28/2020 07:29:59 - INFO - __main__ - ***** Eval results ***** + 06/28/2020 07:29:59 - INFO - __main__ - acc = 0.8284313725490197 + 06/28/2020 07:29:59 - INFO - __main__ - acc_and_f1 = 0.8556872581808643 + 06/28/2020 07:29:59 - INFO - __main__ - f1 = 0.8829431438127091 + ``` + + For example, run our PyTorch custom op under FP16 by following scripts: + + ```bash + bash ../examples/pytorch/bert/scripts/run_mrpc.sh thsext fp16 + ``` + + The outputs should be like to the following: + + ```bash + 06/28/2020 07:30:19 - INFO - __main__ - Evaluation for mrpc done in total 1.725153 secs (0.004228 sec per example) + 06/28/2020 07:30:19 - INFO - __main__ - ***** Eval results ***** + 06/28/2020 07:30:19 - INFO - __main__ - acc = 0.8284313725490197 + 06/28/2020 07:30:19 - INFO - __main__ - acc_and_f1 = 0.8556872581808643 + 06/28/2020 07:30:19 - INFO - __main__ - f1 = 0.8829431438127091 + ``` + + 4 Run the BERT SQuAD sample code: + + ```bash + bash ../examples/pytorch/bert/scripts/run_squad.sh --mtype --dtype --path --head_num --head_size --bs --seqlen --sparse --remove_padding + ``` + - the `` can be: + - `ori`: original HuggingFace's BERT encoder + - `ths`: original HuggingFace's BERT encoder in TorchScript mode + - `thsext`: our TorchScript custom class + - the `` can be `fp32` or `fp16` or `bf16` or `int8_1` or `int8_2` or `int8_3` + - `` is the directory containing the checkpoint + - ``, ``, ``, and `` are the model and running parameters + - `` can be `true` or `false` + - `` can be `true` or `false` + + For example, run our PyTorch custom op under FP16 by following scripts (using HuggingFace's checkpoint): + + ```bash + bash ../examples/pytorch/bert/scripts/run_squad.sh --mtype thsext --dtype fp16 + ``` + + If we want to do INT8 or sparse tests, please refer to the directory `examples/pytorch/bert/bert-quantization-sparsity` first for how to get a trained model. After we obtained a model checkpoint, we can run it by specify the `` and the related parameters. For example, run a BERT base model with INT8 mode 2 and sparse mode (need to do sparse training and QAT simultaneously for the checkpoint): + ```bash + bash ../examples/pytorch/bert/scripts/run_squad.sh \ + --mtype thsext \ + --dtype int8_2 \ + --path \ + --head_num 12 \ + -head_size 64 \ + --sparse true + ``` + +### Run the PyTorch BERT sample with multi-GPU: + + Since v5.1, FasterTransformer supports multi-node multi-GPU inference on BERT model under FP32, FP16 and BF16. Users can use `--tensor_para_size` and `pipeline_para_size` to control the tensor parallelism and pipeline parallelism. + + ```bash + mpirun -n 4 python3 ../examples/pytorch/bert/bert_example.py 32 12 32 12 64 --data_type fp16 --tensor_para_size 2 --pipeline_para_size 2 + ``` + + * Note that multi-node inference is also supported. The usage is same to multi-GPU under MPI. + * Note that the performances under model parallelism are affected by the hardware and network significantly. If your GPUs are connected by PCIe, using model parallelism may bring few speedup or even worse performance. ## Performance @@ -969,6 +1027,7 @@ Hardware settings: * A100 (with mclk 1593MHz, pclk 1410MHz) with AMD EPYC 7742 64-Core Processor * T4 (with mclk 5000MHz, pclk 1590MHz) with Intel(R) Xeon(R) CPU E5-2670 0 @ 2.60GHz * V100 (with mclk 877MHz, pclk 1380MHz) with Intel(R) Xeon(R) CPU E5-2698 v4 @ 2.20GHz (dgx-1 server) +* A10 (with mclk 6251, pclk 1695) with AMD EPYC 7232P 8-Core Processor Note that the CPU may affect the performance when the batch size and sequence length are small. @@ -978,7 +1037,58 @@ To run the following benchmark, we need to install the unix computing tool "bc" apt-get install bc ``` -### BERT performance +### Multi-GPU BERT-6B performance on A100 and triton example + +These benchmarks are ran by `bert_triton_example.cc`. These benchmark compare the performance of different model parallelism size. The GPUs are connected by NVLink. Note that for model parallelism, there are large effects on hardware and network. + +The model configuration are: +* head_num = 32 +* size_per_head = 128 +* num_layers = 32 + +* Compare tensor parallelism (TP) and pipeline parallelism (PP) + +| Batch_size | Seq_len | Precision | TP1, PP1
Latency (ms) | TP2, PP1
Latency (ms) | TP1, PP2
Latency (ms) | TP2, PP 1
Speedup | TP1, PP 2
Speedup | +| :--------: | :-----: | :-------: | :-------------------------: | :-------------------------: | :-------------------------: | :---------------------: | :---------------------: | +| 1 | 32 | fp16 | 10.58 | 8.35 | 10.81 | 1.27 | 0.98 | +| 1 | 128 | fp16 | 10.87 | 9.39 | 11.14 | 1.16 | 0.98 | +| 1 | 384 | fp16 | 26.07 | 19.48 | 25.42 | 1.34 | 1.03 | +| 1 | 1024 | fp16 | 47.02 | 32.13 | 46.56 | 1.46 | 1.01 | +| 4 | 32 | fp16 | 12.44 | 10.91 | 16.4 | 1.14 | 0.76 | +| 4 | 128 | fp16 | 24.98 | 18.34 | 26.86 | 1.36 | 0.93 | +| 4 | 384 | fp16 | 61.99 | 38.19 | 50.46 | 1.62 | 1.23 | +| 32 | 32 | fp16 | 26.36 | 19.62 | 27.01 | 1.34 | 0.98 | +| 32 | 32 | fp16 | 26.5 | 19.67 | 27.51 | 1.35 | 0.96 | +| 32 | 128 | fp16 | 132 | 81.42 | 89.9 | 1.62 | 1.47 | +| 32 | 384 | fp16 | 409.41 | 233.69 | 282.46 | 1.75 | 1.45 | +| 32 | 1024 | fp16 | 1145.01 | 613.86 | 760.44 | 1.87 | 1.51 | +| 128 | 32 | fp16 | 112.37 | 70.65 | 87.77 | 1.59 | 1.28 | +| 128 | 128 | fp16 | 469.51 | 264.02 | 303.99 | 1.78 | 1.54 | +| 128 | 384 | fp16 | 1477.78 | 804.84 | 1020.95 | 1.84 | 1.45 | +| 128 | 1024 | fp16 | 4975.6 | 2629.93 | 3136.76 | 1.89 | 1.59 | + +* Compare scaling of different tensor parallelism (TP) + +| Batch_size | Seq_len | Precision | TP1, PP1
Latency (ms) | TP2, PP1
Latency (ms) | TP4, PP1
Latency (ms) | TP2, PP 1
Speedup | TP4, PP 1
Speedup | +| :--------: | :-----: | :-------: | :-------------------------: | :-------------------------: | :-------------------------: | :---------------------: | :---------------------: | +| 1 | 32 | fp16 | 10.58 | 8.35 | 6.21 | 1.27 | 1.70 | +| 1 | 128 | fp16 | 10.87 | 9.39 | 6.98 | 1.16 | 1.56 | +| 1 | 384 | fp16 | 26.07 | 19.48 | 14.65 | 1.34 | 1.78 | +| 1 | 1024 | fp16 | 47.02 | 32.13 | 21.29 | 1.46 | 2.21 | +| 4 | 32 | fp16 | 12.44 | 10.91 | 8.67 | 1.14 | 1.43 | +| 4 | 128 | fp16 | 24.98 | 18.34 | 14.12 | 1.36 | 1.77 | +| 4 | 384 | fp16 | 61.99 | 38.19 | 26.56 | 1.62 | 2.33 | +| 32 | 32 | fp16 | 26.36 | 19.62 | 14.55 | 1.34 | 1.81 | +| 32 | 32 | fp16 | 26.5 | 19.67 | 14.53 | 1.35 | 1.82 | +| 32 | 128 | fp16 | 132 | 81.42 | 48.93 | 1.62 | 2.70 | +| 32 | 384 | fp16 | 409.41 | 233.69 | 138.12 | 1.75 | 2.96 | +| 32 | 1024 | fp16 | 1145.01 | 613.86 | 364.4 | 1.87 | 3.14 | +| 128 | 32 | fp16 | 112.37 | 70.65 | 44.84 | 1.59 | 2.51 | +| 128 | 128 | fp16 | 469.51 | 264.02 | 161.36 | 1.78 | 2.91 | +| 128 | 384 | fp16 | 1477.78 | 804.84 | 477.71 | 1.84 | 3.09 | +| 128 | 1024 | fp16 | 4975.6 | 2629.93 | 1529.07 | 1.89 | 3.25 | + +### Single GPU BERT performance We demonstrate the inference time of FasterTransformer in C++, TensorFlow and PyTorch, and compared to the performance on A100, T4 and V100. @@ -999,6 +1109,7 @@ In the experiments of encoder, we updated the following parameters: * head_num = 12 * size_per_head = 64 * num_layers = 12 +* EFF-FT: Use remove padding. The avereage sequence length is set to half of `Seq_len`. For example, when `Seq_len` is 128, the real sequence length is 64, and other 64 tokens are paddings. #### BERT performance on A100 and TensorFlow @@ -1298,6 +1409,64 @@ User can use `export NVIDIA_TF32_OVERRIDE=1` to enforce the program run under TF | <32, 128> | 3.62 | 2.94 | 2.28 | 2.04 | 1.23 | 1.12 | | <32, 384> | 10.10 | 8.60 | 5.77 | 5.38 | 1.17 | 1.07 | +#### BERT performance on A10 and PyTorch + +* Performance on FP32 + +| Batch_size | Seq_len | Precision | TorchScript
Latency (ms) | FT
Latency (ms) | EFF-FT
Latency (ms) | FT
Speedup | EFF-FT
Speedup | +| :--------: | :-----: | :-------: | :----------------------------: | :-------------------: | :-----------------------: | :--------------: | :------------------: | +| 1 | 32 | FP32 | 3.98 | 2.08 | 2.31 | 1.91 | 1.72 | +| 1 | 128 | FP32 | 3.98 | 3.58 | 2.70 | 1.11 | 1.47 | +| 1 | 384 | FP32 | 9.38 | 7.95 | 3.83 | 1.17 | 2.44 | +| 8 | 32 | FP32 | 6.91 | 5.83 | 3.31 | 1.18 | 2.08 | +| 8 | 128 | FP32 | 20.30 | 16.82 | 12.94 | 1.20 | 1.56 | +| 8 | 384 | FP32 | 65.68 | 54.49 | 28.36 | 1.20 | 2.31 | +| 32 | 32 | FP32 | 20.48 | 17.13 | 10.51 | 1.19 | 1.94 | +| 32 | 128 | FP32 | 80.18 | 68.22 | 41.48 | 1.17 | 1.93 | +| 32 | 384 | FP32 | 264.69 | 213.87 | 141.08 | 1.23 | 1.87 | + +* Performance on FP16 + +| Batch_size | Seq_len | Precision | TorchScript
Latency (ms) | FT
Latency (ms) | EFF-FT
Latency (ms) | FT
Speedup | EFF-FT
Speedup | +| :--------: | :-----: | :-------: | :----------------------------: | :-------------------: | :-----------------------: | :--------------: | :------------------: | +| 1 | 32 | FP16 | 4.20 | 1.06 | 1.76 | 3.96 | 2.38 | +| 1 | 128 | FP16 | 4.38 | 1.02 | 1.83 | 4.29 | 2.39 | +| 1 | 384 | FP16 | 4.09 | 2.30 | 1.81 | 1.77 | 2.25 | +| 8 | 32 | FP16 | 3.76 | 1.54 | 1.92 | 2.44 | 1.95 | +| 8 | 128 | FP16 | 5.78 | 4.02 | 2.81 | 1.43 | 2.05 | +| 8 | 384 | FP16 | 18.43 | 10.91 | 4.52 | 1.68 | 4.07 | +| 32 | 32 | FP16 | 5.36 | 3.92 | 2.41 | 1.36 | 2.22 | +| 32 | 128 | FP16 | 21.59 | 15.30 | 8.13 | 1.41 | 2.65 | +| 32 | 384 | FP16 | 73.50 | 43.74 | 25.22 | 1.68 | 2.91 | + +* Performance on INT8-v1 + +| Batch_size | Seq_len | TorchScript-FP16
Latency (ms) | FT-INT8-v1
Latency (ms) | EFF-FT-INT8-v1
Latency (ms) | FT-INT8-v1
Speedup | EFF-FT-INT8-v1
Speedup | +| :--------: | :-----: | :---------------------------------: | :---------------------------: | :-------------------------------: | :----------------------: | :--------------------------: | +| 1 | 32 | 4.00 | 1.34 | 1.37 | 2.98 | 2.91 | +| 1 | 128 | 4.43 | 1.56 | 1.42 | 2.83 | 3.11 | +| 1 | 384 | 3.93 | 2.01 | 1.48 | 1.95 | 2.65 | +| 8 | 32 | 3.60 | 1.79 | 1.59 | 2.01 | 2.26 | +| 8 | 128 | 5.82 | 3.48 | 2.49 | 1.67 | 2.33 | +| 8 | 384 | 18.41 | 9.55 | 4.47 | 1.92 | 4.11 | +| 32 | 32 | 5.42 | 3.77 | 2.28 | 1.43 | 2.37 | +| 32 | 128 | 21.51 | 12.08 | 6.63 | 1.78 | 3.24 | +| 32 | 384 | 73.67 | 35.65 | 20.96 | 2.06 | 3.51 | + +* Performance on INT8-v2 + +| Batch_size | Seq_len | TorchScript-FP16
Latency (ms) | FT-INT8-v2
Latency (ms) | EFF-FT-INT8-v2
Latency (ms) | FT-INT8-v2
Speedup | EFF-FT-INT8-v2
Speedup | +| :--------: | :-----: | :---------------------------------: | :---------------------------: | :-------------------------------: | :----------------------: | :--------------------------: | +| 1 | 32 | 4.04 | 1.37 | 1.40 | 2.94 | 2.88 | +| 1 | 128 | 4.41 | 1.42 | 1.42 | 3.10 | 3.10 | +| 1 | 384 | 3.88 | 1.73 | 1.49 | 2.24 | 2.60 | +| 8 | 32 | 3.69 | 1.57 | 1.51 | 2.35 | 2.44 | +| 8 | 128 | 5.87 | 2.37 | 1.89 | 2.47 | 3.10 | +| 8 | 384 | 18.43 | 6.42 | 3.21 | 2.87 | 5.74 | +| 32 | 32 | 5.41 | 2.64 | 1.91 | 2.04 | 2.83 | +| 32 | 128 | 21.50 | 8.08 | 4.64 | 2.66 | 4.63 | +| 32 | 384 | 73.65 | 25.42 | 14.04 | 2.89 | 5.24 | + #### BERT performance on T4 and PyTorch * Performance on FP32 diff --git a/docs/decoder_guide.md b/docs/decoder_guide.md index 24b778913..ac3e7c2ce 100644 --- a/docs/decoder_guide.md +++ b/docs/decoder_guide.md @@ -245,8 +245,9 @@ For those unable to use the NGC container, to set up the required environment or `./bin/decoding_example` runs the decoding with beam search or sampling in the `C++`. The arguments of `decoding_example` is: ```bash - ./bin/decoding_example + ./bin/decoding_example ``` + Data Type = 0 (FP32) or 1 (FP16) or 2 (BF16) Then the following scripts can run the decoding with beam search under the above settings. @@ -277,17 +278,19 @@ For those unable to use the NGC container, to set up the required environment or [INFO] batch_size 32 beam_width 1 head_num 8 size_per_head 64 max_seq_len 32 num_layers 6 vocab_size 30000, top_k 0, top_p 0.500, FT-CPP-decoding-time 75.91 ms ``` - 1.3 Run decoding under FP16 on C++ + 1.3 Run decoding under FP16/BF16 on C++ - So far, we use the FP32 to run the FasterTransformer. If we use the volta or newer NVIDIA GPU, we can use tensor core to accelerate when we use the FP16. + So far, we use the FP32 to run the FasterTransformer. If we use the volta or newer NVIDIA GPU, we can use tensor core to accelerate when we use the FP16. BF16 is only supported after Ampere NVIDIA GPU (SM 80). - To use the FP16, we only need to set the `` flag to 1 like following: + To use the FP16, we only need to set the `` flag to 1 like following: ```bash ./bin/decoding_gemm 32 4 8 64 2048 30000 32 512 1 ./bin/decoding_example 32 4 8 64 2048 30000 6 32 32 512 0 0.0 1 ``` + To use the BF16, we only need to set the `` flag to 2. + Note that the configuration of FP32 and FP16 are different, so we need to generate the configuration again. The outputs should be like to the following: @@ -565,18 +568,20 @@ For those unable to use the NGC container, to set up the required environment or 3.1 Generate the `gemm_config.in` file: ```bash - ./bin/decoding_gemm + ./bin/decoding_gemm ./bin/decoding_gemm 8 4 8 64 2048 31538 32 512 1 ``` + + Data Type = 0 (FP32) or 1 (FP16) or 2 (BF16) + If you want to use the library in other directory, please generate this file according to your setting and copy it to your working directory. 3.2 Run the PyTorch decoder sample: ```bash - python ../examples/pytorch/decoder/decoder_example.py <--fp16> <--time> - python ../examples/pytorch/decoder/decoder_example.py 8 6 32 8 64 --fp16 --time + python ../examples/pytorch/decoder/decoder_example.py <--data_type fp32/fp16/bf16> <--time> + python ../examples/pytorch/decoder/decoder_example.py 8 6 32 8 64 --data_type fp16 --time ``` - Remove `--fp16` for fp32 mode. The outputs should be like to the following: @@ -592,10 +597,9 @@ For those unable to use the NGC container, to set up the required environment or 3.3 Run the PyTorch decoding sample: ```bash - python pytorch/decoding_sample.py <--fp16> <--time> - python ../examples/pytorch/decoding/decoding_example.py 8 6 32 8 64 4 31538 --fp16 --time + python pytorch/decoding_sample.py <--data_type fp32/fp16/bf16> <--time> + python ../examples/pytorch/decoding/decoding_example.py 8 6 32 8 64 4 31538 --data_type fp16 --time ``` - Remove `--fp16` for fp32 mode. The outputs should be like to the following: @@ -698,7 +702,7 @@ For those unable to use the NGC container, to set up the required environment or - `torch_decoding`: PyTorch version decoding with the method FasterTransformer decoding uses - `torch_decoding_with_decoder_ext`: PyTorch version decoding with the method FasterTransformer decoding uses but replace the decoder with the FasterTransformer decoder - the `` can be `fp32` or `fp16` + the `` can be `fp32` or `fp16` or `bf16` If you do not specify the output file, it only print to the standard output. diff --git a/docs/gpt_guide.md b/docs/gpt_guide.md index 71c4fab2d..7422a83c3 100644 --- a/docs/gpt_guide.md +++ b/docs/gpt_guide.md @@ -16,8 +16,17 @@ - [Build the project](#build-the-project) - [How to use](#how-to-use) - [Prepare](#prepare-1) + - [Download openai-gpt model and convert](#download-openai-gpt-model-and-convert) + - [Download megatron model and convert](#download-megatron-model-and-convert) + - [Download onnx model and convert](#download-onnx-model-and-convert) + - [Download huggingface gpt model and convert](#download-huggingface-gpt-model-and-convert) - [Run GPT](#run-gpt) + - [Run GPT with prompts](#run-gpt-with-prompts) + - [Run Meta OPT](#run-meta-opt) - [gpt with triton backend](#gpt-with-triton-backend) + - [Advanced features](#advanced-features) + - [generate different sentences and enable shared context](#generate-different-sentences-and-enable-shared-context) + - [Interactive generation](#interactive-generation) - [Performance](#performance) - [Large model inference with model parallel](#large-model-inference-with-model-parallel) - [Performance of Megatron-530B](#performance-of-megatron-530b) @@ -27,7 +36,6 @@ - [Performance of GPT-6.7B](#performance-of-gpt-67b) - [Performance of GPT-1.3B](#performance-of-gpt-13b) - [Performance of GPT-350M](#performance-of-gpt-350m) - - [TODO](#todo) ## Introduction @@ -45,6 +53,7 @@ GPT is a variant of Decoding model, which does not have the encoder module, cros * Data type * FP32 * FP16 + * BF16 * INT8 weight only PTQ for bs 1 and 2 * Feature * Multi-GPU multi-node inference @@ -64,6 +73,7 @@ GPT is a variant of Decoding model, which does not have the encoder module, cros
Fig 1. Workflow of GPT model.
+

Fig 1 demonstrates the workflow of FasterTransformer GPT. Different from BERT and encoder-decoder structure, GPT receive some input ids as context, and generates the respective output ids as response. In this workflow, the major bottleneck is the GptDecoderLayer (transformer block) because the time increase linearly when we increase the number of layers. In GPT-3, the GptDecoderLayer takes about 95% of total time. @@ -77,6 +87,7 @@ FasterTransformer splits the whole workflow into 2 parts. The first one is “co Fig 2. Comparison between different self attention.             Fig 3. Workflow of GPT with tensor parallelism. +

The following examples demonstrating how to run multi-GPU and multi-node GPT model. 1. `examples/cpp/multi_gpu_gpt_example.cc`: It uses MPI to organize all GPUs. @@ -94,62 +105,82 @@ In c++ example codes, we skip the step 4 and step 6, loading the request by `exa The source codes are put in `src/fastertransformer/models/multi_gpu_gpt/ParallelGpt.cc`. The arguments, input tensors and output tensors of GPT: -* Arguments: - 1. Maximum batch size (Deprecated, move to input) - 2. Maximum sequence length (Deprecated, move to input) - 3. Maximum input sequence length (Deprecated, move to input) - 4. beam width for beam search. If setting b to be 1, then we don’t use beam search but use sampling. (Deprecated, move to input) - 5. Head number - 6. Size per head - 7. Intermediate size. The inter size of feed forward network. It is often set to 4 * head_num * size_per_head. - 8. Number of decoder layers - 9. Vocab size - 10. Start id of the vocabulary - 11. End id of the vocabulary - 12. Diversity rate of beam search. A hyper hyper-parameter for [simple diverse decoding](https://arxiv.org/pdf/1611.08562.pdf). (Deprecated, move to input) - 13. top_k value for top k sampling. (Deprecated, move to input) - 14. top_p value for top p sampling. (Deprecated, move to input) - 15. Random seed for sampling. (Deprecated, move to input) - 16. Temperature for logit. Setting to be 1.0 if you don’t want to apply the temperature. (Deprecated, move to input) - 17. Length penalty for logit. Setting to be 1.0 if you don’t want to apply the length penalty. (Deprecated, move to input) - 18. Repetition penalty for logit. Setting to be 1.0 if you don’t want to apply the repetition penalty. (Deprecated, move to input) - 19. Tensor Parallel information, which is declared in `src/fastertransformer/utils/nccl_utils.h`. - 20. Pipeline Parallel information, which is declared in `src/fastertransformer/utils/nccl_utils.h`. - 21. CUDA stream. - 22. Pointer of cuBLAS wrapper, which is declared in `src/fastertransformer/utils/cublasMMWrapper.h`. - 23. Pointer of memory allocator, which is declared in `src/fastertransformer/utils/allocator.h` - 24. “is_free_buffer_after_forward” flag. If setting to be true, FasterTransformer will allocate buffer before forward, and free buffer after forward. If the memory is controlled by memory pool and the cost of allocating/releasing memory is small, setting the flag to be true can save some memory. - 25. Pointer of CUDA device properties, which is used to get the properties of hardware like size of shared memory. - 26. Is using sparsity. - 27. Int8 mode. - 28. Custom all reduction communication for custom all reduction in model parallelism. It is only supported in 8-way tensor parallelism. - 29. Flag of enable custom all reduction or not. -* Input tensors: - 1. Input ids (context). The shape is \[ request batch size * beam width, request maximum input length \]. - 2. Input lengths. The shape is \[ request batch size * beam width \]. - 3. Maximum output sequence length. An integer to describe the largest number of tokens you hope for results. Note that it includes the input ids. - 4. Stop word list. When FT generates words in this list, it will stop the generation. An extension of stop id, optional. - 5. Start id in runtime. The shape is \[batch_size\] on cpu, optional. If FT receives this input, FT will replace default start id by it, optional. - 6. End id in runtime. The shape is \[batch_size\] on cpu, optional. If FT receives this input, FT will replace default end id by it, optional. - 7. top_k value for top k sampling. The shape is \[1\] or \[batch_size, 1\] on cpu, optional. - 8. top_p value for top p sampling. The shape is \[1\] or \[batch_size, 1\] on cpu, optional. - 9. Diversity rate of beam search (beam_search_diversity_rate). A hyper hyper-parameter for [simple diverse decoding](https://arxiv.org/pdf/1611.08562.pdf). [1] or \[batch_size, 1\] on cpu, optional. - 10. Temperature for logit (temperature). The sahpe \[1\] or \[batch_size, 1\] on cpu, optional. - 11. Length penalty for logit (len_penalty). The shape is \[1\] or \[batch_size, 1\] on cpu, optional - 12. Repetition penalty for logit (repetition_penalty). The shape is \[1\] or \[batch_size, 1\] on cpu, optional - 13. Random_seed \[1\] or \[batch_size, 1\] on cpu, optional - 14. Length of prefix soft prompt embedding. This describes how many tokens of soft prompt embedding in each sentence. The shape is \[batch_size\], optional. - 15. Prefix soft prompt embedding. FT will concat them with results of embedding lookup kernel. The shape is \[batch_size, max_prefix_soft_prompt_length, hidden_units\], optional. -* Output tensors: - 1. Output ids. The shape is \[batch size, beam width, maximum output sequence length \]. - 2. Parent ids. It is used to find the best path in beam search. It is deprecated now. - 3. Sequence lengths. The shape is \[batch size * beam width\]. It records the final sequence lengths of all sentences. - 4. Log probability for sampling. The shape is \[requested token number, batch size, beam \]. It records the log probability of logits at each step. Optional outputs in FP32. - 5. Cumulative log probability of generated senteces. The shape is \[batch size, beam\]. Optional outputs in FP32. - -The `beam_width` value is set by the output shape directly. When the `beam_width` is larger than 1, FT will use beam search to generate tokens; otherwise, FT will use topk or topp sampling. - -We also provide the module `Gpt` in `src/fastertransformer/models/gpt/Gpt.cc`, which is a GPT model without model parallelism. It does not need the arguments 19 and 20, while others are same. +* Constructor of GPT + +| Classification | Name | Data Type | Description | +| :------------: | :--------------------------: | :----------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| [0] | max_batch_size | size_t | **Deprecated, move to input** | +| [1] | max_seq_len | size_t | **Deprecated, move to input** | +| [2] | max_input_len | size_t | **Deprecated, move to input** | +| [3] | beam_width | size_t | **Deprecated, move to input** | +| [4] | head_num | size_t | Head number for model configuration | +| [5] | size_per_head | size_t | Size per head for model configuration | +| [6] | inter_size | size_t | The inter size of feed forward network. It is often set to 4 * head_num * size_per_head. | +| [7] | num_layer | size_t | Number of transformer layers for model configuration | +| [8] | vocab_size | int | Vocabulary size for model configuration | +| [9] | start_id | int | Start id for vocabulary | +| [10] | end_id | int | End id for vocabulary | +| [11] | prompt_learning_start_id | int | The start id of virtual token in p/prompt-tuning | +| [12] | prompt_learning_type | PromptLearningType | The type of prompt learning when we load the prompt embedding in constructor. FT supports `no_prompt`, `soft_prompt`, `prefix_prompt`, `p_prompt_tuning` now | +| [13] | gpt_variant_params | gptVariantParams | This structure defines some hyper-parameters of gpt layers, including type of layernorm and activation | +| [14] | beam_search_diversity_rate | float | **Deprecated, move to input** | +| [15] | top_k | size_t | **Deprecated, move to input** | +| [16] | top_p | float | **Deprecated, move to input** | +| [17] | random_seed | unsigned long long | **Deprecated, move to input** | +| [18] | temperature | float | **Deprecated, move to input** | +| [19] | len_penalty | float | **Deprecated, move to input** | +| [20] | repetition_penalty | float | **Deprecated, move to input** | +| [21] | tensor_para | NcclParam | Tensor Parallel information, which is declared in `src/fastertransformer/utils/nccl_utils.h` | +| [22] | pipeline_para | NcclParam | Pipeline Parallel information, which is declared in `src/fastertransformer/utils/nccl_utils.h` | +| [23] | stream | cudaStream_t | CUDA stream | +| [24] | cublas_wrapper | cublasMMWrapper* | Pointer of cuBLAS wrapper, which is declared in `src/fastertransformer/utils/cublasMMWrapper.h` | +| [25] | allocator | IAllocator* | Pointer of memory allocator, which is declared in `src/fastertransformer/utils/allocator.h` | +| [26] | is_free_buffer_after_forward | bool | If setting to be `true`, FasterTransformer will allocate buffer before forward, and free buffer after forward. When the allocator is based on memory pool, setting to `true` may help reducing the memory usage during inference. | +| [27] | cuda_device_prop | cudaDeviceProp* | Pointer of CUDA device properties, which is used to get the properties of hardware like size of shared memory | +| [28] | sparse | bool | Is using sparsity. **Experimental feature** | +| [29] | int8_mode | int | Using int8 weight only quantization or not. **Experimental feature** | +| [30] | custom_all_reduce_comm | AbstractCustomComm | Custom all reduction communication for custom all reduction in model parallelism. It is only supported in 8-way tensor parallelism | +| [31] | enable_custom_all_reduce | int | Flag of enabling custom all reduction or not | +| [32] | remove_padding | bool | Remove the padding of input ids or not in context phase. | +| [33] | shared_contexts_ratio | float | Ratio that controls the use of the shared contexts optimization. If the compact size (that accounts only for unique prompts) is less than ratio * batch size, use the optimized implementation. Setting shared_contexts_ratio=0 deactivate the optimization. | + +* Input of GPT + +| Name | Tensor/Parameter Shape | Location | Data Type | Description | +| :-----------------------------: | :-------------------------------------------: | :------: | :--------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| input_ids | [batch_size, max_input_length] | GPU | int | The input ids (context) | +| input_lengths | [batch_size] | GPU | int | The lengths of input ids | +| prompt_learning_task_name_ids | [batch_size] | CPU | int | **Optional**. Task name ids for prompt learning. | +| output_seq_len | [batch_size] | CPU | uint32_t | The largest number of tokens you hope for results. Note that it contains the input length | +| stop_words_list | [batch_size, 2, stop_words_length] | GPU | int | **Optional**. When FT generates words in this list, it will stop the generation. An extension of stop id | +| bad_words_list | [batch_size, 2, bad_words_length] | GPU | int | **Optional**. The words in the list will be When FT generates words in this list, it will stop the generation. An extension of stop id | +| start_id | [batch_size] | CPU | int | **Optional**. If FT receives this input, FT will replace default start id by it | +| end_id | [batch_size] | CPU | int | **Optional**. If FT receives this input, FT will replace default end id by it | +| runtime_top_k | [1] or [batch_size] | CPU | uint | **Optional**. top_k value for top k sampling | +| runtime_top_p | [1] or [batch_size] | CPU | float | **Optional**. top_p value for top p sampling | +| beam_search_diversity_rate | [1] or [batch_size] | CPU | float | **Optional**. A hyper hyper-parameter for [simple diverse decoding](https://arxiv.org/pdf/1611.08562.pdf) | +| temperature | [1] or [batch_size] | CPU | float | **Optional**. Temperature applied to logits for both beam search and sampling | +| len_penalty | [1] or [batch_size] | CPU | float | **Optional**. Length penalty applied to logits for only beam search | +| repetition_penalty | [1] or [batch_size] | CPU | float | **Optional**. Repetition penalty applied to logits for both beam search and sampling | +| random_seed | [1] or [batch_size] | CPU | unsigned long long int | **Optional**. Random seed to initialize the random table in sampling. | +| request_prompt_lengths | [batch_size], | CPU | int | **Optional**. Length of prefix soft prompt embedding. This describes how many tokens of soft prompt embedding in each sentence. | +| request_prompt_embedding | [batch_size, max_prompt_length, hidden_units] | GPU | float/half/bfloat16 | **Optional**. FT will concat them with results of embedding lookup kernel. For prefix soft prompt embedding, the type must be float; for p/prompt tuning, the type is same to weight. | +| request_prompt_type | [batch_size] | CPU | int | **Optional**. Prompt type of request. This is necessary when user pass the prompt embedding by input | +| is_return_context_cum_log_probs | [1] | CPU | bool | **Optional**. Return the cumulative log probability of context or not | +| session_len | [1] | CPU | uint32 | **Optional**. The maximum time length allowed during the whole interactive generation. Only used for interactive generation feature | +| continue_gen | [1] | CPU | bool | **Optional**. A flag to tell FasterTransformer to not discard previous tokens and continue producing token based on previous generations. Only used for interactive generation feature | +| memory_len | [1] | CPU | uint32 | **Optional**. The maximum time memory used in attention modules. Reduces the memory footprint but quality of generation might degrades. | + +* Output of GPT + +| Name | Tensor/Parameter Shape | Location | Data Type | Description | +| :--------------: | :----------------------------------------------: | :------: | :-------: | :-------------------------------------------------------------------------------: | +| output_ids | [batch_size, beam_width, max_output_seq_len] | GPU | int | The output ids. It contains the input_ids and generated ids | +| sequence_length | [batch_size, beam_width] | GPU | int | The lengths of output ids | +| output_log_probs | [batch_size, beam_width, request_output_seq_len] | GPU | float | **Optional**. It records the log probability of logits at each step for sampling. | +| cum_log_probs | [batch_size, beam_width] | GPU | float | **Optional**. Cumulative log probability of generated sentences | + +The `beam_width` value is set by the output shape directly. When the `beam_width` of `output_ids` is larger than 1, FT will use beam search to generate tokens; otherwise, FT will use topk or topp sampling. When the inputs of beam search and sampling is invalid, like beam width 1, top k 0, top p 0.0, FT will run greedy search automatically. ### Optimization @@ -167,11 +198,11 @@ The following guide demonstrates how to run the examples of c++, PyTorch and Tri - CMake >= 3.8 for Tensorflow, CMake >= 3.13 for PyTorch - CUDA 11.0 or newer version - NCCL 2.10 or newer version -- Python 3 is recommended because some features are not supported in python 2 +- Python: Only verify on python 3 - Tensorflow: Verify on 1.15, 1.13 and 1.14 should work. - PyTorch: Verify on 1.8.0, >= 1.5.0 should work. -Recommend use nvcr image like `nvcr.io/nvidia/tensorflow:21.11-tf1-py3` or `nvcr.io/nvidia/pytorch:21.11-py3`. +Recommend use nvcr image like `nvcr.io/nvidia/tensorflow:22.07-tf1-py3` or `nvcr.io/nvidia/pytorch:22.07-py3`. These components are readily available within the NGC TensorFlow Docker image below. @@ -195,10 +226,10 @@ For those unable to use the NGC container, to set up the required environment or You can choose the tensorflow version and python version you want. Here, we list some possible images: - To achieve best performance, we recommand to use the latest image. For example, running image `nvcr.io/nvidia/tensorflow:21.11-tf1-py3` by + To achieve best performance, we recommend to use the latest image. For example, running image `nvcr.io/nvidia/tensorflow:22.07-tf1-py3` by ```bash - nvidia-docker run -ti --rm nvcr.io/nvidia/tensorflow:21.11-tf1-py3 bash + nvidia-docker run -ti --rm nvcr.io/nvidia/tensorflow:22.07-tf1-py3 bash git clone https://github.com/NVIDIA/FasterTransformer.git mkdir -p FasterTransformer/build cd FasterTransformer/build @@ -207,7 +238,19 @@ For those unable to use the NGC container, to set up the required environment or #### Build the project -* Note: the `xx` of `-DSM=xx` in following scripts means the compute capability of your GPU. For example, 60 (P40) or 61 (P4) or 70 (V100) or 75(T4) or 80 (A100). Default setting is including 70, 75, 80 and 86. +* Note: the `xx` of `-DSM=xx` in following scripts means the compute capability of your GPU. The following table shows the compute capability of common GPUs. + +| GPU | compute capacity | +| :---: | :--------------: | +| P40 | 60 | +| P4 | 61 | +| V100 | 70 | +| T4 | 75 | +| A100 | 80 | +| A30 | 80 | +| A10 | 86 | + +By default, `-DSM` is set by 70, 75, 80 and 86. When users set more kinds of `-DSM`, it requires longer time to compile. So, we suggest setting the `-DSM` for the device you use only. Here, we use `xx` as an example due to convenience. 1. build with C++ @@ -218,7 +261,7 @@ For those unable to use the NGC container, to set up the required environment or 2. build with TensorFlow - Uses need to set the path of TensorFlow. For example, if we use `nvcr.io/nvidia/tensorflow:21.11-tf1-py3`, then + Uses need to set the path of TensorFlow. For example, if we use `nvcr.io/nvidia/tensorflow:22.07-tf1-py3`, then ```bash cmake -DSM=xx -DCMAKE_BUILD_TYPE=Release -DBUILD_TF=ON -DTF_PATH=/usr/local/lib/python3.8/dist-packages/tensorflow_core/ -DBUILD_MULTI_GPU=ON .. @@ -241,7 +284,7 @@ For those unable to use the NGC container, to set up the required environment or * Install required tools ```bash -pip install -r ../examples/pytorch/requirement.txt +pip install -r ../examples/pytorch/gpt/requirement.txt ``` To run the GPT on c, users need to convert the checkpoint of TensorFlow or PyTorch to binary files, and then load by FasterTransformer c api. Unfortunately, there is no published large model. So, users are only able to verify the correctness by smaller model. Currently, FasterTransformer provides two kinds of samples. First one is using the checkpoint of [OpenAI GPT-2 model](https://github.com/openai/gpt-2) (which is trained by TensorFlow); Another choice is using the checkpoint of [Megatron](https://github.com/NVIDIA/Megatron-LM) (which is trained by pytorch). @@ -255,9 +298,9 @@ wget https://s3.amazonaws.com/models.huggingface.co/bert/gpt2-vocab.json -P ../m wget https://s3.amazonaws.com/models.huggingface.co/bert/gpt2-merges.txt -P ../models ``` -* Downlaod openai-gpt model and convert +#### Download openai-gpt model and convert -To convert the OpenAI GPT model to binary, FasterTransformer provides a tool `sample/tensorflow/utils/openai_gpt_ckpt_convert.py` to convert the checkpoint. The converter requires the following arguemtns: +To convert the OpenAI GPT model to binary, FasterTransformer provides a tool `sample/tensorflow/utils/openai_gpt_ckpt_convert.py` to convert the checkpoint. The converter requires the following arguments: 1. `-i`: The path of megatron model 2. `-o`: The output path of converted model @@ -276,7 +319,7 @@ python ../examples/tensorflow/gpt/utils/openai_gpt_ckpt_converter.py -o ../model In the repo of OpenAI, they provide many models, including `124M`, `355M`, `774M` and `1558M` -* Download megatron model and convert +#### Download megatron model and convert To convert the Megatron GPT model to binary, FasterTransformer provides a tool `examples/pytorch/utils/megatron_ckpt_convert.py` to convert the checkpoint. @@ -284,47 +327,54 @@ To convert the Megatron GPT model to binary, FasterTransformer provides a tool ` wget --content-disposition https://api.ngc.nvidia.com/v2/models/nvidia/megatron_lm_345m/versions/v0.0/zip -O megatron_lm_345m_v0.0.zip mkdir -p ../models/megatron-models/345m unzip megatron_lm_345m_v0.0.zip -d ../models/megatron-models/345m -python ../examples/pytorch/gpt/utils/megatron_ckpt_convert.py -head_num 16 -i ../models/megatron-models/345m/release/ -o ../models/megatron-models/c-model/345m/ -t_g 1 -i_g 1 -python ../examples/pytorch/gpt/utils/megatron_ckpt_convert.py -head_num 16 -i ../models/megatron-models/345m/release/ -o ../models/megatron-models/c-model/345m/ -t_g 1 -i_g 8 +export PYTHONPATH=$PWD/..:${PYTHONPATH} +python ../examples/pytorch/gpt/utils/megatron_ckpt_convert.py \ + -head_num 16 \ + -i ../models/megatron-models/345m/release/ \ + -o ../models/megatron-models/c-model/345m/ \ + -t_g 1 \ + -i_g 1 \ + --vocab-path ../models/gpt2-vocab.json \ + --merges-path ../models/gpt2-merges.txt +python ../examples/pytorch/gpt/utils/megatron_ckpt_convert.py \ + -head_num 16 \ + -i ../models/megatron-models/345m/release/ \ + -o ../models/megatron-models/c-model/345m/ \ + -t_g 1 \ + -i_g 8 \ + --vocab-path ../models/gpt2-vocab.json \ + --merges-path ../models/gpt2-merges.txt ``` where `t_g` means the number GPUs of TP during training, and `i_g` means the number of GPUs for TP during inference. -Note that there are different checkpoint version of Megatron. The version of the checkpoint above is 0. If users have trained a model by themselves, the default version of latest Megatron is 3. To convert the checkpoint with version 3, please add `-checkpoint_version 3`. +Note that there are different checkpoint version of Megatron. The version of the checkpoint above is 0. -For model trained by pipeline parallelism, please use new checkpoint converter `megatron_ckpt_convert_2.py`. This converter is only able to convert the newer version of checkpoint. +For model trained by pipeline parallelism or the checkpoint version is 3, you don't need to specify head_num or checkpoint_version as it can retrieve from model_args. ```bash -python ../examples/pytorch/gpt/utils/megatron_ckpt_convert_2.py -i ../models/megatron-models/345m/release/ -o ../models/megatron-models/c-model/345m/ -i_g 1 +python ../examples/pytorch/gpt/utils/megatron_ckpt_convert.py -i ../models/megatron-models/345m/release/ -o ../models/megatron-models/c-model/345m/ -i_g 1 ``` -* How to use `checkpoint_saver_fastertransformer.py` to convert the megatron model. Note that this tool is only available for newer checkpoint. Need to get more details from ADLR team. - -```bash -git clone -b checkpoint_util https://gitlab-master.nvidia.com/ADLR/megatron-lm.git # This is still an internal tool. -cp ../examples/pytorch/gpt/utils/checkpoint_saver_fastertransformer.py megatron-lm/tools -cd megatron-lm -python tools/checkpoint_util.py --model-type GPT --loader megatron --saver fastertransformer --input ../megatron_new_ckpt/357m-pipeline-2-tensor-2/ --output ../tmp --target-tensor-parallel-size 1 -``` +#### Download onnx model and convert -* Download onnx model and convert +Note that the original `gpt2-10.onnx` model at `https://github.com/onnx/models/raw/master/text/machine_comprehension/gpt-2/model/gpt2-10.onnx` is removed. And new link `https://github.com/onnx/models/blob/main/text/machine_comprehension/gpt-2/model/gpt2-10.onnx` cannot be loaded by onnx successfully. -To convert the Megatron GPT model to binary, FasterTransformer provides a tool `examples/onnx/multi_gpu_gpt/onnx_ckpt_convert.py` to convert the checkpoint. +To convert the ONNX GPT model to binary, FasterTransformer provides a tool `examples/onnx/multi_gpu_gpt/onnx_ckpt_convert.py` to convert the checkpoint. ```bash -wget https://github.com/onnx/models/raw/main/text/machine_comprehension/gpt-2/model/gpt2-10.onnx +wget https://github.com/onnx/models/blob/main/text/machine_comprehension/gpt-2/model/gpt2-10.onnx python ../examples/onnx/multi_gpu_gpt/onnx_ckpt_convert.py -i gpt2-10.onnx -o ../models/onnx-models/c-model/124m/ -i_g 1 python ../examples/onnx/multi_gpu_gpt/onnx_ckpt_convert.py -i gpt2-10.onnx -o ../models/onnx-models/c-model/124m/ -i_g 4 ``` -* Downlaod huggingface gpt model and convert +#### Download huggingface gpt model and convert ```bash git clone https://huggingface.co/gpt2-xl python ../examples/pytorch/gpt/utils/huggingface_gpt_convert.py -i gpt2-xl/ -o ../models/huggingface-models/c-model/gpt2-xl -i_g 1 ``` - ### Run GPT 1. Run GPT under on C++ with multiple gpu @@ -353,7 +403,7 @@ python ../examples/pytorch/gpt/utils/huggingface_gpt_convert.py -i gpt2-xl/ -o . python ../examples/pytorch/gpt/utils/gpt_token_converter.py --vocab_file=../models/gpt2-vocab.json --bpe_file=../models/gpt2-merges.txt ``` - By setting the `is_half` of `gpt_config.ini` to 1, users can run gpt model under fp16. + By setting the `data_type` of `gpt_config.ini` to `fp16` or `bf16`, users can run gpt model under fp16 or bf16. 1.3 Run with tensor parallelism (TP), pipeline parallelism (PP) @@ -370,9 +420,9 @@ python ../examples/pytorch/gpt/utils/huggingface_gpt_convert.py -i gpt2-xl/ -o . ```bash srun -N2 -n2 -t 600 --pty bash # Assume we get 2 nodes: prm-dgx-09 and prm-dgx-10 - srun -N2 -n2 docker pull nvcr.io/nvidia/tensorflow:20.07-tf1-py3 + srun -N2 -n2 docker pull nvcr.io/nvidia/tensorflow:22.07-tf1-py3 - srun -N2 -n2 nvidia-docker run -itd --rm --privileged --network=host --pid=host --cap-add=IPC_LOCK --device=/dev/infiniband -v $PWD:$PWD -w $PWD --name ft-test nvcr.io/nvidia/tensorflow:21.11-tf1-py3 /bin/bash + srun -N2 -n2 nvidia-docker run -itd --rm --privileged --network=host --pid=host --cap-add=IPC_LOCK --device=/dev/infiniband -v $PWD:$PWD -w $PWD --name ft-test nvcr.io/nvidia/tensorflow:22.07-tf1-py3 /bin/bash srun -N2 -n2 nvidia-docker exec -i --env SLURM_NTASKS --env SLURM_NODEID --env SLURM_PROCID --env SLURM_STEP_NODELIST --env SLURMD_NODENAME --privileged ft-test bash -c "mkdir /root/.ssh && cp $PWD/ssh/* /root/.ssh && chmod 700 /root/.ssh && chmod 640 /root/.ssh/authorized_keys2 && chmod 400 /root/.ssh/id_rsa && apt-get update && apt-get install ssh -y && mkdir /run/sshd/ && /usr/sbin/sshd -p 11068 && nvidia-smi -lgc 1530" @@ -386,7 +436,7 @@ python ../examples/pytorch/gpt/utils/huggingface_gpt_convert.py -i gpt2-xl/ -o . Basically, `gpt_example.py` includes the example how to declare a model, load a ckeckpoint, and forward context inputs and get generated outputs in Pytorch. - For generating outputs based on context inputs, create a text file including the context inputs (line by line) and set `--sample_file_input` to the text file path. (By default, the script will generate outputs without context inputs.) Set `--sample_file_output` to write the outputs to a file. Use `--fp_16` to run in FP16. + For generating outputs based on context inputs, create a text file including the context inputs (line by line) and set `--sample_file_input` to the text file path. (By default, the script will generate outputs without context inputs.) Set `--sample_file_output` to write the outputs to a file. Use `--data_type fp16/bf16` to run in FP16 or BF16. Run with `-h` to see more settings. ```bash @@ -412,7 +462,7 @@ python ../examples/pytorch/gpt/utils/huggingface_gpt_convert.py -i gpt2-xl/ -o . #### Set up in interactive mode ```bash - srun -A devtech -J devtech-gpt:gpt -p luna -N1 --mpi=pmix --ntasks-per-node=8 --container-image nvcr.io/nvidia/pytorch:20.12-py3 --container-mounts /lustre/fsw/devtech/hpc-devtech/dahn/FasterTransformer:/workspace/fastertransformer --container-workdir /workspace/fastertransformer --pty bash + srun -A devtech -J devtech-gpt:gpt -p luna -N1 --mpi=pmix --ntasks-per-node=8 --container-image nvcr.io/nvidia/pytorch:22.07-py3 --container-mounts /lustre/fsw/devtech/hpc-devtech/dahn/FasterTransformer:/workspace/fastertransformer --container-workdir /workspace/fastertransformer --pty bash mkdir build && cd build cmake -DSM=80 -DCMAKE_BUILD_TYPE=Release -DBUILD_PYT=ON .. && make -j12 @@ -422,19 +472,43 @@ python ../examples/pytorch/gpt/utils/huggingface_gpt_convert.py -i gpt2-xl/ -o . * tensor_para_size=8, pipeline_para_size=1 ```bash - srun -A devtech -p luna -N1 --mpi=pmix --ntasks-per-node=8 --container-image nvcr.io/nvidia/pytorch:20.12-py3 --container-mounts /lustre/fsw/devtech/hpc-devtech/dahn/FasterTransformer:/workspace/fastertransformer --container-workdir /workspace/fastertransformer/build python ../examples/pytorch/gpt/multi_gpu_gpt_example.py --tensor_para_size=8 --pipeline_para_size=1 --ckpt_path="/workspace/fastertransformer/models/megatron-models/c-model/345m/8-gpu" + srun -A devtech -p luna -N1 --mpi=pmix --ntasks-per-node=8 --container-image nvcr.io/nvidia/pytorch:22.07-py3 --container-mounts /lustre/fsw/devtech/hpc-devtech/dahn/FasterTransformer:/workspace/fastertransformer --container-workdir /workspace/fastertransformer/build python ../examples/pytorch/gpt/multi_gpu_gpt_example.py --tensor_para_size=8 --pipeline_para_size=1 --ckpt_path="/workspace/fastertransformer/models/megatron-models/c-model/345m/8-gpu" ``` #### Run on multi-node * tensor_para_size=8, pipeline_para_size=2 ```bash - srun -A devtech -p luna -N2 --mpi=pmix --ntasks-per-node=8 --container-image nvcr.io/nvidia/pytorch:20.12-py3 --container-mounts /lustre/fsw/devtech/hpc-devtech/dahn/FasterTransformer:/workspace/fastertransformer --container-workdir /workspace/fastertransformer/build python ../examples/pytorch/gpt/multi_gpu_gpt_example.py --tensor_para_size=8 --pipeline_para_size=2 --ckpt_path="/workspace/fastertransformer/models/megatron-models/c-model/345m/8-gpu" + srun -A devtech -p luna -N2 --mpi=pmix --ntasks-per-node=8 --container-image nvcr.io/nvidia/pytorch:22.07-py3 --container-mounts /lustre/fsw/devtech/hpc-devtech/dahn/FasterTransformer:/workspace/fastertransformer --container-workdir /workspace/fastertransformer/build python ../examples/pytorch/gpt/multi_gpu_gpt_example.py --tensor_para_size=8 --pipeline_para_size=2 --ckpt_path="/workspace/fastertransformer/models/megatron-models/c-model/345m/8-gpu" + ``` + + 2.2 Run LAMBADA test on PyTorch + + download data set: + + ```bash + wget https://github.com/cybertronai/bflm/raw/master/lambada_test.jsonl -P ../models/megatron-models + export PYTHONPATH=$PWD/../:$PYTHONPATH + python ../examples/pytorch/gpt/utils/update_gpt_config.py \ + --model-dir ../models/megatron-models/c-model/345m/1-gpu/ \ + --config-ini-path ../models/megatron-models/c-model/345m/1-gpu/config.ini \ + --pipeline-para-size 1 \ + --tensor-para-size 1 \ + --max-seq-len 512 \ + --beam-width 1 \ + --sampling-top-k 1 \ + --sampling-top-p 0 \ + --data-type fp16 + python ../examples/pytorch/gpt/lambada_task_example.py \ + --batch-size 64 \ + --checkpoint-path ../models/megatron-models/c-model/345m/1-gpu/ \ + --lib-path lib/libth_parallel_gpt.so \ + --lambada-path ../models/megatron-models/lambada_test.jsonl ``` 3. Run GPT on tensorflow - Note that the tensorflow op only supports single gpu. + Follow [Download openai-gpt model and convert](#download-openai-gpt-model-and-convert) to prepare the model. Assume the TF model is put in `../models/openai-gpt-models/`. ```bash ./bin/gpt_gemm 4 1 32 12 64 3072 50257 1 1 @@ -442,22 +516,328 @@ python ../examples/pytorch/gpt/utils/huggingface_gpt_convert.py -i gpt2-xl/ -o . --length=32 \ --top_k=4 \ --top_p=0.6 \ - --data_type=fp16 + --data_type=fp16 \ + --models_dir=../models/openai-gpt-models/ ``` -4. Run LAMBADA test + Note that the tensorflow op only supports single gpu. - download data set: +### Run GPT with prompts + +GPT now supports p/prompt-tuning. It works with [nemo checkpoint and prompt learning](https://docs.nvidia.com/deeplearning/nemo/user-guide/docs/en/main/nlp/prompt_learning.html). + +1. Convert the prompt weights + + Use the `examples/pytorch/gpt/utils/nemo_ckpt_convert.py` to convert the NeMo Megatron Prompt Weights. + It will automatically generate configuration needed for triton backend inference. + + Note that you need to specify `start_id`, `end_id` by yourself in order to make sure that it is consistent with the tokenizer. + +2. Run GPT with C++ example + + You need to specify the example gpt_config.ini like below to enable the p/prompt_tuning feature. + + ```ini + [gptj_6B] + head_num=16 + size_per_head=256 + vocab_size=50400 + decoder_layers=28 + rotary_embedding=64 + start_id=50256 + end_id=50256 + inter_size=16384 + num_tasks=2 + prompt_learning_type=2 + + ;prompt learning example (soft prompt doesn't need it) + [gptj_6B_task_0] + task_name=task_0 + prompt_length=5 + + [gptj_6B_task_1] + task_name=task_1 + prompt_length=10 + ``` + + `task_name` and `prompt_length` are specified for loading prompt weights. + `prompt_learning_start_id` is needed for checking whether ids are prompts or normal input ids. + + **prompt_learning_type**: + + - no prompt: 0 + - soft_prompt: 1 + - prefix_prompt: 2 + - p/prompt_tuning: 3 + +### Run Meta OPT + +Meta OPT and OpenAI GPT do not have big differences in terms of structures, so they are sharing the same model and triton backend classes. \ +You need to convert the Huggingface Meta Opt models to fastertransformer format by `examples/pytorch/gpt/utils/huggingface_opt_convert.py`. + +1. Run OPT under on C++ with multiple gpu + + Users can see the details of arguments in `examples/cpp/multi_gpu_gpt/gpt_config.ini`. It controls the model path, model size, tensor parallelism size, and some hyper-parameters.\ + In order to run with Meta Opt models, you need to add additional configuraitons: `model_variant`, which controls the `layernorm_eps, layernorm_type, activation_type, has_post_decoder_layernorm`. + + For example, the opt 125m model configuraitons would be like: + ```ini + [opt_125M] + head_num=12 + size_per_head=64 + vocab_size=50272 + decoder_layers=12 + start_id=2 + end_id=2 + inter_size=3072 + model_variant=opt-pre ;define variant structure + ``` + There are two model types: opt-pre = [pre_layernorm](https://github.com/huggingface/transformers/blob/main/src/transformers/models/opt/modeling_opt.py#L332), opt_post = [post_layernorm](https://github.com/huggingface/transformers/blob/main/src/transformers/models/opt/modeling_opt.py#L323)\ + **Note that:** [the model has post decoder layernorm when layernorm_type is pre_layernorm](https://github.com/huggingface/transformers/blob/main/src/transformers/models/opt/modeling_opt.py#L498). + +2. Run OPT on PyTorch + + We can run summarization task examples of meta opt models. See `examples/pytorch/gpt/opt_summarization.py`. + + Note that the summarization test are ran by topk = 2, so the rouge score of HF and FT are often different. + + * Run on opt-125m model ```bash - wget https://github.com/cybertronai/bflm/raw/master/lambada_test.jsonl -P ../models/megatron-models - bash ../examples/pytorch/gpt/scripts/evaluate_zeroshot_gpt.sh + git lfs clone https://huggingface.co/facebook/opt-125m + python ../examples/pytorch/gpt/utils/huggingface_opt_convert.py \ + -i opt-125m/ \ + -o opt-125m/c-model/ \ + -i_g 1 + python3 ../examples/pytorch/gpt/opt_summarization.py \ + --summarize \ + --test_hf \ + --max_ite 20 \ + --ft_model_location opt-125m/c-model \ + --hf_model_name opt-125m + ``` + + The results are similar to: + + ``` + Hugging Face (total latency: 9.258284 sec) + rouge1 : 20.36984889475218 + rouge2 : 4.854345624891912 + rougeL : 14.82866480289381 + rougeLsum : 18.23638863809613 + Faster Transformers (total latency: 3.9376330000000004 sec) + rouge1 : 26.676168312282357 + rouge2 : 10.004052949342602 + rougeL : 19.20934213532261 + rougeLsum : 24.243496576656323 + ``` + + * Run on opt-350m model + + ```bash + git lfs clone https://huggingface.co/facebook/opt-350m + python ../examples/pytorch/gpt/utils/huggingface_opt_convert.py \ + -i opt-350m/ \ + -o opt-350m/c-model/ \ + -i_g 1 + python3 ../examples/pytorch/gpt/opt_summarization.py \ + --summarize \ + --test_hf \ + --max_ite 20 \ + --ft_model_location opt-350m/c-model \ + --hf_model_name opt-350m \ + --data_type fp16 + ``` + + The results are similar to: + + ``` + Hugging Face (total latency: 21.961627 sec) + rouge1 : 28.939621379501467 + rouge2 : 9.858278077813752 + rougeL : 19.159853526952528 + rougeLsum : 26.120654334830885 + Faster Transformers (total latency: 6.293255999999998 sec) + rouge1 : 26.80687566772978 + rouge2 : 8.639787737378661 + rougeL : 18.90520115636779 + rougeLsum : 24.372302912676407 + ``` + +3. Run OPT with Triton Backends + + Model configurations have been automatically generated when converting the [meta opt models](https://huggingface.co/docs/transformers/model_doc/opt).\ + Then, you can use the converted weights and configuration file to serve the model by triton servers. + Example of the `config.ini` when converting the model: + ```ini + [gpt] + model_name = opt-350m/ + head_num = 16 + size_per_head = 64 + inter_size = 4096 + max_pos_seq_len = 2048 + num_layer = 24 + layernorm_eps = 1e-5 + layernorm_type = post_layernorm + activation_type = Relu + has_post_decoder_layernorm = 0 + vocab_size = 50272 + start_id = 2 + end_id = 2 + weight_data_type = fp32 ``` ### gpt with triton backend Details are in [transformer_backend](https://github.com/triton-inference-server/fastertransformer_backend) +### Advanced features + +#### generate different sentences and enable shared context + +The model downloading and conversion are described in [Download megatron model and convert](#download-megatron-model-and-convert). + +A common request is, we have single input request, and hope to reply multiple results with different random seed. To achieve this target, we can mulpitle the inputs by several times, and set different random seed for different sentences in a batch. You can enable it by adding `--enable_random_seed`. Otherwise, all random seed would be set to 0 by default. + +For example, we prepare a input with batch size 4, and the sentences are all same. + +```bash +for i in {1..4} ; do echo " Article : (CNN)James Best, best known for his portrayal of bumbling sheriff Rosco P. Coltrane on TV's \"The Dukes of Hazzard,\" died Monday after a brief illness. He was 88. Best died in hospice in Hickory, North Carolina, of complications from pneumonia, said Steve Latshaw, a longtime friend and Hollywood colleague. Although he'd been a busy actor for decades in theater and in Hollywood, Best didn't become famous until 1979, when \"The Dukes of Hazzard's\" cornpone charms began beaming into millions of American homes almost every Friday night. For seven seasons, Best's Rosco P. Coltrane chased the moonshine-running Duke boys back and forth across the back roads of fictitious Hazzard County, Georgia, although his \"hot pursuit\" usually ended with him crashing his patrol car. Although Rosco was slow-witted and corrupt, Best gave him a childlike enthusiasm that got laughs and made him endearing. His character became known for his distinctive \"kew-kew-kew\" chuckle and for goofy catchphrases such as \"cuff 'em and stuff 'em! \" upon making an arrest. Among the most popular shows on TV in the early '80s, \"The Dukes of Hazzard\" ran until 1985 and spawned TV movies, an animated series and video games. Several of Best's \"Hazzard\" co-stars paid tribute to the late actor on social media. \"I laughed and learned more from Jimmie in one hour than from anyone else in a whole year,\" co-star John Schneider, who played Bo Duke, said on Twitter. \"Give Uncle Jesse my love when you see him dear friend.\" \"Jimmy Best was the most constantly creative person I have ever known,\" said Ben Jones, who played mechanic Cooter on the show, in a Facebook post. \"Every minute of his long life was spent acting, writing, producing, painting, teaching, fishing, or involved in another of his life's many passions.\" Born Jewel Guy on July 26, 1926, in Powderly, Kentucky, Best was orphaned at 3 and adopted by Armen and Essa Best, who renamed him James and raised him in rural Indiana. Best served in the Army during World War II before launching his acting career. TL;DR: " >> sample_input.txt ; done +``` + +Then, we run the `multi_gpu_gpt_example.py` with `--enable_random_seed`: + +```bash +python3 ../examples/pytorch/gpt/multi_gpu_gpt_example.py \ + --ckpt_path ../models/megatron-models/c-model/345m/1-gpu/ \ + --vocab_file ../models/gpt2-vocab.json \ + --merges_file ../models/gpt2-merges.txt \ + --sample_input_file sample_input.txt \ + --max_batch_size 4 \ + --time \ + --top_p 0.9 \ + --top_k 0 \ + --shared_contexts_ratio 0.0 \ + --enable_random_seed \ + --output_len 8 +``` + +You can see the results are little different, and the program will show the time cost like: + +```bash +[INFO] GPT time costs: 64.25 ms +``` + +Although this method can achieve our target, but computing same duplicated inputs is waste. So, we can set `--shared_contexts_ratio` to compute the duplicated inputs once in context phase: + +```bash +python3 ../examples/pytorch/gpt/multi_gpu_gpt_example.py \ + --ckpt_path ../models/megatron-models/c-model/345m/1-gpu/ \ + --vocab_file ../models/gpt2-vocab.json \ + --merges_file ../models/gpt2-merges.txt \ + --sample_input_file sample_input.txt \ + --max_batch_size 4 \ + --time \ + --top_p 0.9 \ + --top_k 0 \ + --shared_contexts_ratio 1.0 \ + --enable_random_seed \ + --output_len 8 +``` + +You can see the inference is faster than original one like: + +```bash +[INFO] GPT time costs: 41.69 ms +``` + +Notes: +1. The results of enabling `shared_context` and disabling `shared_context` may be different because the shape of GEMM are changed. But it does not affect the qualities of generation. +2. We use short `output_len` in this example to demonstarte the benefit of `shared_context`. In real application, the more duplicated input, longer input length compared to output length, the more speedup `shared_context` brings. +3. Since the additional overhead of enabling `shared_context` is ignorable, we enable it by default. + +#### Interactive generation + +
+       +
+
+ Fig 4. GPT generate some outputs by some inputs +
+

+ +
+       +
+
+ Fig 5. New inputs with previous texts and some additional new input ids. +
+

+ +In some scenarios (like chatting), the new requests are related to previous requests. Currently, users can pass all previous inputs and outputs as a new inputs into FT to make FT generate new reply from these previous texts, like what we see in Fig 4 and Fig 5. However, this means that we need to re-compute the k/v cache of all previous inputs and outputs again, which is time wasting when the context is very long. + +
+       +
+
+ Fig 6. The workflow of generation with interactive generation +
+

+ +To achieve better performance and prevent useless computing, we add a new flag `continue_gen` into GPT. When this flag is on, FT keeps all results during generation and assume the users will provide some more texts. And FT would not compute the k/v cache of the results it already has, but only compute the k/v cache of new ids. The workflow would become what we demonstrate in Fig 6. To prevent allocate the memory buffer again, users also need to set the `session_len` to be the maximum sequence length of the final sentence, but not only for intermediate sentence. + +We will use `multi_gpu_gpt_interactive_example` to demonstarte how to use this feature. In this example, we load the `examples/cpp/multi_gpu_gpt/start_ids.csv` first (the input length are all 8): + +``` +818, 262, 938, 3155, 286, 1528, 11, 257 +198, 464, 968, 8221, 2732, 286, 15198, 318 +464, 968, 1971, 12056, 423, 257, 649, 1182 +464, 968, 1971, 3782, 468, 3199, 663, 5079 +818, 257, 1445, 326, 481, 1884, 787, 340 +464, 968, 1971, 12056, 6, 5859, 41683, 423 +198, 198, 464, 5398, 4332, 628, 628, 198 +464, 717, 640, 314, 2497, 262, 3807, 11 +``` + +then generates 32 tokens with setting `continue_gen=true` to get an intermediate results (the results are saved in `out.interm`): + +``` +818 262 938 3155 286 1528 11 257 1256 286 661 423 587 4737 502 546 262 649 1492 11 290 314 1053 587 2111 284 3280 617 286 262 2683 326 661 423 587 4737 502 13 198 198 +198 464 968 8221 2732 286 15198 318 1762 351 262 1181 338 9358 5011 284 5004 262 1266 835 284 1445 262 4979 13 198 1 1135 821 1016 284 307 2045 379 262 1266 835 284 1445 262 +464 968 1971 12056 423 257 649 1182 3985 11 290 339 338 257 3516 508 338 587 1088 262 4652 329 257 890 640 13 679 338 257 3516 508 338 587 1088 262 4652 329 257 890 640 +464 968 1971 3782 468 3199 663 5079 1351 286 262 995 338 749 14212 661 13 198 464 1351 11 543 373 14102 416 262 968 1971 3782 11 318 1912 319 257 5526 286 517 621 352 11 +818 257 1445 326 481 1884 787 340 4577 329 262 1664 284 3677 663 7303 11 262 1664 468 4987 284 3677 663 10171 287 262 1664 284 257 1448 286 7713 2957 416 262 2839 13598 4081 309 +464 968 1971 12056 6 5859 41683 423 587 257 1263 636 286 262 1074 338 1943 428 1622 13 198 464 12056 423 587 1498 284 1057 262 2613 6840 11 290 484 423 587 1498 284 1057 262 +198 198 464 5398 4332 628 628 198 198 464 5398 4332 628 628 198 198 464 5398 4332 628 628 198 198 464 5398 4332 628 628 198 198 464 5398 4332 628 628 198 198 464 5398 4332 +464 717 640 314 2497 262 3807 11 314 373 588 11 705 5812 616 1793 11 428 318 523 3608 2637 314 373 588 11 705 40 765 284 307 287 428 3807 2637 314 373 588 11 705 +``` + +Next, we load another inputs from `examples/cpp/multi_gpu+gpt/interactive_inputs_ids` (the input length are all 8 again): + +``` +5962, 11, 314, 561, 588, 284, 910, 326 +11125, 286, 2844, 291, 5028, 422, 262, 7627 +392, 257, 1913, 1998, 351, 1353, 12, 28282 +830, 34643, 11, 7602, 11, 4708, 6332, 1938 +5, 38328, 763, 13, 1119, 481, 2148, 257 +3245, 355, 257, 22080, 1074, 13, 4042, 286 +14150, 26443, 262, 1230, 338, 1410, 284, 3958 +5195, 4398, 470, 314, 7342, 340, 2961, 30 +``` + +and pass into FT again (note that we only need to pass new ids because FT already records all previous ids). Then FT will concatenate these new ids into output ids, compute k/v caches for only these new ids, and then generate another 32 tokens as a new response (the results are saved in `out`): + +``` +818 262 938 3155 286 1528 11 257 1256 286 661 423 587 4737 502 546 262 649 1492 11 290 314 1053 587 2111 284 3280 617 286 262 2683 326 661 423 587 4737 502 13 198 198 5962 11 314 561 588 284 910 326 314 1101 407 257 4336 286 262 1492 13 314 892 340 338 257 1310 1165 881 286 257 366 10919 611 1 1492 13 314 892 340 338 257 1310 1165 +198 464 968 8221 2732 286 15198 318 1762 351 262 1181 338 9358 5011 284 5004 262 1266 835 284 1445 262 4979 13 198 1 1135 821 1016 284 307 2045 379 262 1266 835 284 1445 262 11125 286 2844 291 5028 422 262 7627 7784 15296 284 262 7421 7784 15296 553 531 42743 6523 3899 1024 33246 271 13 198 464 42743 318 635 2045 379 262 5885 286 3867 262 4979 422 262 7421 +464 968 1971 12056 423 257 649 1182 3985 11 290 339 338 257 3516 508 338 587 1088 262 4652 329 257 890 640 13 679 338 257 3516 508 338 587 1088 262 4652 329 257 890 640 392 257 1913 1998 351 1353 12 28282 18370 13 679 338 257 3516 508 338 587 1088 262 4652 329 257 890 640 13 679 338 257 3516 508 338 587 1088 262 4652 329 257 890 640 13 +464 968 1971 3782 468 3199 663 5079 1351 286 262 995 338 749 14212 661 13 198 464 1351 11 543 373 14102 416 262 968 1971 3782 11 318 1912 319 257 5526 286 517 621 352 11 830 34643 11 7602 11 4708 6332 1938 290 584 14212 661 13 198 464 1351 318 14102 416 262 968 1971 3782 290 318 3199 319 262 3052 286 262 7533 13 198 464 1351 318 20633 416 262 +818 257 1445 326 481 1884 787 340 4577 329 262 1664 284 3677 663 7303 11 262 1664 468 4987 284 3677 663 10171 287 262 1664 284 257 1448 286 7713 2957 416 262 2839 13598 4081 309 5 38328 763 13 1119 481 2148 257 2472 286 720 16 13 20 2997 287 5003 290 4283 13 198 464 1730 318 2938 284 1969 287 262 1218 2063 286 428 614 13 198 464 1664 531 340 +464 968 1971 12056 6 5859 41683 423 587 257 1263 636 286 262 1074 338 1943 428 1622 13 198 464 12056 423 587 1498 284 1057 262 2613 6840 11 290 484 423 587 1498 284 1057 262 3245 355 257 22080 1074 13 4042 286 262 640 11 262 12056 423 587 1498 284 1057 262 2613 6840 11 290 484 423 587 1498 284 1057 262 3245 355 257 22080 1074 13 198 464 12056 423 +198 198 464 5398 4332 628 628 198 198 464 5398 4332 628 628 198 198 464 5398 4332 628 628 198 198 464 5398 4332 628 628 198 198 464 5398 4332 628 628 198 198 464 5398 4332 14150 26443 262 1230 338 1410 284 3958 262 779 286 262 1573 366 16991 1 287 262 1499 338 1743 3303 13 198 198 464 1230 338 1410 284 3958 262 779 286 262 1573 366 16991 1 287 +464 717 640 314 2497 262 3807 11 314 373 588 11 705 5812 616 1793 11 428 318 523 3608 2637 314 373 588 11 705 40 765 284 307 287 428 3807 2637 314 373 588 11 705 5195 4398 470 314 7342 340 2961 30 4162 4398 470 314 1775 340 878 8348 314 373 588 11 705 40 765 284 307 287 428 3807 2637 314 373 588 11 705 40 765 284 307 287 428 +``` + ## Performance Hardware settings (A100 SuperPod architecture): @@ -481,17 +861,21 @@ We demonstrate the inference time of Megatron and FasterTransformer on Triton, a TP means tensor parallelism, PP means pipeline parallelism.
-
Fig 4. Latency on input length 60, output length 20. TP means tensor parallelism and PP means pipeline parallelism.
+
Fig 7. Latency on input length 60, output length 20. TP means tensor parallelism and PP means pipeline parallelism.
+

-
Fig 5. Throughput per GPU on input length 60, output length 20. TP means tensor parallelism and PP means pipeline parallelism.
+
Fig 8. Throughput per GPU on input length 60, output length 20. TP means tensor parallelism and PP means pipeline parallelism.
+

-
Fig 6. Latency on fixing output length 20, 16 ways tensor parallelism, different input length and batch size.
+
Fig 9. Latency on fixing output length 20, 16 ways tensor parallelism, different input length and batch size.
+

-
Fig 7. Latency on fixing input length 128, 16 ways tensor parallelism, different output length and batch size.
- +
Fig 10. Latency on fixing input length 128, 16 ways tensor parallelism, different output length and batch size.
+

+3 | Batch Size | Input Length | Output Length | Latency of TP-16, PP-1 (ms) | Latency of TP-32, PP-1 (ms) | Latency of TP-8, PP-3 (ms) | | :--------: | :----------: | :-----------: | :-------------------------: | :-------------------------: | :------------------------: | | 1 | 20 | 8 | 565 | 431 | 842 | @@ -724,5 +1108,3 @@ TP means tensor parallelism | 16 | 512 | 32 | 189.91 | 4.80 | | 32 | 512 | 32 | 296.15 | 6.09 | | 64 | 512 | 32 | 529.18 | 8.67 | - -## TODO diff --git a/docs/gptj_guide.md b/docs/gptj_guide.md index c757db8c9..0fa67225d 100644 --- a/docs/gptj_guide.md +++ b/docs/gptj_guide.md @@ -9,27 +9,101 @@ - [Setup](#setup) - [Requirements](#requirements) - [Docker image](#docker-image) - - [Setup](#setup-1) - - [Build](#build) + - [Build project](#build-project) - [Download the model](#download-the-model) + - [Download tables](#download-tables) - [Run GPT-J](#run-gpt-j) + - [Run GPTJ with prompts](#run-gptj-with-prompts) - [Compare with reference implementation](#compare-with-reference-implementation) - [gpt-j with triton backend](#gpt-j-with-triton-backend) - ## Introduction This document describes the step to run the GPT-J model on FasterTransformer. GPT-J was developed by EleutherAI and trained on The Pile, a 825GB dataset from curated sources (e.g. Wikipedia, arXiv, GitHub, StackExchange, PubMed, ...). With 6 billion parameters, GPT-J is one of the largest GPT-like publicly released models as of 2021. +Optimization in GPT-j are similar to optimization in GPT, describing in the [gpt_guide.md](gpt_guide.md#optimization). + +* Constructor of GPT-j + +| Classification | Name | Data Type | Description | +| :------------: | :--------------------------: | :----------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| [0] | max_batch_size | size_t | **Deprecated, move to input** | +| [1] | max_seq_len | size_t | **Deprecated, move to input** | +| [2] | max_input_len | size_t | **Deprecated, move to input** | +| [3] | beam_width | size_t | **Deprecated, move to input** | +| [4] | head_num | size_t | Head number for model configuration | +| [5] | size_per_head | size_t | Size per head for model configuration | +| [6] | inter_size | size_t | The inter size of feed forward network. It is often set to 4 * head_num * size_per_head. | +| [7] | num_layer | size_t | Number of transformer layers for model configuration | +| [8] | vocab_size | size_t | Vocabulary size for model configuration | +| [9] | rotary_embeeding_dim | size_t | Rotary embedding dimension of rotary position embedding for model configuration | +| [10] | start_id | int | Start id for vocabulary | +| [11] | end_id | int | End id for vocabulary | +| [12] | prompt_learning_start_id | int | The start id of virtual token in p/prompt-tuning | +| [13] | prompt_learning_type | PromptLearningType | The type of prompt learning when we load the prompt embedding in constructor. FT supports `no_prompt`, `soft_prompt`, `prefix_prompt`, `p_prompt_tuning` now | +| [14] | beam_search_diversity_rate | float | **Deprecated, move to input** | +| [15] | top_k | size_t | **Deprecated, move to input** | +| [16] | top_p | float | **Deprecated, move to input** | +| [17] | random_seed | unsigned long long | **Deprecated, move to input** | +| [18] | temperature | float | **Deprecated, move to input** | +| [19] | len_penalty | float | **Deprecated, move to input** | +| [20] | repetition_penalty | float | **Deprecated, move to input** | +| [21] | tensor_para | NcclParam | Tensor Parallel information, which is declared in `src/fastertransformer/utils/nccl_utils.h` | +| [22] | pipeline_para | NcclParam | Pipeline Parallel information, which is declared in `src/fastertransformer/utils/nccl_utils.h` | +| [23] | stream | cudaStream_t | CUDA stream | +| [24] | cublas_wrapper | cublasMMWrapper* | Pointer of cuBLAS wrapper, which is declared in `src/fastertransformer/utils/cublasMMWrapper.h` | +| [25] | allocator | IAllocator* | Pointer of memory allocator, which is declared in `src/fastertransformer/utils/allocator.h` | +| [26] | is_free_buffer_after_forward | bool | If setting to be `true`, FasterTransformer will allocate buffer before forward, and free buffer after forward. When the allocator is based on memory pool, setting to `true` may help reducing the memory usage during inference. | +| [27] | cuda_device_prop | cudaDeviceProp* | Pointer of CUDA device properties, which is used to get the properties of hardware like size of shared memory | +| [28] | custom_all_reduce_comm | AbstractCustomComm | Custom all reduction communication for custom all reduction in model parallelism. It is only supported in 8-way tensor parallelism | +| [29] | enable_custom_all_reduce | int | Flag of enabling custom all reduction or not | + +* Input of GPT-j + +| Name | Tensor/Parameter Shape | Location | Data Type | Description | +| :---------------------------: | :-------------------------------------------: | :------: | :--------------------: | :-------------------------------------------------------------------------------------------------------------------------------------: | +| input_ids | [batch_size, max_input_length] | GPU | int | The input ids (context) | +| input_lengths | [batch_size] | GPU | int | The lengths of input ids | +| prompt_learning_task_name_ids | [batch_size] | CPU | int | **Optional**. Task name ids for prompt learning. | +| output_seq_len | [batch_size] | CPU | uint32_t | The largest number of tokens you hope for results. Note that it contains the input length | +| start_id | [batch_size] | CPU | int | **Optional**. If FT receives this input, FT will replace default start id by it | +| end_id | [batch_size] | CPU | int | **Optional**. If FT receives this input, FT will replace default end id by it | +| stop_words_list | [batch_size, 2, stop_words_length] | GPU | int | **Optional**. FT would not generate the tokens in the list. | +| bad_words_list | [batch_size, 2, bad_words_length] | GPU | int | **Optional**. The words in the list will be When FT generates words in this list, it will stop the generation. An extension of stop id | +| runtime_top_k | [1] or [batch_size] | CPU | uint | **Optional**. top_k value for top k sampling | +| runtime_top_p | [1] or [batch_size] | CPU | float | **Optional**. top_p value for top p sampling | +| beam_search_diversity_rate | [1] or [batch_size] | CPU | float | **Optional**. A hyper hyper-parameter for [simple diverse decoding](https://arxiv.org/pdf/1611.08562.pdf) | +| temperature | [1] or [batch_size] | CPU | float | **Optional**. Temperature applied to logits for both beam search and sampling | +| len_penalty | [1] or [batch_size] | CPU | float | **Optional**. Length penalty applied to logits for only beam search | +| repetition_penalty | [1] or [batch_size] | CPU | float | **Optional**. Repetition penalty applied to logits for both beam search and sampling | +| random_seed | [1] or [batch_size] | CPU | unsigned long long int | **Optional**. Random seed to initialize the random table in sampling. | +| request_prompt_lengths | [batch_size], | CPU | int | **Optional**. Length of prefix soft prompt embedding. This describes how many tokens of soft prompt embedding in each sentence. | +| request_prompt_embedding | [batch_size, max_prompt_length, hidden_units] | GPU | float | **Optional**. Prefix soft prompt embedding. FT will concat them with results of embedding lookup kernel | +| request_prompt_type | [batch_size] | CPU | int | **Optional**. Prompt type of request. This is necessary when user pass the prompt embedding by input | +| memory_len | [1] | CPU | uint32 | **Optional**. The maximum time memory used in attention modules. Reduces the memory footprint but quality of generation might degrades. | + +* Output of GPT-j + +| Name | Tensor/Parameter Shape | Location | Data Type | Description | +| :--------------: | :----------------------------------------------: | :------: | :-------: | :-------------------------------------------------------------------------------: | +| output_ids | [batch_size, beam_width, max_output_seq_len] | GPU | int | The output ids. It contains the input_ids and generated ids | +| sequence_length | [batch_size, beam_width] | GPU | int | The lengths of output ids | +| output_log_probs | [batch_size, beam_width, request_output_seq_len] | GPU | float | **Optional**. It records the log probability of logits at each step for sampling. | +| cum_log_probs | [batch_size, beam_width] | GPU | float | **Optional**. Cumulative log probability of generated sentences | + +The `beam_width` value is set by the output shape directly. When the `beam_width` of `output_ids` is larger than 1, FT will use beam search to generate tokens; otherwise, FT will use topk or topp sampling. When the inputs of beam search and sampling is invalid, like beam width 1, top k 0, top p 0.0, FT will run greedy search automatically. + ### Supported features * Checkpoint converter * EleutherAI + * Huggingface * Data type * FP32 * FP16 + * BF16 * Feature * Multi-GPU multi-node inference * Dynamic random seed @@ -39,61 +113,6 @@ With 6 billion parameters, GPT-J is one of the largest GPT-like publicly release * Frameworks * Triton backend -Optimization in GPT-j are similar to optimization in GPT, describing in the [gpt_guide.md](gpt_guide.md#optimization). - -* Arguments: - 1. Maximum batch size (Deprecated, move to input) - 2. Maximum sequence length (Deprecated, move to input) - 3. Maximum input sequence length (Deprecated, move to input) - 4. beam width for beam search. If setting b to be 1, then we don’t use beam search but use sampling. (Deprecated, move to input) - 5. Head number - 6. Size per head - 7. Intermediate size. The inter size of feed forward network. It is often set to 4 * head_num * size_per_head. - 8. Number of decoder layers. - 9. Vocab size. - 10. Rotary embedding for attetnion. - 11. Start id of the vocabulary. - 12. End id of the vocabulary. - 13. Diversity rate of beam search. A hyper hyper-parameter for [simple diverse decoding](https://arxiv.org/pdf/1611.08562.pdf). (Deprecated, move to input) - 14. top_k value for top k sampling. (Deprecated, move to input) - 15. top_p value for top p sampling. (Deprecated, move to input) - 16. Random seed for sampling. (Deprecated, move to input) - 17. Temperature for logit. Setting to be 1.0 if you don’t want to apply the temperature. (Deprecated, move to input) - 18. Length penalty for logit. Setting to be 1.0 if you don’t want to apply the length penalty. (Deprecated, move to input) - 19. Repetition penalty for logit. Setting to be 1.0 if you don’t want to apply the repetition penalty. (Deprecated, move to input) - 20. Tensor Parallel information, which is declared in `src/fastertransformer/utils/nccl_utils.h`. - 21. Pipeline Parallel information, which is declared in `src/fastertransformer/utils/nccl_utils.h`. - 22. CUDA stream. - 23. Pointer of cuBLAS wrapper, which is declared in `src/fastertransformer/utils/cublasMMWrapper.h`. - 24. Pointer of memory allocator, which is declared in `src/fastertransformer/utils/allocator.h` - 25. “is_free_buffer_after_forward” flag. If setting to be true, FasterTransformer will allocate buffer before forward, and free buffer after forward. If the memory is controlled by memory pool and the cost of allocating/releasing memory is small, setting the flag to be true can save some memory. - 26. Pointer of CUDA device properties, which is used to get the properties of hardware like size of shared memory. - 27. Custom all reduction communication for custom all reduction in model parallelism. It is only supported in 8-way tensor parallelism. - 28. Flag of enable custom all reduction or not. -* Input tensors: - 1. Input ids (context). The shape is \[ request batch size * beam width, request maximum input length \]. - 2. Input lengths. The shape is \[ request batch size * beam width \]. - 3. Maximum output sequence length. An integer to describe the largest number of tokens you hope for results. Note that it includes the input ids. - 4. Start id in runtime. The shape is \[batch_size\] on cpu, optional. If FT receives this input, FT will replace default start id by it, optional. - 5. End id in runtime. The shape is \[batch_size\] on cpu, optional. If FT receives this input, FT will replace default end id by it, optional. - 6. Stop word list. When FT generates words in this list, it will stop the generation. An extension of stop id, optional. - 7. Bad word list. FT won't generates words in this list, optional. - 8. top_k value for top k sampling. The shape is \[1\] or \[batch_size, 1\] on cpu, optional. - 9. top_p value for top p sampling. The shape is \[1\] or \[batch_size, 1\] on cpu, optional. - 10. Diversity rate of beam search (beam_search_diversity_rate). A hyper hyper-parameter for [simple diverse decoding](https://arxiv.org/pdf/1611.08562.pdf). [1] or \[batch_size, 1\] on cpu, optional. - 11. Temperature for logit (temperature). The sahpe \[1\] or \[batch_size, 1\] on cpu, optional. - 12. Length penalty for logit (len_penalty). The shape is \[1\] or \[batch_size, 1\] on cpu, optional - 13. Repetition penalty for logit (repetition_penalty). The shape is \[1\] or \[batch_size, 1\] on cpu, optional - 14. Random_seed \[1\] or \[batch_size, 1\] on cpu, optional - 15. Length of prefix soft prompt embedding. This describes how many tokens of soft prompt embedding in each sentence. The shape is \[batch_size\], optional. - 16. Prefix soft prompt embedding. FT will concat them with results of embedding lookup kernel. The shape is \[batch_size, max_prefix_soft_prompt_length, hidden_units\], optional. -* Output tensors: - 1. Output ids. The shape is \[batch size, beam width, maximum output sequence length \]. - 2. Sequence lengths. The shape is \[batch size * beam width\]. It records the final sequence lengths of all sentences. - 3. Log probability for sampling. The shape is \[requested token number, batch size, beam \]. It records the log probability of logits at each step. Optional outputs in FP32. - -The beam_width value is set by the output shape directly. When the beam_width is larger than 1, FT will use beam search to generate tokens; otherwise, FT will use topk or topp sampling. - ## Setup ### Requirements @@ -101,10 +120,10 @@ The beam_width value is set by the output shape directly. When the beam_width is - CMake >= 3.13 for PyTorch - CUDA 11.0 or newer version - NCCL 2.10 or newer version -- Python 3 is recommended because some features are not supported in python 2 +- Python: Only verify on python 3 - PyTorch: Verify on 1.8.0, >= 1.5.0 should work. -Recommend use nvcr image like `nvcr.io/nvidia/pytorch:21.11-py3`. +Recommend use nvcr image like `nvcr.io/nvidia/pytorch:22.07-py3`. These components are readily available within the NGC Docker image below. @@ -122,13 +141,13 @@ For those unable to use the NGC container, to set up the required environment or ### Docker image -* The model was built and tested with the use nvcr image `nvcr.io/nvidia/pytorch:21.07-py3`. e.g. +* The model was built and tested with the use nvcr image `nvcr.io/nvidia/pytorch:22.07-py3`. e.g. ```bash - nvidia-docker run -ti --rm nvcr.io/nvidia/pytorch:21.07-py3 bash + nvidia-docker run -ti --rm nvcr.io/nvidia/pytorch:22.07-py3 bash ``` -### Setup +### Build project * Get the code and install all dependencies: @@ -140,10 +159,19 @@ For those unable to use the NGC container, to set up the required environment or pip3 install fire jax jaxlib ``` -### Build +* Note: the `xx` of `-DSM=xx` in following scripts means the compute capability of your GPU. The following table shows the compute capability of common GPUs. -* Note: the `xx` of `-DSM=xx` in following scripts means the compute capability of your GPU. For example, 60 (P40) or 61 (P4) or 70 (V100) or 75(T4) or 80 (A100). Default setting is including 70, 75, 80 and 86. +| GPU | compute capacity | +| :---: | :--------------: | +| P40 | 60 | +| P4 | 61 | +| V100 | 70 | +| T4 | 75 | +| A100 | 80 | +| A30 | 80 | +| A10 | 86 | +By default, `-DSM` is set by 70, 75, 80 and 86. When users set more kinds of `-DSM`, it requires longer time to compile. So, we suggest setting the `-DSM` for the device you use only. Here, we use `xx` as an example due to convenience. ```bash cmake -DSM=xx -DCMAKE_BUILD_TYPE=Release -DBUILD_MULTI_GPU=ON .. @@ -152,11 +180,12 @@ For those unable to use the NGC container, to set up the required environment or ### Download the model -* Download the public model and convert +* Download the mystic public model and convert ```bash wget https://mystic.the-eye.eu/public/AI/GPT-J-6B/step_383500_slim.tar.zstd - tar -axf step_383500_slim.tar.gz + unzstd step_383500_slim.tar.zstd + tar -axf step_383500_slim.tar python3 ../examples/pytorch/gptj/utils/gptj_ckpt_convert.py --output-dir ../models/j6b_ckpt --ckpt-dir ./step_383500/ ``` @@ -165,6 +194,21 @@ The script accepts the following arguments: 2. `--ckpt-dir` is the path to the extracted checkpoint. If `--ckpt-dir` terminates with `.pt` then the script reads the Pytorch model file instead than the public checkpoint, which is faster. 3. `--n-inference-gpus` number of GPUs used for inference, defaults to 1. The binary model parameters are saved to `${output-dir}/${n-inference-gpus}-gpu/` +* Download the huggingface gptj model and convert + + ```bash + sudo apt-get install git-lfs + git lfs install + git clone https://huggingface.co/EleutherAI/gpt-j-6B + python3 ../examples/pytorch/gptj/utils/huggingface_gptj_ckpt_convert.py --ckpt-dir gpt-j-6B/ --output-dir gpt-j-6B/c-models/ --n-inference-gpus 1 + ``` + +The script accepts the following arguments: +1. `--output-dir` is the path of the base directory where the weight binary files will be saved. +2. `--ckpt-dir` is the path to the extracted checkpoint. +3. `--n-inference-gpus` number of GPUs used for inference, defaults to 1. The binary model parameters are saved to `${output-dir}/${n-inference-gpus}-gpu/` + +### Download tables * The vocabolary and merge tables are the same as for GPT @@ -179,7 +223,7 @@ The script accepts the following arguments: Data Type = 0 (FP32) or 1 (FP16) or 2 (BF16) ```bash ./bin/gpt_gemm - E.g., ./bin/gpt_gemm 8 1 32 16 128 16384 50400 1 1 + E.g., ./bin/gpt_gemm 8 1 32 16 256 16384 50400 1 1 ``` * Run GPT on C++ @@ -190,7 +234,7 @@ The script accepts the following arguments: mpirun -n 1 --allow-run-as-root ./bin/gptj_example ``` -E.g. by setting the `is_half` of `gpt_config.ini` to 1, users can run gpt model under fp16. +E.g. by setting the `data_type` of `gpt_config.ini` to `fp16` or `bf16`, users can run gpt model under fp16/bf16. * Convert the token ids to sentence. @@ -208,8 +252,59 @@ E.g. by setting the `is_half` of `gpt_config.ini` to 1, users can run gpt model export CUDA_VISIBLE_DEVICES=0 mpirun -n 1 --allow-run-as-root ./bin/gptj_triton_example ``` + To run with tensor and/or pipeline parallelism, make more GPUs visible, edit the `../examples/cpp/gptj/gptj_config.ini` and generate the parameter files with `gptj_ckpt_convert.py` accordingly. + +### Run GPTJ with prompts + +GPTJ now supports prefix_prompt. + +1. Convert the prompt weights + + You need to transpose the prefix prompt weights to the shape [num_layers, 2, num_heads, perfix_seq_len, size_per_head], and save it by numpy. The naming style is like ` model.prefix_prompt..weights..bin`. + + Note that you need to specify `start_id`, `end_id` by yourself in order to make sure that it is consistent with the tokenizer. + +2. Run GPT with C++ example + + You need to specify the example gpt_config.ini like below to enable the p/prompt_tuning feature. + + ```ini + [gpt_124M] + head_num=12 + size_per_head=64 + vocab_size=50257 + decoder_layers=12 + start_id=50256 + end_id=50256 + inter_size=3072 + num_tasks=3 + prompt_learning_type=3 + + [gpt_124M_task_0] + task_name = squad + prompt_length = 10 + + [gpt_124M_task_1] + task_name = sentiment + prompt_length = 10 + + [gpt_124M_task_2] + task_name = intent_and_slot + prompt_length = 10 + ``` + + `task_name` and `prompt_length` are specified for loading prompt weights. + + **prompt_learning_type**: + + - no prompt: 0 + - soft_prompt: 1 + - prefix_prompt: 2 + - p/prompt_tuning: 3 + + ### Compare with reference implementation * Install the reference implementation from finetuneanon: diff --git a/docs/gptneox_guide.md b/docs/gptneox_guide.md new file mode 100644 index 000000000..61f078770 --- /dev/null +++ b/docs/gptneox_guide.md @@ -0,0 +1,135 @@ +# GPT-NeoX + +## Table Of Contents + +- [GPT-NeoX](#gpt-neox) + - [Table Of Contents](#table-of-contents) + - [Introduction](#introduction) + - [Supported features](#supported-features) + - [Setup](#setup) + - [Requirements](#requirements) + - [Download the model](#download-the-model) + - [Tokenizer](#tokenizer) + - [Run GPT-NeoX](#run-gpt-neox) + +## Introduction + +This document describes the steps to run the GPT-NeoX model on FasterTransformer. +GPT-NeoX is a model developed by EleutherAI, available publicly on their GitHub [repository](https://github.com/EleutherAI/gpt-neox). +For the time being, only the 20B parameter version has been tested. + +More details are listed in [gptj_guide.md](gptj_guide.md#introduction). + +Optimization in gpt-neox are similar to optimization in GPT, describing in the [gpt_guide.md](gpt_guide.md#optimization). + +### Supported features + +* Checkpoint converter + * EleutherAI +* Data type + * FP32 + * FP16 +* Feature + * Multi-GPU multi-node inference + * Dynamic random seed + * Stop tokens + * Bad words list + * Beam search and sampling are both supported + +## Setup + +### Requirements + +See common requirements such as in [gptj_guide.md](gptj_guide.md#requirements). + +### Download the model + +First download a pytorch checkpoint, as provided by [EleutherAI](https://github.com/EleutherAI/gpt-neox#download-links): + +```bash +wget --cut-dirs=5 -nH -r --no-parent --reject "index.html*" https://mystic.the-eye.eu/public/AI/models/GPT-NeoX-20B/slim_weights/ -P 20B_checkpoints +``` + +Then use the script provided by FasterTransformer to convert the checkpoint to raw weights, understood by FT. + +```bash +python ../examples/pytorch/gptneox/utils/eleutherai_gpt_neox_convert.py 20B_checkpoints ../models/gptneox -t 2 +``` + +### Tokenizer + +You may download the tokenizer config [here](https://mystic.the-eye.eu/public/AI/models/GPT-NeoX-20B/slim_weights/20B_tokenizer.json). + +To tokenize/detokenize files, use the script found in `examples/pytorch/gptneox/utils/hftokenizer.py`. You may need to pass the path to the tokenizer config with the `--tokenizer` flag. + +### Run GPT-NeoX + +* Generate the `gemm_config.in` file.\ + Data Type = 0 (FP32) or 1 (FP16) or 2 (BF16) + ```bash + ./bin/gpt_gemm + E.g., ./bin/gpt_gemm 8 1 32 64 96 24576 50432 1 2 + ``` + +* Run GPT on C++ + + Users can see the details of arguments in `examples/cpp/gptneox/gptneox_config.ini`. It controls the model path, model size, tensor parallelism size, and some hyper-parameters. + + ```bash + mpirun -n 2 --allow-run-as-root ./bin/gptneox_example + ``` + +E.g. by setting the `data_type` of `gptneox_config.ini` to `fp16`, users can run gpt model under fp16. + +You can then decode the `out` file with the tokenizer: + + ```bash + wget https://mystic.the-eye.eu/public/AI/models/GPT-NeoX-20B/slim_weights/20B_tokenizer.json + ../examples/pytorch/gptneox/utils/hftokenizer.py out --tokenizer 20B_tokenizer.json + ``` + + diff --git a/docs/images/encoder_flowchart.png b/docs/images/encoder_flowchart.png index ce5086f537a04309402902ce68e594333a0241df..0eb5fe9069c55e53bf36ded5782536ad088ae578 100644 GIT binary patch delta 309819 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 dU({){W}VkMoil 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%0D&LyeKF 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 Ii#H$s54!1A2><{9 delta 309589 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

q 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ƱT{Urs4cw>Me*@^KFAa!23xZd35Qf&eT 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