沦嘻亟 发表于 2025-6-1 18:24:42

生产环境 K8S + Deepseek 实现大模型部署 和 容器调度(图解+史上最全)

本文 的 原文 地址

      本文 的 原文 地址   
尼恩:LLM大模型学习圣经PDF的起源

在40岁老架构师 尼恩的读者交流群(50+)中,经常性的指导小伙伴们改造简历。
经过尼恩的改造之后,很多小伙伴拿到了一线互联网企业如得物、阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试机会,拿到了大厂机会。
然而,其中一个成功案例,是一个9年经验 网易的小伙伴,当时拿到了一个年薪近80W的大模型架构offer,逆涨50%,那是在去年2023年的 5月。

[*]惊天大逆袭:8年小伙20天时间提75W年薪offer,逆涨50%,秘诀在这
不到1年,小伙伴也在团队站稳了脚跟,成为了名副其实的大模型 应用 架构师。接下来,尼恩架构团队,通过 梳理一个《LLM大模型学习圣经》 帮助更多的人做LLM架构,拿到年薪100W,这个内容体系包括下面的内容:

[*]《Python学习圣经:从0到1精通Python,打好AI基础》
[*]《LLM大模型学习圣经:从0到1吃透Transformer技术底座》
[*]《LangChain学习圣经:从0到1精通LLM大模型应用开发的基础框架》
[*]《LLM大模型学习圣经:从0到1精通RAG架构,基于LLM+RAG构建生产级企业知识库》
[*]《SpringCloud + Python 混合微服务架构,打造AI分布式业务应用的技术底层》
[*]《LLM大模型学习圣经:从0到1吃透大模型的顶级架构》
[*]《LLM 智能体 学习圣经:从0到1吃透 LLM 智能体 的架构 与实操》
[*]《LLM 智能体 学习圣经:从0到1吃透 LLM 智能体 的 中台架构 与实操》
[*]《Spring 集成 DeepSeek 的 3大方法,史上最全》
[*]《基于Dify +Ollama+ Qwen2 完成本地 LLM 大模型应用实战》
[*]《Spring AI 学习圣经和配套视频   》
[*]《Text2SQL圣经:从0到1精通Text2Sql(Chat2Sql)的原理,以及Text2Sql开源项目的使用》
[*]《AI部署架构:A100、H100、A800、H800、H20的差异以及如何选型?开发、测试、生产环境如何进行部署架构?》
以上学习圣经 的配套视频, 2025年 5月份之前发布。
一、vllm 基础知识:

(一)、核心功能与技术特性

vLLM 是专为大型语言模型(LLM)推理和部署设计的高性能开源框架,由社区维护并广泛应用于生成式 AI 的优化场景。
vllm 核心功能与技术特性

‌1 高效推理与内存管理‌
vllm 采用 ‌PagedAttention‌ 技术优化注意力键值的内存分配,减少资源浪费,支持长上下文窗口处理‌。
结合连续批处理(Continuous Batching)和 CUDA/HIP 图加速,显著提升吞吐量‌ 。
2 分布式与量化支持‌

[*]支持 ‌张量并行‌ 和流水线并行,实现多 GPU/TPU 分布式推理‌ 。
[*]提供多种量化方案(如 GPTQ、INT4、FP8),降低计算资源需求‌ 。
‌3兼容性与扩展性‌
无缝集成 Hugging Face 模型生态,支持流式输出和 OpenAI API 兼容的服务器部署,适配 NVIDIA、AMD、Intel 等多种硬件‌ 。
vllm的性能优势


[*]‌吞吐量对比‌:
在相同延迟下,vLLM 的吞吐量较 HuggingFace Transformers 高 8.5–15 倍,较文本生成推理框架(TGI)高 3.3–3.5 倍‌ 。
[*]‌资源利用率‌:
通过动态内存管理和分页技术,提升 GPU 利用率,降低中小型服务器或边缘设备的部署门槛‌ 。
(二)、vllm 安装和启动

github

https://github.com/vllm-project/vllm接下来,看看 vLLM在线文档。
vLLM在线文档

https://vllm.hyper.ai/docs/接下来,看看vLLM安装。
vLLM安装

vLLM 是一个 Python 库,包含预编译的 C++ 和 CUDA (12.1) 二进制文件。
环境

