TensorRT-llm入门

一、目录

  1. 作用
  2. TensorRT-llm 为什么快?
  3. 流程
  4. TensorRT-LLM 环境配置
  5. 大模型 转换、编译与推理
  6. 如何选择量化类型?
  7. lora 大模型如何合并?
  8. lora 大模型如何编译,使用?
  9. 模型类型safetensors与bin互相转换.
  10. 推理加速模型 tensorrRT-LLM、Vllm、fasterTransformer、BetterTransformer 的对比
  11. 如何优化 LLM 模型推理中的访存密集问题?

二、实现

  1. 作用
    NVIDIA提出, TensorRT-LLM 默认采用 FP16/BF16 的精度推理,并且可以利用业界的量化方法,使用硬件吞吐更高的低精度推理进一步推升推理性能。
  2. TensorRT-llm 为什么快?
    1. 模型预编译,并优化内核
    2. 模型进行量化
    3. In-flight批处理
    4. page attention 以及高效缓存K、V.
  3. 流程
    1. huggingface 模型—>tensorRT-llm模型(模型转换)---->转为trt引擎----->trt引擎推理。
  4. TensorRT-LLM 环境配置
    1. 下载tensorRT-LLM 项目,注意,下载0.8.0, 其中0.9.0问题较多

    git clone -b v0.8.0 https://github.com/NVIDIA/TensorRT-LLM.git
    cd TensorRT-LLM

    1. 创建容器(cuda 最好是大于12.2), 也可以是其他容器,该容器包含tritonserver服务。

      docker pull nvcr.io/nvidia/tritonserver:24.02-trtllm-python-py3

docker run --gpus all
–name trt_llm
-d
–ipc=host
–ulimit memlock=-1
–restart=always
–ulimit stack=67108864
-p 8000:8000
-p 7860:7860
-v ${PWD}/examples:/app/tensorrt_llm/examples
nvcr.io/nvidia/tritonserver:24.02-trtllm-python-py3 sleep 8640000

  1. 安装tensorRT-LLM
    >>pip install tensorrt_llm==0.8.0 --extra-index-url https://pypi.nvidia.com --extra-index-url https://download.pytorch.org/whl/cu121
  2. 检查安装
    >> python3 -c “import tensorrt_llm” 生成版本号。
  3. 安装大模型本身需要的环境。
    参考:https://github.com/Tlntin/Qwen-TensorRT-LLM

5.大模型 转换、编译与推理
>>cd TensorRT-LLM/examples/bloom
文件1. convert_checkpoint.py: 将hf 模型转为tensorRT-LLM格式模型。
文件2. …/run.py 推理文件, 根据需求进行相应的修改
文件3. …/summarize.py 在cnn_dailymail 数据集中的测试文本。生成rouge 结果
文件4 benchmark.py 测试吞吐量

方式一、含有build.py 文件
1. 编译 参考:https://github.com/Tlntin/Qwen-TensorRT-LLM
>>python3 build.py --添加参数
2. 使用
>> python3 run.py
方式二、不含有build.py 文件
1. 模型量化 参考:https://github.com/NVIDIA/TensorRT-LLM/tree/main/examples/qwen
>># Build the Qwen-7B-Chat model using a single GPU and FP16.
python convert_checkpoint.py --model_dir ./tmp/Qwen/7B/
–output_dir ./tllm_checkpoint_1gpu_fp16
–dtype float16
2. 创建引擎

trtllm-build --checkpoint_dir ./tllm_checkpoint_1gpu_fp16
–output_dir ./tmp/qwen/7B/trt_engines/fp16/1-gpu
–gemm_plugin float16

  1. 使用

python3 …/run.py --input_text “你好,请问你叫什么?”
–max_output_len=50
–tokenizer_dir ./tmp/Qwen/7B/
–engine_dir=./tmp/Qwen/7B/trt_engines/fp16/1-gpu/
方式三、自己修改,写build.py 文件

          1. 官网下载benchmarks/python下的build.py 文件, 进行修改,同时需要进一步修改模型

后续…
生成文件:
文件1:config.json 配置文件
文件2:rank0.engine 驱动引擎

