FasterTransformer GPT-NeoX 推理指南:20B 模型部署、权重转换与多卡并行实践 推理引擎算子库大模型【免费下载链接】FasterTransformerTransformer related optimization, including BERT, GPT项目地址https://gitcode.com/gh_mirrors/fa/FasterTransformer点击查看免费下载导读本文围绕 FasterTransformer 仓库中的 docs/gptneox_guide.md 展开系统讲解如何在 FasterTransformer 上运行 EleutherAI 的 GPT-NeoX 模型目前仅验证过 20B 参数版本。你将掌握从 EleutherAI / HuggingFace 两种来源获取并转换检查点、配置 tokenizer、生成 GEMM 配置、以 C 与 PyTorch 两种方式执行推理以及通过tensor_para_size/pipeline_para_size实现单节点内多卡并行TP/PP的完整操作链路并结合仓库源码理解其注意力优化与模型结构设计。背景为什么在 FasterTransformer 上运行 GPT-NeoXGPT-NeoX 是 EleutherAI 开发的 GPT 类自回归语言模型其 20B 版本是目前仓库中验证过的唯一 GPT-NeoX 规格。FasterTransformer 对 GPT-NeoX 的优化与 GPT 系列基本一致可参见 docs/gpt_guide.md 中的优化说明更多通用介绍可参考 docs/gptj_guide.md。从源码结构看FasterTransformer 在 src/fastertransformer/models/gptneox/ 下实现了完整的 GPT-NeoX 推理模型GptNeoX.h模型主入口组合上下文解码器GptNeoXContextDecoder、自回归解码器GptNeoXDecoder与动态解码层DynamicDecodeLayerGptNeoXContextDecoder.cc负责 context提示词部分的并行前向GptNeoXDecoder.cc负责逐 token 自回归解码GptNeoXWeight.h 与 GptNeoXWeight.cc定义权重加载与划分逻辑。在 GptNeoX.h 中可以看到几个关键结构事实neox_rotary_style_ trueGPT-NeoX 采用 Neox 风格的旋转位置编码rotary embeddinguse_gptj_residual_ true残差结构与 GPT-J 保持一致layernorm_eps_ 1e-5fLayerNorm 的 epsilon 固定为 1e-5通过CONTEXT_ATTENTION_BMM1_HALF_ACCUM环境变量控制 context 阶段 QK GEMM 的累加精度默认 fp32。推理调优环境变量针对具体使用场景FasterTransformer 提供以下环境变量与 GPT-J 指南中的设置一致名称描述默认值可选值FMHA_ENABLE启用 fused multi-head attention 核函数fp16 累加禁用ON表示启用其余值均表示禁用CONTEXT_ATTENTION_BMM1_HALF_ACCUM对 QK GEMM 使用 fp16 累加仅对非融合 multi-head attention 核函数生效fp32 累加ON表示 fp32 累加其余值表示 fp16 累加从 GptNeoX.h 的源码可见CONTEXT_ATTENTION_BMM1_HALF_ACCUM是通过std::getenv在构造阶段读取的当环境变量为nullptr或取值不等于ON时is_context_qk_buf_float_为true即默认采用 fp32 累加缓冲区。支持的功能清单根据指南当前支持能力如下检查点转换器EleutherAI 格式、HuggingFace 格式数据类型FP32、FP16推理特性多 GPU 多节点推理、动态随机种子dynamic random seed、停止 tokenstop tokens、坏词列表bad words list、同时支持 beam search 与采样sampling。环境准备与构建通用依赖要求与 GPT-J 一致详见 docs/gptj_guide.md 的 Requirements 一节核心包括CMake 3.13PyTorch 场景CUDA 11.0 及以上NCCL 2.10 及以上多卡推理必需Python 3仅在 Python 3 上验证PyTorch在 1.8.0 上验证 1.5.0 应可运行。官方推荐使用 NGC 镜像例如nvcr.io/nvidia/pytorch:22.09-py3。构建时按 GPU 计算能力设置-DSM如 V100 为 70、T4 为 75、A100 为 80、A10 为 86并以-DBUILD_MULTI_GPUON打开多卡支持git clone https://github.com/NVIDIA/FasterTransformer.git mkdir -p FasterTransformer/build cd FasterTransformer/build git submodule init git submodule update pip3 install fire jax jaxlib cmake -DSMxx -DCMAKE_BUILD_TYPERelease -DBUILD_MULTI_GPUON .. make -j12从 EleutherAI 检查点部署下载模型权重使用wget递归下载 EleutherAI 公开的 GPT-NeoX-20B slim_weightswget --cut-dirs5 -nH -r --no-parent --reject index.html* https://mystic.the-eye.eu/public/AI/models/GPT-NeoX-20B/slim_weights/ -P 20B_checkpoints下载完成后20B_checkpoints目录内是分片保存的layer_XX-model_YY-model_states.pt文件。从 examples/pytorch/gptneox/utils/eleutherai_gpt_neox_convert.py 的文档注释可以看到其权重组织方式layer_00-model_00-model_states.ptword_embeddings.weightembedding 表按张量并行切分layer_02-model_00-model_states.pt ~ layer_45-model_01-model_states.pt每层包含input_layernorm.*、attention.query_key_value.*、attention.rotary_emb.inv_freq、attention.dense.*、post_attention_layernorm.*、mlp.dense_h_to_4h.*、mlp.dense_4h_to_h.*layer_47-model_00-model_states.pt最终 LayerNormmodel_00与model_01权重相同取其一即可layer_48-model_00-model_states.ptfinal_linear.weightlogit GEMM 权重mp_rank_xx_model_states.pt训练状态推理无需使用。转换脚本还维护了一份weights_skip_tensor_split列表如input_layernorm.bias/weight、attention.dense.bias、mlp.dense_4h_to_h.bias、post_attention_layernorm.bias/weight这些张量不做张量并行切分。转换为 FT 权重python ../examples/pytorch/gptneox/utils/eleutherai_gpt_neox_convert.py 20B_checkpoints ../models/gptneox -t 2参数含义第一个位置参数20B_checkpoints下载的 EleutherAI 检查点目录第二个位置参数../models/gptneoxFT 权重输出目录-t 2tensor parallelism 大小此处为 2 卡张量并行。后续 C 推理时mpirun -n的进程数必须与之匹配。转换过程会执行权重重排如将attention.query_key_value.weight重排为 FT 需要的[hidden_size, 3, num_heads, head_hidden]布局并按-t指定的 GPU 数把权重切分为%d-gpu/子目录。同时脚本会生成 FT 推理所需的 config.ini 描述文件其内容与该模型的核心超参数一一对应见下文“模型配置”小节。Tokenizer单独下载 tokenizer 配置wget https://mystic.the-eye.eu/public/AI/models/GPT-NeoX-20B/slim_weights/20B_tokenizer.json对文本文件进行 tokenize / detokenize 时使用仓库脚本 examples/pytorch/gptneox/utils/hftokenizer.py并通过--tokenizer传入 tokenizer 配置路径python ../examples/pytorch/gptneox/utils/hftokenizer.py out --tokenizer 20B_tokenizer.json从 HuggingFace 检查点部署先克隆 HuggingFace 上的 GPT-NeoX 模型仓库需安装 git-lfsgit lfs clone https://huggingface.co/MODEL_GROUP/MODEL_NAME再使用转换脚本 examples/pytorch/gptneox/utils/huggingface_gptneox_convert.py 转为 FT 原始权重python ../examples/pytorch/gptneox/utils/huggingface_gptneox_convert.py -i ../path/to/your/model -o ../../path/to/fastertransformer/model -i_g 1 -m_n gptneox各参数含义-iHuggingFace 模型所在目录GPTNeoXForCausalLM.from_pretrained读取-oFT 权重输出目录-i_ginference GPU 数即张量并行大小权重会按该数值切分并存入saved_dir/infer_gpu_num-gpu/-m_n模型名称此处为gptneox。从 huggingface_gptneox_convert.py 的源码可以看到转换时对 QKV 权重做了关键布局变换HuggingFace 中attention.query_key_value.weight的存储形状为[hidden_size, num_heads, 3, head_hidden]转换脚本先 reshape 再转置为 FT 需要的[hidden_size, 3, num_heads, head_hidden]同时按-i_g对dense/mlp权重分别沿行、列方向切分保证每张卡只持有本地分片。转换同时支持--weight_data_type指定fp32/fp16get_weight_data_type。运行 GPT-NeoX第一步生成 gemm_config.in在编译产物build/bin目录下先用gpt_gemm为当前硬件与模型规格生成 GEMM 调优配置./bin/gpt_gemm batch_size beam_width max_input_len head_number size_per_head inter_size vocab_size data_type tensor_para_size E.g., ./bin/gpt_gemm 8 1 32 64 96 24576 50432 1 2其中data_type0 表示 FP321 表示 FP162 表示 BF16。示例命令对应 GPT-NeoX-20B 的规格head_number64、size_per_head96、inter_size24576、vocab_size50432tensor_para_size2与后续 C 示例的mpirun -n 2保持一致。第二步C 推理配置文件 examples/cpp/gptneox/gptneox_config.ini 控制模型路径、模型规模、张量并行大小及采样超参数运行mpirun -n 2 --allow-run-as-root ./bin/gptneox_example将gptneox_config.ini中[ft_instance_hyperparameter]段的data_type设置为fp16即可在 FP16 下运行。gptneox_example的编译入口位于 examples/cpp/gptneox/gptneox_example.cc其CMakeLists.txt定义于 examples/cpp/gptneox/CMakeLists.txt同目录下还提供了 gptneox_triton_example.cc 用于以 Triton 模型方式启动。推理完成后out文件中的 token id 序列可用 hftokenizer 还原为文本wget https://mystic.the-eye.eu/public/AI/models/GPT-NeoX-20B/slim_weights/20B_tokenizer.json python ../examples/pytorch/gptneox/utils/hftokenizer.py out --tokenizer 20B_tokenizer.json第三步PyTorch 推理examples/pytorch/gptneox/gptneox_example.py 演示了如何声明模型examples/pytorch/gptneox/utils/gptneox.py中的GptNeoX封装、加载检查点、前向 context 输入并得到生成结果。运行python .../gptneox_example.py -h可查看全部参数。常用命令行参数摘自脚本的 argparse 定义见 gptneox_example.py参数默认值说明--output_len32生成序列长度--beam_width1beam search 的 beam 宽度为 1 时走采样--top_k1top-k 采样候选数--top_p0.0top-p 采样概率阈值--temperature1.0采样温度--len_penalty0.0长度惩罚仅 beam search 生效--beam_search_diversity_rate0.0beam search diversity rate--tensor_para_size1张量并行大小--pipeline_para_size1流水线并行大小--ckpt_path../models/gptneox/c-model/NeoX-1.3B/1-gpu转换后的 FT 权重目录内含 config.ini--tokenizer_path../models/gptneox/model/NeoX-1.3Btokenizer 所在目录--lib_path./lib/libth_transformer.solibth_transformer.so动态库路径--sample_input_file无上下文输入文件路径每行一条--max_batch_size8最大 batch 大小--repetition_penalty1.0重复惩罚--max_seq_len1024位置编码表最大序列长度--inference_data_type(--data_type)fp16可选fp32/fp16--time关闭是否测量推理耗时输出 tokens/sec 吞吐--enable_random_seed关闭是否启用动态随机种子关于输入与模型配置脚本从ckpt_path下的config.ini读取head_num、size_per_head、vocab_size、num_layer、rotary_embedding、start_id、end_id、use_gptj_residual、weight_data_type等超参数见 gptneox_example.py。带上下文输入context的生成要基于上下文生成输出需创建一个每行一条 prompt 的文本文件并通过--sample_input_file指向它。脚本按max_batch_size截取行数将每行经 tokenizer encode 后作为start_idsgptneox_example.py。若未指定该参数脚本默认以batch_size max_batch_size的|endoftext|即end_id作为无条件生成输入。模型配置config.ini转换脚本生成的config.ini采用如下结构参见 eleutherai_gpt_neox_convert.py与 C 端 gptneox_config.ini 中[gptneox_20B]段一一对应[gptneox] model_namegptneox_20B head_num64 size_per_head96 vocab_size50432 num_layer44 rotary_embedding24 start_id0 end_id2 inter_size24576 use_gptj_residual1 weight_data_typefp32各字段含义head_num64、size_per_head9664 头、每头 96 维隐藏层维度为 64×966144vocab_size50432词表大小num_layer44Decoder 层数rotary_embedding24旋转位置编码维度GPT-NeoX 对 Query 和 Key 都施加旋转Neox 风格start_id0/end_id2起始 / 结束 token id必须与 tokenizer 保持一致inter_size24576FFN 中间层维度use_gptj_residual1采用 GPT-J 风格残差结构weight_data_typefp32权重存储精度可在运行时以--data_type fp16做 FP16 推理。多卡 TP / PP 运行PyTorch 版支持单节点内张量并行TP与流水线并行PP的组合。进程数必须严格等于tensor_para_size * pipeline_para_size且转换权重时-i_g或 EleutherAI 转换的-t要与目标tensor_para_size对应# 无并行tensor_para_size1, pipeline_para_size1 python ../examples/pytorch/gptneox/gptneox_example.py # TPtensor_para_size2, pipeline_para_size1 mpirun -n 2 --allow-run-as-root python ../examples/pytorch/gptneox/gptneox_example.py --tensor_para_size2 --pipeline_para_size1 --ckpt_path/path/to/your/model/2-gpu # PPtensor_para_size1, pipeline_para_size2 mpirun -n 2 --allow-run-as-root python ../examples/pytorch/gptneox/gptneox_example.py --tensor_para_size1 --pipeline_para_size2 --ckpt_path/path/to/your/model/1-gpu # TP PPtensor_para_size2, pipeline_para_size2 mpirun -n 4 --allow-run-as-root python ../examples/pytorch/gptneox/gptneox_example.py --tensor_para_size2 --pipeline_para_size2 --ckpt_path/path/to/your/model/2-gpu注意PP 场景下各 rank 使用相同的1-gpu权重模型按层数均匀切分给流水线各阶段TP 场景下每 rank 使用切分后的2-gpu权重。当tensor_para_size * pipeline_para_size 1时脚本会调用dist.init_process_group(backenddist.Backend.MPI)初始化 MPI 进程组gptneox_example.py。在 C 端tensor_para_size与pipeline_para_size同样在 gptneox_config.ini 的[ft_instance_hyperparameter]段中控制且进程数必须等于两者之积。采样与解码参数gptneox_config.ini 的[request]段集中了推理请求级的解码参数参数示例值说明beam_width1beam search 宽度为 1 时使用采样top_k1top-k 采样 k 值top_p0.0top-p 采样阈值temperature1.0采样温度repetition_penalty1.0重复惩罚presence_penalty0.0presence 惩罚与 repetition_penalty 二者只能选一len_penalty0.0长度惩罚beam_search_diversity_rate0.0beam search diversity raterequest_batch_size8请求 batch 大小request_output_len32请求输出长度从 GPT-J 指南docs/gptj_guide.md可知该系列模型解码的通用行为当beam_width 1时执行 beam searchbeam_width 1时按top_k/top_p走采样若 beam width 为 1 且 top_k 为 0、top_p 为 0.0则自动退化为 greedy search。repetition_penalty与presence_penalty为互斥关系同时设置时只有其一被允许。附加能力与扩展说明Prompt Learning前缀提示词原指南中以注释形式保留了prefix_prompt的实验性配置说明适用于定制检查点通过examples/pytorch/gptneox/utils/huggingface_jp_gptneox_convert.py转换权重。其思路是在[gptneox_20B]段中设置num_tasks与prompt_learning_type并为每个任务声明[gptneox_20B_task_N]段task_name、prompt_lengthprompt_learning_type取值0no prompt1soft_prompt2prefix_prompt3p/prompt_tuning。从 GptNeoX.h 源码可以看到模型结构体中确实内置了PromptLearningType prompt_learning_type_、prompt_learning_start_id_、has_prefix_prompt_、has_prefix_soft_prompt_等成员且 GptNeoX.h 引入了utils/prompt_learning.h说明 prompt learning 机制在该模型实现中是可扩展的。需要提醒的是原指南将该部分标注为仅适用于定制检查点的未正式发布流程实际使用前请自行核对 tokenizer 的start_id/end_id一致性。停止 token 与坏词列表examples/cpp/gptneox/ 目录下随示例提供了 stop_words.csv、bad_words.csv 与 start_ids.csv分别用于指定停止 token、禁止生成的坏词与起始 token 序列。坏词列表的构造可参考 GPT 系列通用的word_list.py思路注意 tokenizer 对word与Spaceword通常会映射为两个不同 token构造列表时需要区分。推理结果解码无论 C 还是 PyTorch 路径最终输出的 token id 均需通过 tokenizer 还原为自然语言python ../examples/pytorch/gptneox/utils/hftokenizer.py out --tokenizer 20B_tokenizer.json小结与检查清单在 FasterTransformer 上跑通 GPT-NeoX-20B 的完整路径可归纳为四步获取权重从 EleutherAIslim_weights或 HuggingFacegit lfs clone下载检查点转换格式分别使用 eleutherai_gpt_neox_convert.py 或 huggingface_gptneox_convert.py 转出含config.ini的 FT 权重目录并按目标tensor_para_size切分生成 GEMM 配置用./bin/gpt_gemm按模型规格64 头 / 96 每头 / 24576 inter / 50432 vocab生成gemm_config.in运行推理C 端通过 gptneox_config.ini mpirun运行gptneox_examplePyTorch 端通过 gptneox_example.py 运行并按需组合 TP / PP。常见踩坑点mpirun -n进程数必须等于tensor_para_size * pipeline_para_size多卡时权重切分数必须与tensor_para_size一致start_id/end_id必须与所选 tokenizer 一致repetition_penalty与presence_penalty不可同时启用。上述任何一步的参数校验都可以回溯到 GptNeoX.h 与两个转换脚本的源码中得到印证。赞分享推理引擎算子库大模型【免费下载链接】FasterTransformerTransformer related optimization, including BERT, GPT项目地址https://gitcode.com/gh_mirrors/fa/FasterTransformer点击查看免费下载相关推荐终极文档解析指南如何用AnythingLLM打破格式壁垒构建智能知识库终极文档解析指南如何用AnythingLLM打破格式壁垒构建智能知识库 你是否曾被海量文档淹没PDF报告、Word文档、Excel表格、Markdown笔人工智能AI 应用RAGAI Agent后端前端LLaMA到GPT-NeoX权重转换convert_raw_llama_weights_to_neox.py实操LLaMA到GPT NeoX权重转换convert_raw_llama_weights_to_neox.py实操 转换工具概述 convert_raw_lla深度学习NLP大模型分布式训练预训练GPT-OSS 模型在 NPU 上的推理实践基于 CANN 的部署、权重转换与性能优化详解GPT OSS 模型在 NPU 上的推理实践基于 CANN 的部署、权重转换与性能优化详解 导读 本文基于 CANN 开源仓库 cann recipes in示例工程人工智能大模型模型推理服务模型优化模型量化CANNAscend上一篇30分钟快速部署ERPNext免费开源企业管理系统完整指南下一篇Basic Pitch 错误排查终极指南解决音频转MIDI常见问题的完整方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考