[*]操作系统:Linux
[*]Python:3.8 - 3.12
[*]GPU:计算能力 7.0 或更高(例如 V100、T4、RTX20xx、A100、L4、H100 等)
pip安装
//(推荐)创建一个新的 conda 环境。

conda create -n myenv python=3.10 -y
conda activate myenv

// 安装带有 CUDA 12.1 的 vLLM。
pip install vllm建议使用全新的 conda 环境安装 vLLM。
如果您有不同的 CUDA 版本或者想要使用现有的 PyTorch 安装,则需要从源代码构建 vLLM。
vLLM启动

使用python 启动
python3 -m vllm.entrypoints.openai.api_server --model /root/autodl-tmp/models/Qwen-7b-instruct --host 0.0.0.0 --port 8000 --dtype auto --max-num-seqs 32 --max-model-len 4096 --tensor-parallel-size 1 --trust-remote-code参数说明
--model                                 #指定要加载的模型路径
--dtyp                                         #指定模型权重的数据类型,auto 表示框架会根据硬件自动选择合适的数据类型(例如 FP16 或 BF16)
--max-num-seqs                         #设置最大并发序列数,服务器同时处理的最大请求数
--max-model-len                 #设置模型支持的最大上下文长度(token 数量)
--tensor-parallel-size         #1表示不使用张量并行,模型将在单个 GPU 上运行
--trust-remote-code                #允许加载远程代码或自定义模型代码
使用vllm命令启动
vllm serve /root/autodl-tmp/models/Qwen-7b-instruct --max-model-len 4096 --tensor-parallel-size 1启动命令参考在线文档
https://vllm.hyper.ai/docs/getting-started/quickstart
(三)、使用openAI调用示例

第一个示例:vllm离线推理

import os
from transformers import AutoTokenizer
from vllm import LLM, SamplingParams

// 模型路径
model_dir = '/root/autodl-tmp/models/Qwen-7b-instruct'

// 加载tokenizer
tokenizer = AutoTokenizer.from_pretrained(
        model_dir,
        local_files_only=True,
)
// Prompt
messages = [
        {'role':'system','content':'You are a medical assistant'},
        {'role':'user','content':'最近经常熬夜,与之前生物钟颠倒,而且最近还肠胃发炎了不过已经好多了最近色斑越长越多'}
]

// 将messages转换为text
text = tokenizer.apply_chat_template(
        messages,
        tokenize=False,
        add_generation_prompt=True,
)
// 初始化LLM
llm = LLM(
        model = model_dir,
        tensor_parallel_size=1,
    gpu_memory_utilization=0.9,
    max_model_len=4096
)

// 设置采样参数
sampling_params = SamplingParams(temperature=1,top_p=0.8,max_tokens=512)

// 生成输出
outputs = llm.generate(,sampling_params)

// 打印输出
for output in outputs:
        prompt = output.prompt
        generated_text = output.outputs.text
       
        print(f"Prompt: {prompt!r}, LLM output:{generated_text!r}")接下来,看看第二个示例。
第二个示例:OpenAI单一对话

// 注意:请先安装 openai
// pip install openai
from openai import OpenAI

// 设置 OpenAI API 密钥和 API 基础地址
openai_api_key = "EMPTY"# 请替换为您的 API 密钥
openai_api_base = "http://localhost:8000/v1"# 本地服务地址

client = OpenAI(base_url=openai_api_base,api_key=openai_api_key)

// Completion API 调用
completion = client.chat.completions.create(
    model="/root/autodl-tmp/models/Qwen-7b-instruct",
    messages=[{"role":"user","content":"最近经常熬夜,与之前生物钟颠倒,而且最近还肠胃发炎了不过已经好多了最近色斑越长越多"}])

print(completion.choices.message.content)接下来,看看第3个示例。
第三个示例:OpenAI多轮对话

from openai import OpenAI
import os
from dotenv import load_dotenv
import logging

// 配置日志
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)

