【实践总结】vllm多卡推理

环境:2* A100 40G

模型:qwen2-7B

服务:Flask + gunicorn

单卡推理, gpu_memory_utilization=0.5, 单卡推理耗时5s:

llm = LLM(model='/root/autodl-tmp/model/qwen/Qwen2-7B-Instruct', tokenizer_mode="auto", dtype=torch.bfloat16, gpu_memory_utilization=0.7, enforce_eager=True)

单卡占用内存情况

多卡推理,设置tensor_parallel_size=2,

llm = LLM(model='/root/autodl-tmp/model/qwen/Qwen2-7B-Instruct', tokenizer_mode="auto", dtype=torch.bfloat16, gpu_memory_utilization=0.7, enforce_eager=True, tensor_parallel_size=2)

多卡占用内存

多卡推理结果, 推理耗时11s

为什么多卡推理耗时更长了😵‍💫

### 加速深度学习训练或推理 #### 使用 `torch.distributed` 实现训练 PyTorch 的 `torch.distributed` 包提供了强大的工具用于实现训练。通过该包,能够有效管理和协调分布在不同设备上的进程,从而提高训练速度。 为了初始化分布式环境,在启动程序前需设置一些环境变量,如 MASTER_ADDR 和 MASTER_PORT 来指定主节点地址和端口;WORLD_SIZE 表示参与训练的总进程数;RANK 则定义当前进程在整个集群中的唯一编号[^1]。 ```bash export MASTER_ADDR="localhost" export MASTER_PORT=12355 export WORLD_SIZE=8 # 假设有两台服务器每台四张GPU ``` 接着可以在 Python 脚本里调用 `init_process_group()` 方法完成组网配置: ```python import torch.distributed as dist dist.init_process_group(backend='nccl', init_method=f'tcp://{MASTER_ADDR}:{MASTER_PORT}', world_size=WORLD_SIZE, rank=RANK) ``` 对于模型并行化处理部分,则可通过 DataParallel 或 DistributedDataParallel 类来分配任务给各个 GPU 设备实例执行。DistributedDataParallel 更适合于大型网络结构因为其性能更优且占用内存较少。 ```python model = Model() model = nn.parallel.DistributedDataParallel(model.cuda(), device_ids=[local_rank], output_device=local_rank) ``` #### Accelerate 库简化分布式训练流程 除了官方提供的解决方案外,第三方库也极大地方便了开发者实施复杂的分布式策略。例如 Hugging Face 开发的 **Accelerate** 工具可以帮助快速构建高效的分布式训练脚本而无需深入了解底层细节[^2]。 只需几行简单的命令就可以轻松切换不同的硬件平台(CPU/GPU/TPU),并且自动调整 batch size 等参数以适应可用资源数量变化情况。这使得即使是初学者也能迅速掌握如何高效利用现有计算能力来进行大规模数据集的学习任务。 #### Ray 和 VLLM 构建高性能推理系统 当涉及到实际应用时,不仅关注训练阶段的表现同样也要重视推理环节的速度与稳定性。为此可借助 **Ray** 及专为大模型设计优化过的 **VLLM** 推理引擎共同打造一套完整的生产级服务架构[^3]。 首先按照文档指引准备好所需的依赖项之后,编写一段简短的服务代码即可开启基于 RESTful API 形式的在线预测接口。这样不仅可以满足实时响应需求还能方便后续维护升级操作。 ```python from fastapi import FastAPI import uvicorn from transformers import AutoModelForCausalLM, AutoTokenizer import ray from vllm import LLMEngine app = FastAPI() @app.post("/predict/") async def predict(text: str): result = await engine.generate([text]) return {"generated_text": result} if __name__ == "__main__": tokenizer = AutoTokenizer.from_pretrained("your-model-name") model = AutoModelForCausalLM.from_pretrained("your-model-name").half().cuda() @ray.remote(num_gpus=1) class Worker: def __init__(self): self.engine = LLMEngine(model=model, tokenizer=tokenizer) workers = [Worker.remote() for _ in range(ray.available_resources()['GPU'])] engine = workers[0] uvicorn.run(app, host="0.0.0.0", port=8000) ``` 上述方案展示了从理论到实践的一系列措施用来解决环境下加速深度学习项目开发过程中遇到的各种挑战。无论是追求极致效能还是便捷易用性都能找到合适的技术选型组合方式达成目标。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值