6.如何选择量化类型?
训练后 量化类型:1. fp16、int8(weight only)、int4(weight only)
2. smooth quant量化:SmoothQuant 通过平滑激活层和权重后,再使用per-tensor或per-token量化,实现W8A8。根据量化方式不同,作者提出三种策略 O1、O2、O3,计算延迟依次降低。
与其他量化方法相比,该方法可以保持较高的精度,同时,具有更低的延迟。
3. int8-kv-cache量化: KV Cache 量化是指将逐 Token(Decoding)生成过程中的上下文 K 和 V 中间结果进行 INT8 量化(计算时再反量化),以降低生成过程中的显存占用。
4. int4-gptq 量化:所有权重压缩到4位量化中,通过最小化与该权重的均方误差来实现。在推理过程中,它将动态地将权重解量化为float16,以提高性能,同时保持内存较低。
5. int4-awq 量化:激活感知的权重量化。 在量化过程中,有一小部分权重将被跳过,这有助于减少量化损失。
模型越大,对仅权重和KV缓存量化的容忍度越高,而对激活量化的容忍度较低。
对于大多数NLP任务,将大多数LLM家族量化为W4、W4A8、KV4和W8KV4,性能损失可以忽略不计(<2%)。在一定的内存预算下,使用量化到W3的较大模型可以获得更优性能。
在四种突出能力(即上下文学习、指令遵循、多步推理和自校准)中,自校准和多步推理能力对量化更敏感。对于小于13B的LLMs,推荐使用W8、W8A8和KV8量化。
对于伦理任务,小型模型对量化的敏感性更高。仅权重量化会增强模型对敏感信息的判断,而KV缓存量化则有相反的效果。
LLMs在处理长文本(>4k)时,对仅权重和KV缓存量化的敏感性高于短文本(<4k),尤其是对KV缓存量化。在大多数情况下,W4、W4A8和KV8可以在长上下文任务中保持性能。
最先进的量化方法,如SmoothQuant和AWQ,在量化造成的性能损失适中时,可以有效提升性能。然而,当使用极低位宽时,AWQ和SmoothQuant无法恢复完全损坏的性能。
参考:https://zhuanlan.zhihu.com/p/695144724

  1. lora 大模型如何合并?
    https://blog.csdn.net/BIT_666/article/details/132065177
    参考:https://github.com/ymcui/Chinese-LLaMA-Alpaca-3/blob/main/scripts/merge_llama3_with_chinese_lora_low_mem.py
    1. 将1 个lora模型合并到base 模型中。
import torch
from peft import PeftModel
from transformers import AutoTokenizer, AutoModelForCausalLM

model_name_or_path="/home/Meta-Llama-3-8B-Instruct"
lora_path="/home/llama-3-chinese-8b-instruct-lora"
print(f"Loading the base model from {model_name_or_path}")
base = AutoModelForCausalLM.from_pretrained(  # 加载模型
    model_name_or_path, torch_dtype=torch.float16, low_cpu_mem_usage=True
)
tokenizer = AutoTokenizer.from_pretrained(model_name_or_path)         #此处未进行tokenizer的合并,
       # 具体见https://github.com/ymcui/Chinese-LLaMA-Alpaca-3/blob/main/scripts/merge_llama3_with_chinese_lora_low_mem.py

print(f"Loading the LoRA adapter from {lora_path}")

lora_model = PeftModel.from_pretrained(  # 加载lora模型
    base,
    lora_path,
    torch_dtype=torch.float16,
)

print("Applying the LoRA")
model = lora_model.merge_and_unload()  # 合并模型,
output_path="./merge_llama3_lora"
print(f"Saving the target model to {output_path}")  # 保存
model.save_pretrained(output_path)
tokenizer.save_pretrained(output_path)
from transformers import AutoTokenizer, AutoModelForCausalLM
import torch
model_name_or_path="./merge_llama3_lora"
print(f"Loading the base model from {model_name_or_path}")
model = AutoModelForCausalLM.from_pretrained(  # 加载模型
    model_name_or_path, torch_dtype=torch.float16, low_cpu_mem_usage=True
)
tokenizer = AutoTokenizer.from_pretrained(model_name_or_path)
model=model.cuda()