class ChatSession:
    def __init__(self):
      # 加载环境变量
      load_dotenv()
      self.api_key = os.getenv("OPENAI_API_KEY", "EMPTY")
      self.api_base = os.getenv("OPENAI_API_BASE", "http://localhost:8000/v1")
      self.model = os.getenv("MODEL_PATH", "/root/autodl-tmp/models/Qwen-7b-instruct")
      self.client = OpenAI(base_url=self.api_base, api_key=self.api_key)
      self.chat_history = []

    def add_message(self, role, content):
      """添加消息到历史记录"""
      self.chat_history.append({"role": role, "content": content})

    def get_assistant_response(self, temperature=0.7):
      """获取助手响应"""
      try:
            response = self.client.chat.completions.create(
                model=self.model,
                messages=self.chat_history,
                temperature=temperature
            )
            return response.choices.message.content
      except Exception as e:
            logger.error(f"获取响应时发生错误: {str(e)}")
            return f"抱歉,发生了错误: {str(e)}"

    def run(self):
      """运行聊天会话"""
      logger.info("开始聊天会话")
      print("欢迎使用聊天助手!输入 'quit' 退出。")
      
      while True:
            try:
                user_input = input("n用户: ").strip()
                if user_input.lower() == "quit":
                  print("再见!")
                  break
               
                if not user_input:
                  print("请输入有效内容")
                  continue

                self.add_message("user", user_input)
                assistant_response = self.get_assistant_response()
                print(f"助手: {assistant_response}")
                self.add_message("assistant", assistant_response)
               
            except KeyboardInterrupt:
                print("n程序被用户中断")
                break
            except Exception as e:
                logger.error(f"运行时发生错误: {str(e)}")
                print("发生了错误,请重试")

def main():
    try:
      chat_session = ChatSession()
      chat_session.run()
    except Exception as e:
      logger.error(f"程序启动失败: {str(e)}")

if __name__ == "__main__":
    main()接下来,看看k8s+vllm 安装 Deepseek大模型 和 容器调度。
二、k8s+vllm 安装 Deepseek大模型 和 容器调度

(一)、vLLM 在 Kubernetes 中的安装部署‌

‌1Helm Chart 部署‌

添加 vLLM Production Stack 的 Helm 仓库并安装:
helm repo add vllm-prod https://vllm-prod.github.io/charts
helm install vllm vllm-prod/vllm --namespace vllm --create-namespace支持通过values.yaml 自定义模型路径、GPU 驱动版本等参数‌ 。
‌2Kubernetes 基础环境配置‌

确保集群节点已安装 NVIDIA GPU 驱动及 nvidia-docker 运行时,并配置 device-plugin 插件以支持 GPU 资源调度‌。
私有镜像仓库配置(如 Harbor),需同步证书至 /etc/docker/certs.d/ 目录并完成登录验证‌。
3分布式 KV 缓存配置‌

启用 vLLM 的分布式 KV 缓存共享功能,通过 LMCache 技术减少内存冗余,需在部署时指定共享存储后端(如 Redis 或 Alluxio)‌。
(二‌)、Kubernetes GPU 环境配置指南‌

‌1:NVIDIA GPU 驱动安装‌

环境检查与驱动安装
‌执行以下命令确认系统内核版本和 GPU 型号:
uname -r          # 查看内核版本
lspci | grep -i nvidia# 识别 GPU 型号禁用系统默认的 Nouveau 驱动,避免与 NVIDIA 官方驱动冲突:
echo "blacklist nouveau" | sudo tee /etc/modprobe.d/blacklist-nouveau.conf
sudo update-initramfs -u# 更新 initramfs安装 NVIDIA 官方驱动(建议选择与 H20 GPU 兼容的版本):
sudo apt-get install -y nvidia-driver-535# 示例版本号需按实际调整
sudo reboot# 重启生效验证驱动安装:
nvidia-smi输出 GPU 状态信息‌。
2、nvidia-docker 运行时配置‌

安装 NVIDIA Container Toolkit.‌
NVIDIA Container Toolkit‌ 是 NVIDIA 官方提供的容器运行时扩展工具集,‌
核心作用是将宿主机的 GPU 驱动能力注入容器‌,使得容器内应用可直接调用 GPU 计算资源(如 CUDA 库、cuDNN 等),‌实现容器化环境中 GPU 资源的透明化调用‌。

