拓冰建站拓冰建站
首页 / 资讯中心 / 正文

FauxPilot 模型转换指南:从 SalesForce CodeGen 到 FasterTransformer + Triton 的完整转换流水线

AI 应用代码模型模型推理服务后端【免费下载链接】fauxpilotFauxPilot - an open-source alternative to GitHub Copilot server项目地址https://gitcode.com/gh_mirrors/fa/fauxpilot点击查看免费下载本篇技术指南讲解 FauxPilot 开源项目中converter/目录下的深度学习模型转换流程如何将 Hugging Face 上的 SalesForce CodeGen 模型依次转换为 GPT-J 格式、FasterTransformer 权重文件并生成可直接供 Triton Inference Server 加载的config.pbtxt配置。读完本文你将掌握 FauxPilot 中原始 CodeGen 模型 → 可推理模型仓库这一完整链路中每个脚本的职责、关键命令行参数、底层权重重排原理以及转换产物的目录组织方式。转换流水线总览四步链路FauxPilot 的模型转换并不是一步到位的而是由 converter/ 目录下的一组脚本按顺序协作完成。从源码结构看整条流水线分为四个阶段搭建转换环境使用 converter/Dockerfile 构建一个基于 Ubuntu 20.04、内置 Hugging Face Transformers 库的镜像一键调度由 converter/download_and_convert_model.sh 串起后续两步转换CodeGen → GPT-J由 converter/codegen_gptj_convert.py 将 SalesForce CodeGen 模型转换为 GPT-J 架构权重HF → FasterTransformer Triton 配置由 converter/huggingface_gptj_convert.py 将 GPT-J/HF 权重转换为 FasterTransformer 可加载的二进制权重再由 converter/triton_config_gen.py 基于 converter/config_template.pbtxt 模板生成 Triton 模型配置。这套流水线的背景是FauxPilot 的服务端推理通过 NVIDIA FasterTransformer 后端在 Triton Inference Server 上运行见 triton.Dockerfile而 SalesForce CodeGen 与 GPT-J 同源同构均为基于旋转位置编码的 decoder-only 自回归模型因此可以先把 CodeGen 权重翻译成 GPT-J 权重再按 FasterTransformer 的张量并行布局切分落盘。第一步构建转换环境converter/Dockerfileconverter/Dockerfile 从nvidia/cuda:11.2.2-cudnn8-devel-ubuntu20.04基础镜像出发构建一个包含 Transformer 库的转换环境其关键点包括安装系统依赖git、libsndfile1-dev、tesseract-ocr、espeak-ng、python3、python3-pip、ffmpeg以可编辑模式安装 Hugging Face Transformers源码位于仓库根目录的 README.md 中介绍的流程即由此触发并安装torch、torchvision、torchaudio默认从 cu113 的 PyTorch 索引拉取可通过构建参数PYTORCH、TORCH_VISION、TORCH_AUDIO指定固定版本卸载tensorflow与flax避免与 PyTorch 生态冲突安装torch-scatter、detectron2、pytesseract、kenlm等附加依赖并固定itsdangerous2.1.0以保证版本兼容最后设置工作目录/workspace通过环境变量MODELcodegen-6B-multi、NUM_GPUS1给出默认转换目标并以CMD直接执行bash download_and_convert_model.sh $MODEL $NUM_GPUS。也就是说构建并运行该镜像时不需要手动传参默认就会执行codegen-6B-multi模型、单 GPU 的转换任务覆盖默认模型与 GPU 数量只需在运行时传入环境变量即可。第二步一键转换脚本download_and_convert_model.shconverter/download_and_convert_model.sh 是整个流水线的调度入口接收两个位置参数MODEL模型名如codegen-6B-multi和NUM_GPUS推理时使用的 GPU 数如1/2/4随后依次执行cp -r models/${MODEL}-${NUM_GPUS}gpu /models python3 codegen_gptj_convert.py --code_model Salesforce/${MODEL} ${MODEL}-hf python3 huggingface_gptj_convert.py -in_file ${MODEL}-hf -saved_dir /models/${MODEL}-${NUM_GPUS}gpu/fastertransformer/1 -infer_gpu_num ${NUM_GPUS} rm -rf ${MODEL}-hf其执行逻辑为将仓库内预设的models/${MODEL}-${NUM_GPUS}gpu目录结构复制到/models调用codegen_gptj_convert.py从 Hugging Face 拉取Salesforce/${MODEL}模型并转换为 GPT-J 格式输出到本地目录${MODEL}-hf调用huggingface_gptj_convert.py把${MODEL}-hf转换为 FasterTransformer 权重写入/models/${MODEL}-${NUM_GPUS}gpu/fastertransformer/1并按infer_gpu_num指定的 GPU 数切分权重清理临时目录${MODEL}-hf。第三步CodeGen → GPT-J 权重转换codegen_gptj_convert.pyconverter/codegen_gptj_convert.py 的核心任务是把 SalesForce CodeGen 模型的权重翻译成 GPT-J 模型权重。脚本基于 2022-07-22 左右的 Transformers 版本编写需要 Transformers 提供CodeGenTokenizer、CodeGenForCausalLM等类。命令行参数参数说明默认值--code_model要转换的 SalesForce 模型名取值受限于CODEGEN_PRETRAINED_MODEL_ARCHIVE_LIST例如Salesforce/codegen-350M-multiSalesforce/codegen-350M-multioutput_dir位置参数转换后模型的保存目录必填转换原理架构对齐 QKV 权重置换脚本先加载 CodeGen 模型然后用其config的全部关键超参vocab_size、n_positions、n_embd、n_layer、n_head、rotary_dim、n_inner、activation_function、各类 dropout 概率、layer_norm_epsilon、initializer_range、scale_attn_weights、use_cache、bos_token_id、eos_token_id等构建一个空的GPTJForCausalLM模型并将tokenizer_class修正为CodeGenTokenizer。随后在torch.no_grad()下遍历 CodeGen 模型的全部参数并拷贝到 GPT-J 模型中。唯一需要特殊处理的是注意力层的 QKV 投影CodeGen 使用合并的qkv_proj而 GPT-J 使用分离的q_proj、k_proj、v_proj且两者的切分顺序不同。源码中的处理逻辑是base_permutation [0, 3, 6, 9, 1, 4, 7, 10, 2, 5, 8, 11] permutation torch.cat([torch.arange(i * local_dim, (i 1) * local_dim) for i in base_permutation]) new_qkv_proj qkv_proj[permutation, :] query, value, key torch.split(new_qkv_proj, embed_dim, dim0)即按mp_num 4作者注释为 TPU 核心数切分嵌入维度后对行执行一组固定置换再按embed_dim拆成 query/value/key 三段——注意源码注释明确指出CodeGen 中名为 QKV 的合并权重实际按QVK顺序存放拆分后的顺序才是 GPT-J 期望的 Q、K、V。这段注释里作者还幽默地写道经过大量痛苦调试后发现这个置换可以修复问题。其余权重layernorm、MLP、embedding、lm_head 等按同名直接拷贝。转换完成后调用save_pretrained保存模型。第四步HF → FasterTransformer 权重转换huggingface_gptj_convert.pyconverter/huggingface_gptj_convert.py 源自 NVIDIA 2021–2022 年的 FasterTransformer 转换工具版权声明为 NVIDIA2022 年由 Brendan Dolan-Gavitt 修改Apache-2.0 许可负责把 HF GPT-J 模型权重落盘为 FasterTransformer 可直接读取的二进制权重文件。命令行参数参数短参数说明默认值-saved_dir(-o)输出目录必填脚本会在此基础上追加${infer_gpu_num}-gpu/子目录无-in_file(-i)输入 HF 模型名或目录必填无-trained_gpu_num(-t_g)训练时使用的 GPU 数用于计算切分因子factor infer_gpu_num / trained_gpu_num要求infer_gpu_num能被其整除1-infer_gpu_num(-i_g)推理时使用的 GPU 数必填决定张量并行切分数无-processes(-p)转换时启动的进程数4-weight_data_type输出权重数据类型可选fp32/fp16fp32权重布局与切分规则脚本读取 GPT-J 模型后先将顶层参数直接落盘transformer.wte.weight→model.wte.bin、transformer.ln_f.bias/weight→model.final_layernorm.bias/weight.bin、lm_head.weight/bias→model.lm_head.weight/bias.bin。对于层内参数脚本维护两组名字映射表HF 名 → FasterTransformer 名HF 权重名FasterTransformer 权重名切分方式ln_1.bias/ln_1.weightinput_layernorm.bias/input_layernorm.weight共享权重仅 rank 0 写出attn.q_proj.weightk_proj.weightv_proj.weightattention.query_key_value.weight先按[qkv, n_heads*dim_head, latent]堆叠再转置然后按最后一维切分attn.out_proj.weightattention.dense.weight转置后按 axis0 切分mlp.fc_in.bias/weightmlp.dense_h_to_4h.bias/.weightbias 按最后一维切分weight 转置后按 axis-1 切分mlp.fc_out.bias/weightmlp.dense_4h_to_h.bias/.weightbias 共享weight 按 axis0 切分post_attention_layernorm.*/final_layernorm.*同名共享权重仅 rank 0 写出被切分的权重按model. 权重名 . 分片序号i * factor j命名单个.bin文件。切分逻辑通过multiprocessing.Pool并行执行torch.multiprocessing使用spawn启动方式每个权重按factor infer_gpu_num / trained_gpu_num切分成若干分片。此外脚本还会把命令行参数与模型 config 一并写入config.ini供后续推理时读取。关于 QKV 权重的特别处理由于第一步转换后 GPT-J 模型的注意力权重是分离的q_proj/k_proj/v_proj此脚本会针对attn.q_proj.weight做特殊合并QKV_w torch.stack([ w[base_k attn.q_proj.weight], w[base_k attn.k_proj.weight], w[base_k attn.v_proj.weight], ]) # [qkv, n_heads * dim_head, latent_space] QKV_w QKV_w.permute(2, 0, 1)即把同一个 Transformer 层内的 Q、K、V 三个权重堆叠成[qkv, heads*dim, latent]再转置为 FasterTransformer 期望的attention.query_key_value.weight布局随后按 GPU 数切分。第五步生成 Triton 模型配置triton_config_gen.py config_template.pbtxt权重转换完成后还需要为 Triton Inference Server 生成模型配置。这一步由 converter/triton_config_gen.py 完成它以 converter/config_template.pbtxt 为模板用string.Template机制填充占位符后写出config.pbtxt。命令行参数参数说明默认值--template配置模板路径脚本同目录下的config_template.pbtxt--model_storeTriton 模型仓库根目录必填无--hf_model_dirHF 模型目录必填用于读取GPTJConfig推导超参无--tokenizer分词器名称或路径用于推导vocab_size与起止符 idSalesforce/codegen-16B-multi--rebase模型仓库重定位路径如 Docker 容器内的挂载路径无-n/--num_gpu推理 GPU 数1占位符的推导逻辑模板中需要填充的变量name、tensor_para_size、max_seq_len、is_half、head_num、size_per_head、inter_size、vocab_size、start_id、end_id、decoder_layers、rotary_embedding、checkpoint_path全部由脚本自动推导max_seq_lenconfig.n_positionsCodeGen 为 2048is_half 当config.torch_dtype torch.float16时为1否则为0head_numconfig.n_headsize_per_headconfig.n_embd // config.n_headinter_size4 * config.n_embddecoder_layersconfig.n_layerrotary_embeddingconfig.rotary_dimvocab_sizetokenizer.vocab_size len(tokenizer.get_added_vocab())源码注释提示词汇量有时会被向上取整到 1024 的倍数但当前实现采用精确值start_id与end_id均取tokenizer.eos_token_idcheckpoint_path按转换脚本的目录约定推导为{model_store}/{model_name}-{num_gpu}gpu/fastertransformer/1/{num_gpu}-gpu若指定--rebase则使用重定位后的路径典型场景是把宿主机路径重写为容器内挂载路径。脚本会os.makedirs创建权重目录并把生成的配置写到{model_store}/{model_name}-{num_gpu}gpu/fastertransformer/config.pbtxt随后打印配置路径、权重路径、GPU 数等摘要信息。模板中的输入输出协议converter/config_template.pbtxt 声明了fastertransformer后端的完整 I/O 契约与模型参数模型声明name: fastertransformer、backend: fastertransformer、max_batch_size: 1024、instance_group为单实例KIND_CPU输入张量input_idsTYPE_UINT32、start_id/end_id可选标量、input_lengths、request_output_len、以及可选的解码超参runtime_top_k、runtime_top_p、beam_search_diversity_rate、temperature、len_penalty、repetition_penalty、random_seed、is_return_log_probs、beam_width、bad_words_list、stop_words_list输出张量output_ids、sequence_length、cum_log_probs、output_log_probs模型参数tensor_para_size张量并行度即 GPU 数、pipeline_para_size固定1、max_seq_len、is_half、head_num、size_per_head、inter_size、vocab_size、start_id、end_id、decoder_layers、model_name、rotary_embedding、model_type: GPT-J、model_checkpoint_path即上面推导的权重路径、enable_custom_all_reduce: 0。这些输入输出定义直接对应 FasterTransformer 后端的解码请求协议FauxPilot 的 Python 后端见 python_backend/model.py正是按此协议与 Triton 交互完成代码补全推理的。转换产物模型仓库目录结构仓库中 converter/models/ 目录以{模型名}-{GPU数}gpu/命名方式预置了所有受支持组合的目录骨架涵盖 350M / 2B / 6B / 16B 四种规模、nl自然语言/multi多语言/mono单语言 Python三种变体、以及 1/2/4 三种 GPU 数配置。以codegen-6B-multi-1gpu为例其最终产物结构为converter/models/codegen-6B-multi-1gpu/ └── fastertransformer/ ├── config.pbtxt # Triton 模型配置由 triton_config_gen.py 生成 └── 1/ # 版本目录 └── 1-gpu/ # 按 GPU 数组织的权重目录 ├── model.wte.bin ├── model.final_layernorm.bias.bin ├── model.final_layernorm.weight.bin ├── model.lm_head.weight.bin ├── model.lm_head.bias.bin └── model.layers.*.bin # 各层权重分片converter/models/codegen-6B-multi-1gpu/fastertransformer/config.pbtxt 是真实生成的示例可以看到max_seq_len: 2048、is_half: 1、head_num: 16、size_per_head: 256、inter_size: 16384、vocab_size: 51200、decoder_layers: 33、rotary_embedding: 64、start_id/end_id: 50256、model_checkpoint_path: /model/fastertransformer/1/1-gpu与 CodeGen-6B 的公开超参完全吻合可作为校验转换正确性的参考基准。多 GPU2/4配置的差异仅在于tensor_para_size与权重分片数量从 converter/models/codegen-6B-multi-2gpu/ 与 4gpu 目录即可对照。实际运行完整操作流程在 documentation/server.md 中可以看到该流水线在 FauxPilot 安装流程中的实际运行输出Downloading and converting the model, this will take a while... Converting model codegen-350M-multi with 1 GPUs Loading CodeGen model Downloading pytorch_model.bin: 100%|██████████| 760M/760M [00:1100:00, 68.3MB/s] Creating empty GPTJ model ... Saving model to codegen-350M-multi-hf... saved_dir: /models/codegen-350M-multi-1gpu/fastertransformer/1转换完成后Triton 日志会显示successfully loaded fastertransformer version 1以及Model instance is created on GPU NVIDIA RTX A6000随后模型即以READY状态对外提供服务。整套流程的常见用法可归纳为在 converter/ 目录下以目标模型与 GPU 数为参数直接执行一键脚本例如bash download_and_convert_model.sh codegen-350M-multi 1如需自定义 Triton 配置例如调整模型仓库路径或容器重定位单独运行配置生成脚本python3 triton_config_gen.py --model_store /path/to/models \ --hf_model_dir codegen-350M-multi-hf \ --tokenizer Salesforce/codegen-350M-multi -n 1将生成的{model}-{n}gpu/目录挂载进 Triton 容器对应仓库根目录 docker-compose.yaml 中的模型仓库挂载由 FauxPilot 的 proxy 与 Python 后端按 python_backend/config_template.pbtxt 定义的协议发起推理请求。需要注意的是转换全程需要可访问 Hugging Face 以下载原始模型权重且codegen_gptj_convert.py依赖特定时间点约 2022-07-22 前后的 Transformers 版本行为使用更新版本的 Transformers 时建议以 converter/Dockerfile 锁定的环境为准。整个转换链路是 FauxPilot 部署中模型获取 → 推理就绪的关键环节理解每一步的权重布局转换也能为排查 Triton 加载失败、输出乱码等问题提供直接的排错线索。赞分享AI 应用代码模型模型推理服务后端【免费下载链接】fauxpilotFauxPilot - an open-source alternative to GitHub Copilot server项目地址https://gitcode.com/gh_mirrors/fa/fauxpilot点击查看免费下载相关推荐如何高效完成Paraformer到WeNet模型转换完整操作指南与最佳实践如何高效完成Paraformer到WeNet模型转换完整操作指南与最佳实践 WeNet作为Production First的端到端语音识别工具包支持多种模型人工智能语音深度学习预训练模型推理服务Instagram 数据爬取 5 步指南一条命令把粉丝数、标签、点赞全存成 JSONInstagram 数据爬取 5 步指南一条命令把粉丝数、标签、点赞全存成 JSON 副标题instagram profilecrawl 让任意公开账号的资calibre 电子书转换系统完全指南从转换流水线到格式特定调优calibre 电子书转换系统完全指南从转换流水线到格式特定调优 calibre 内置了一套设计为开箱即用的电子书转换系统只需把图书加入书库并点击转换按桌面应用后端创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门