DEFAULT_SYSTEM_PROMPT = """You are a helpful assistant. 你是一个乐于助人的助手。"""
system_format='<|start_header_id|>system<|end_header_id|>\n\n{content}<|eot_id|>'
user_format='<|start_header_id|>user<|end_header_id|>\n\n{content}<|eot_id|><|start_header_id|>assistant<|end_header_id|>\n\n'
assistant_format='{content}<|eot_id|>'

def generate_prompt(instruction):
    return system_format.format(content=DEFAULT_SYSTEM_PROMPT) + user_format.format(content=instruction)
tokenizer.pad_token = tokenizer.eos_token
input_ids = tokenizer(generate_prompt("介绍一下中国"), return_tensors="pt",add_special_tokens=False).input_ids
if torch.cuda.is_available():
  input_ids = input_ids.cuda()
generate_input = {
    "input_ids":input_ids,
    "max_new_tokens":512,
    "do_sample":True,
    "top_k":50,
    "top_p":0.95,
    "temperature":0.3,
    "repetition_penalty":1.3,
    "eos_token_id":tokenizer.eos_token_id,
    "bos_token_id":tokenizer.bos_token_id,
    "pad_token_id":tokenizer.pad_token_id
}
generate_ids  = model.generate(**generate_input)
text = tokenizer.decode(generate_ids[0])
print(text)
  1. 将多个任务lora 模型合并。
from transformers import AutoConfig, AutoTokenizer, AutoModelForCausalLM, TextIteratorStreamer, GenerationConfig
from peft import PeftModel
 
# 载入预训练模型
tokenizer = AutoTokenizer.from_pretrained(base_model, use_fast=True, padding_side="left", **config_kwargs)
print("Tokenizer Load Success!")
config = AutoConfig.from_pretrained(base_model, **config_kwargs)
# Load and prepare pretrained models (without valuehead).
model = AutoModelForCausalLM.from_pretrained(
    base_model,
    config=config,
    torch_dtype=torch.float16,
    low_cpu_mem_usage=True,
    trust_remote_code=True,
    revision='main'
)
print('origin config =', model.config)
# 模型合并
ckpt_list = ["checkpoint-1000", "checkpoint-2000", "checkpoint-3000"]
for checkpoint in ckpt_list:
    print('Merge checkpoint: {}'.format(checkpoint))
    model = PeftModel.from_pretrained(model, os.path.join(lora_model, checkpoint))
    model = model.merge_and_unload()                #将每一个lora 模型合并
print('merge config =', model.config)
  1. lora 大模型如何编译,使用?
    8.1 未加载lora 模型编译。
CUDA_VISIBLE_DEVICES=0 python3 convert_checkpoint.py --model_dir /app/tensorrt_llm/examples/Meta-Llama-3-8B-Instruct \
            --output_dir ./tllm_checkpoint_1gpu_bf16 \
            --dtype bfloat16

CUDA_VISIBLE_DEVICES=0 python3 build.py --checkpoint_dir ./tllm_checkpoint_1gpu_bf16 \
            --output_dir ./tmp/llama/8B/trt_engines/bf16/1-gpu \
            --gpt_attention_plugin bfloat16 \
            --gemm_plugin bfloat16
trtllm-build 等价于build.py   build.py 为trtllm-build 指令形式。
CUDA_VISIBLE_DEVICES=0 trtllm-build --checkpoint_dir ./tllm_checkpoint_1gpu_bf16 \
            --output_dir ./tmp/llama/8B/trt_engines/bf16/1-gpu \
            --gpt_attention_plugin bfloat16 \
            --gemm_plugin bfloat16
python3  run.py --engine_dir=/app/tensorrt_llm/examples/TensorRT-LLM-0.8.0/examples/llama1/tmp/llama/8B/trt_engines/bf16/1-gpu --max_output_len 100 --tokenizer_dir /app/tensorrt_llm/examples/Meta-Llama-3-8B-Instruct --input_text "How do I count to nine in French?"

8.2 加载lora 文件编译。

CUDA_VISIBLE_DEVICES=0,1 python3 convert_checkpoint.py --model_dir /app/tensorrt_llm/examples/Meta-Llama-3-8B-Instruct \
                         --output_dir ./tllm_checkpoint_2gpu_lora \
                         --dtype bfloat16 \
                         --tp_size 1 \
                         --hf_lora_dir /app/tensorrt_llm/examples/llama-3-chinese-8b-instruct-lora