添加 NVIDIA 容器工具包仓库并安装:
distribution=$(. /etc/os-release; echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list

sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit3、配置 Docker 默认运行时:

sudo tee /etc/docker/daemon.json <<EOF
{
"runtimes": {
    "nvidia": {
      "path": "/usr/bin/nvidia-container-runtime",
      "runtimeArgs": []
    }
},
"default-runtime": "nvidia"
}
EOF
sudo systemctl restart docker# 重启 Docker(八)软件与环境配置

系统环境

组件版本/说明操作系统Ubuntu 22.04 LTS(所有节点)CUDACUDA 12.1(所有节点需版本一致)cuDNNcuDNN 8.9.5(与 CUDA 版本匹配)NCCLNCCL 2.17(优化多节点通信)PyTorchPyTorch 2.2.0(支持分布式训练和推理)vLLMvLLM 0.7.4(最新稳定版)RayRay 2.8.0(分布式集群管理)vllM集群配置

vllm给我提供了一个集群部署的脚本,可以用这个脚本
docker run --rm nvidia/cuda:12.2.0-base-ubuntu22.04 nvidia-smi可以用ray框架,两个本质上是一样的
kubectl apply -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/v0.14.1/nvidia-device-plugin.yml启动命令 如下:
启动命令(在头节点执行)

注意, 在头节点执行
kubectl describe node <node-name> | grep nvidia.com/gpuRDMA优化配置:

apiVersion: v1
kind: Pod
metadata:
name: gpu-test
spec:
containers:
- name: cuda-container
    image: nvidia/cuda:12.2.0-base-ubuntu22.04
    command: ["sleep", "infinity"]
    resources:
      limits:
      nvidia.com/gpu: 1(九)、 部署步骤

安装依赖

// 下载 DeepSeek-14B 的 INT4 量化版本(显存需求降至 12GB/卡)
git lfs install
git clone https://huggingface.co/deepseek-ai/DeepSeek-14B-4bit /mnt/nvme/deepseek-14b-4bit启动 vLLM 服务

//PVC 配置文件 (deepseek-pvc.yaml)
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: deepseek-pvc
spec:
storageClassName: ssd
accessModes:
    - ReadWriteOnce
resources:
    requests:
      storage: 200Gi# 推荐 NVMe SSD 存储卷‌:ml-citation{ref="4,5" data="citationList"}监控工具


[*]NVIDIA Nsight:监控 GPU 利用率和显存占用。
[*]Ray Dashboard:查看集群任务分配和资源利用率。
[*]Prometheus + Grafana:全局监控 QPS、延迟和错误率。
性能测试

// Dockerfile(基于 vLLM 官方镜像)
FROM vllm/vllm-openai:latest
COPY --from=deepseek-ai/DeepSeek-14B-4bit /model /app/model
RUN pip install --no-cache-dir deepseek-ai==0.4.2# 安装模型依赖库‌ 参数解释:

docker build -t registry.example.com/deepseek-14b:v1 .
docker push registry.example.com/deepseek-14b:v1总结

按照如下步骤逐步的验证
(1) 单卡性能调优 → 2. 单节点扩展 → 3. 多机联合测试 → 4. 全集群压力测试。
遇到问题,找老架构师取经

借助此文,尼恩给解密了一个高薪的 秘诀,大家可以 放手一试。保证屡试不爽,涨薪100%-200%。
后面,尼恩java面试宝典回录成视频, 给大家打造一套进大厂的塔尖视频。
通过这个问题的深度回答,可以充分展示一下大家雄厚的 “技术肌肉”,让面试官爱到 “不能自已、口水直流”,然后实现”offer直提”。
在面试之前,建议大家系统化的刷一波 5000页《尼恩Java面试宝典PDF》,里边有大量的大厂真题、面试难题、架构难题。
很多小伙伴刷完后, 吊打面试官, 大厂横着走。
在刷题过程中,如果有啥问题,大家可以来 找 40岁老架构师尼恩交流。
另外,如果没有面试机会,可以找尼恩来改简历、做帮扶。
遇到职业难题,找老架构取经, 可以省去太多的折腾,省去太多的弯路。
尼恩指导了大量的小伙伴上岸,前段时间,刚指导一个40岁+被裁小伙伴,拿到了一个年薪100W的offer。
狠狠卷,实现 “offer自由” 很容易的, 前段时间一个武汉的跟着尼恩卷了2年的小伙伴, 在极度严寒/痛苦被裁的环境下, offer拿到手软, 实现真正的 “offer自由” 。

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: 生产环境 K8S + Deepseek 实现大模型部署 和 容器调度(图解+史上最全)