使用ktransformers docker部署deepseek-r1的笔记
编译和安装
这里我们使用一个 Docker 镜像来执行编译生成 whl 包,可以供后续其他镜像使用.
- 下载源码:
git clone [email protected]:kvcache-ai/ktransformers.git
cd ktransformers
git submodule update --init --recursive
- 然后使用一个 Docker 镜像来编译:
docker run -it --rm --gpus all -v ./:/data --shm-size 8G pytorch/pytorch:2.5.1-cuda12.1-cudnn8-devel bash
cd /data
# 安装依赖
pip config set global.index-url https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple
pip install build cpufeature
# 编译生成 whl 文件,这里的 TORCH_CUDA_ARCH_LIST 根据自己的显卡来
# 可以参考 https://arnon.dk/matching-sm-architectures-arch-and-gencode-for-various-nvidia-cards 来确定
LANG=en_US.UTF-8 \
TORCH_CUDA_ARCH_LIST="8.6" \
KTRANSFORMERS_FORCE_BUILD=TRUE \
python -m build --wheel --no-isolation
# 编译完毕之后会在 dist 目录下得到一个 whl 文件
构建 Docker 镜像
这里构建 Docker 镜像可以使用 Dockerfile.local
.替换其中的 <WHL-URL>
为实际的 whl url.这里我们可以使用以下命令来快速启动一个 HTTP server:
# 在上一步生成的 dist 目录下执行
python -m http.server 8083
然后打开浏览器复制拿到 whl 文件的 URL 即可.构建 Docker 镜像的命令为:
docker build -t ktransformers:$(date -uI) --progress plain -f Dockerfile.local .
这里编译和构建步骤分开,且写得这么啰嗦,是想要让最终生成的 Docker 镜像尽可能的小.如果不太介意这个的话,可以直接将两个步骤合并.直接在构建镜像的时候,在容器内部下载源码编译最后直接安装.
Dockerfile.local
内容如下:
FROM pytorch/pytorch:2.5.1-cuda12.1-cudnn8-devel
RUN pip config set global.index-url https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple
RUN pip install --no-cache-dir \
<WHL-URL>
RUN pip --no-cache-dir install \
flash-attn
RUN pip install \
-i https://flashinfer.ai/whl/cu121/torch2.5 \
flashinfer-python
这里 flash-attn 和 flashinfer-python 也可以从网上下载先下载好 whl 文件,方便多次尝试构建的时候提升安装速度.
启动服务
直接使用 docker-compose.yaml
启动即可,特别注意我们设置了环境变量 LD_PRELOAD
来解决 GLIBCXX_3.4.30
符号找不到的问题.修改文件中的镜像和对应的模型路径即可,然后执行:
docker compose up -d
注意:
- DeepSeek-R1-Q4_K_M 需要大约 14G 显存和 382G 内存,内存不足即使可以启动,但是实质上无法工作.
- DeepSeek-R1-Q4_K_M 需要完整读取,受限于磁盘 IO 和内存带宽,可能需要耗时较长时间才能让服务启动成功,需要耐心等待.
- DeepSeek-V2-Lite-Chat-GGUF 可以用于简单测试,这个模型比较小,很快可以启动起来.
完整的 docker-compose.yaml
如下:
name: ktransformers-deepseek
services:
gptweb:
image: yidadaa/chatgpt-next-web:latest
restart: always
ports:
- "8081:3000"
environment:
- BASE_URL=http://ktransformers:8080
- PORT=3000
- CUSTOM_MODELS=-all,+DeepSeek-R1-Q4_K_M
# - CUSTOM_MODELS=-all,+DeepSeek-V2-Lite-Chat-GGUF
ktransformers:
image: ktransformers:2025-02-26
restart: always
environment:
- LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libstdc++.so.6
volumes:
- ./data/deepseek-ai/DeepSeek-R1:/data/deepseek-ai/DeepSeek-R1:ro
- ./data/DeepSeek-R1-Q4_K_M:/data/DeepSeek-R1-Q4_K_M:ro
# - ./data/deepseek-ai/DeepSeek-V2-Lite-Chat-GGUF:/data/deepseek-ai/DeepSeek-V2-Lite-Chat-GGUF:ro
# - ./data/DeepSeek-V2-Lite-Chat-GGUF:/data/DeepSeek-V2-Lite-Chat-GGUF:ro
expose:
- "8080"
ports:
- "8082:8080"
entrypoint: ["/opt/conda/bin/ktransformers", "--host", "0.0.0.0", "--port", "8080", "--model_path", "/data/deepseek-ai/DeepSeek-R1", "--gguf_path", "/data/DeepSeek-R1-Q4_K_M", "--cpu_infer", "8", "--max_new_tokens", "8192", "--model_name", "DeepSeek-R1-Q4_K_M"]
# entrypoint: ["/opt/conda/bin/ktransformers", "--host", "0.0.0.0", "--port", "8080", "--model_path", "/data/deepseek-ai/DeepSeek-V2-Lite-Chat", "--gguf_path", "/data/DeepSeek-V2-Lite-Chat-GGUF", "--cpu_infer", "8", "--max_new_tokens", "8192", "--model_name", "DeepSeek-V2-Lite-Chat-GGUF"]
deploy:
resources:
reservations:
devices:
- driver: nvidia
device_ids: ["0"]
capabilities: [gpu]
服务启动好了之后,即可通过 nextchat 页面交互.
模型下载
# 建议使用 hf-mirror 来下载
export HF_ENDPOINT=https://hf-mirror.com
# 下载配置,saftetensors 为模型文件,不需要下载
./hfd.sh deepseek-ai/DeepSeek-R1 --exclude "*.safetensors"
./hfd.sh deepseek-ai/DeepSeek-V2-Lite-Chat --exclude "*.safetensors"
# 下载 GGUF 模型
./hfd.sh mradermacher/DeepSeek-V2-Lite-Chat-GGUF
# 我们只需要 DeepSeek-R1-Q4_K_M
./hfd.sh unsloth/DeepSeek-R1-GGUF --include "DeepSeek-R1-Q4_K_M"
下载需要一定的时间,需要耐心等待.