CUDA_VISIBLE_DEVICES=0,1 python3 build.py --checkpoint_dir ./tllm_checkpoint_2gpu_lora \
            --output_dir ./tmp/new_lora_13b/trt_engines/fp16/2-gpu/ \
            --gpt_attention_plugin bfloat16 \
            --gemm_plugin bfloat16 \
            --lora_plugin bfloat16 \
            --max_batch_size 1 \
            --max_input_len 512 \
            --max_output_len 50 \
            --use_fused_mlp
            
python3 ../run.py --engine_dir "./tmp/new_lora_13b/trt_engines/fp16/2-gpu/" \
              --max_output_len 50 \
              --tokenizer_dir "/app/tensorrt_llm/examples/llama-3-chinese-8b-instruct-lora" \
              --input_text "今天天气很好,我到公园的时后," \
              --lora_dir "/app/tensorrt_llm/examples/llama-3-chinese-8b-instruct-lora" \
              --lora_task_uids 0 \
              --no_add_special_tokens \
              --use_py_session
  1. 当采用float16时,编译时报类型转换错误,需要改成bfloat16.
  2. 遇到问题: lora_target_model 为null, 即convert_checkpoint.py 量化文件报错。原因是:tensorrt-llm 架构加载lora 文件为bin 类型的数据,而本人的lora 模型文件为safetensors类型的文件。因此本人对lora_manager.py 进行了修改,使文件能够加载该文件。在这里插入图片描述
  3. 模型量化与编译细节见代码讲解模块。

9 safetensors 、bin 数据类型 模型互相转换

from safetensors.torch import save_file,load_file
import torch
hf_lora_dir="/app/tensorrt_llm/examples/llama-3-chinese-8b-instruct-lora"
binpath=f"{hf_lora_dir}/adapter_model.bin"
safepath=f"{hf_lora_dir}/adapter_model.safetensors"
lora_weight=load_file(safepath)         #加载safetensors
torch.save(lora_weight,binpath)         #保存为bin
lora_weight1=torch.load(binpath)

keys=lora_weight.keys()
for key in keys:
    params1=lora_weight[key]
    params2=lora_weight1[key]
    if not torch.equal(params1,params2):
        print("两个模型不完全一致")

print("done!")
  1. 推理加速模型 tensorrRT-LLM、Vllm、TGI、fasterTransformer、BetterTransformer 的对比在这里插入图片描述
<think>嗯,用户现在问的是“怎么训练AI大模型?”这个问题。首先,我需要回想之前用户询问的是2025年如何通过AI赚钱,现在转向技术细节,可能用户想深入了解AI开发,或者考虑进入AI行业。 用户可能是创业者、开发者,或者对AI技术感兴趣的人。他们可能已经有了初步了解,想进一步知道如何实际操作,或者评估技术难度和资源需求。需要判断用户的背景,但可能不具备深度学习的高级知识,所以回答需要既专业又易懂。 接下来,我需要分解训练AI大模型的步骤。首先,得明确大模型的定义,比如参数规模、应用场景。然后从数据准备、模型架构、训练过程、优化技巧到部署应用,逐步讲解。每个部分要给出关键点,比如数据清洗、分布式训练、硬件需求等。 还要注意用户可能的隐藏需求。比如,他们可能关心成本问题,或者如何获取高质量数据,训练中的常见问题如何解决。此外,考虑到之前的回答提到了商业案例,可能需要结合训练模型的实际应用,说明如何将技术转化为商业价值。 需要确保回答结构清晰,分步骤说明,避免过于技术化的术语,但又要准确。比如,解释预训练和微调的区别,或者混合精度训练的好处。同时,可能用户对硬件资源有疑问,要提到GPU集群和云计算的选择。 另外,合规性和伦理问题也是训练大模型的重要部分,特别是数据隐私和模型偏见,这些在之前的回答中提到了合规布局,这里也需要强调,帮助用户全面了解。 最后,总结关键点,并提醒用户成功训练大模型的要素,比如数据质量、算力、算法优化和迭代能力。可能用户希望知道投入产出比,或者如何开始第一步,比如使用现有框架和云平台。</think>训练AI大模型是系统性工程,需要技术、算力和数据资源的深度整合。以下是关键步骤和核心技术要点: --- ### **一、训练前准备** 1. **明确目标与架构选择** - 确定模型用途(文本生成/图像识别/多模态等) - 选择基础架构:Transformer(如GPT、BERT)、Diffusion(如Stable Diffusion)、MoE(混合专家)等 - 参数量级规划:70亿参数(消费级显卡可微调)到万亿级参数(需超算集群) 2. **数据工程(决定模型能力的核心)** - **数据采集**:构建多源数据集(文本需1-10TB级,如The Pile数据集) - 通用语料:网页爬取(Common Crawl)、书籍、学术论文 - 领域数据:医疗记录、法律文书、代码仓库(如GitHub) - **数据清洗**: - 去重(MinHash/LSH算法) - 质量过滤(语言检测、内容毒性评分) - 隐私脱敏(NER识别+替换敏感信息) 3. **基础设施搭建** - **硬件配置**: - 单机多卡:8×A100/A800 GPU(显存需≥80GB/卡) - 分布式集群:使用NVIDIA DGX SuperPOD或云服务(AWS EC2 P4d实例) - **软件框架**: - 深度学习库:PyTorch(动态图优势)+DeepSpeed/Megatron-LM(分布式训练) - 数据处理:Apache Spark/Dask加速预处理 --- ### **二、核心训练阶段** 1. **预训练(Pretraining)** - **训练目标**: - 语言模型:掩码预测(BERT)、自回归预测(GPT) - 多模态:CLIP式的对比学习 - **关键技术**: - 3D并行训练:数据并行+流水线并行+张量并行 - 混合精度训练:FP16/FP8量化+动态损失缩放 - 梯度检查点(Gradient Checkpointing):减少显存占用 2. **指令微调(Alignment)** - **方法对比**: | 方法 | 数据需求 | 效果特点 | |--------------|------------|------------------------| | 监督微调(SFT) | 1万-10万条 | 基础指令跟随 | | RLHF | 人工标注 | 价值观对齐 | | DPO | 偏好数据 | 更稳定收敛 | - **工具链**: - TRL(Transformer Reinforcement Learning) - Axolotl(高效微调框架) 3. **领域适配(可选)** - 持续预训练:注入垂直领域数据(如PubMed论文) - 适配器训练:LoRA/QLoRA低秩适配,冻结原参数仅微调新增模块 --- ### **三、优化与评估** 1. **训练加速技巧** - **Flash Attention**:优化GPU显存访问模式,提速30% - **ZeRO优化**:DeepSpeed的显存优化技术,支持万亿参数训练 - **课程学习**:逐步增加数据难度(如从短文本到长文档) 2. **评估体系** - **通用能力**: - 语言理解:GLUE/SuperCLUE榜单 - 推理能力:GSM8K数学题、代码生成(HumanEval) - **安全评估**: - 偏见检测:BOLD数据集 - 对抗测试:构造诱导性提问检测漏洞 --- ### **四、部署与应用** 1. **模型压缩** - 量化:GPTQ/AWQ算法实现4bit量化 - 蒸馏:将大模型能力迁移到小模型(如DistilBERT) 2. **推理优化** - 使用vLLM/TensorRT-LLM加速推理 - 批处理(Batching)提升吞吐量 3. **持续迭代** - 数据飞轮:收集用户反馈数据优化模型 - 安全监控:实时检测生成内容合规性 --- ### **五、典型挑战与解决方案** | 挑战类型 | 解决思路 | |------------------|-----------------------------------| | 显存不足 | 梯度累积+模型并行 | | 训练不稳定 | 学习率warmup+梯度裁剪 | | 多模态对齐 | 对比学习+跨模态注意力机制 | | 长文本处理 | RoPE位置编码+滑动窗口注意力 | --- ### **入门建议** 1. **从小模型入手**:先尝试微调LLaMA-2-7B等开源模型 2. **利用云平台**:Hugging Face Spaces/Google Colab Pro可低成本实验 3. **关注技术演进**:MoE架构、状态空间模型(如Mamba)等新方向 训练成本参考:1750亿参数的GPT-3单次训练需460万美元(V100 GPU集群),但通过QLoRA微调可使7B参数模型在24GB显存显卡运行。建议优先考虑垂直领域的小而精模型,降低商业化门槛。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值