From 3c3de6e210e4c5656da5ecf9e07378fd45cbd1af Mon Sep 17 00:00:00 2001 From: craneyuan <1609268+craneyuan@user.noreply.gitee.com> Date: Thu, 7 May 2026 10:03:57 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=20TensorRT-LLM=201.2?= =?UTF-8?q?.0=20=E5=AE=B9=E5=99=A8=E9=95=9C=E5=83=8F=E9=80=82=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 基于 OpenCloudOS 9 CUDA 12.8 基础镜像,适配 TensorRT-LLM GPU 推理框架, 包含 Dockerfile、README、build.conf 及 test.sh 验证脚本。 --- frameworks/tensorrt-llm/1.2.0/Dockerfile | 59 ++++++++++++++++++ frameworks/tensorrt-llm/1.2.0/README.md | 54 ++++++++++++++++ frameworks/tensorrt-llm/1.2.0/build.conf | 4 ++ frameworks/tensorrt-llm/1.2.0/test.sh | 52 +++++++++++++++ frameworks/tensorrt-llm/1.2.0/test_result.png | Bin 0 -> 30359 bytes 5 files changed, 169 insertions(+) create mode 100644 frameworks/tensorrt-llm/1.2.0/Dockerfile create mode 100644 frameworks/tensorrt-llm/1.2.0/README.md create mode 100644 frameworks/tensorrt-llm/1.2.0/build.conf create mode 100755 frameworks/tensorrt-llm/1.2.0/test.sh create mode 100644 frameworks/tensorrt-llm/1.2.0/test_result.png diff --git a/frameworks/tensorrt-llm/1.2.0/Dockerfile b/frameworks/tensorrt-llm/1.2.0/Dockerfile new file mode 100644 index 0000000..2e5b77d --- /dev/null +++ b/frameworks/tensorrt-llm/1.2.0/Dockerfile @@ -0,0 +1,59 @@ +# syntax=docker/dockerfile:1 + +FROM opencloudos/opencloudos9-cuda-devel:12.8 + +LABEL maintainer="OpenCloudOS AI Community" +LABEL org.opencontainers.image.source="https://gitee.com/OpenCloudOS/ai-agent-container" +LABEL org.opencontainers.image.description="TensorRT-LLM 1.2.0 (GPU) on OpenCloudOS 9" + +# Install system dependencies +RUN --mount=type=cache,target=/var/cache/dnf \ + dnf install -y \ + python3.12 \ + python3.12-devel \ + openmpi \ + openmpi-devel \ + && dnf clean all + +# Set environment variables +ENV NVIDIA_VISIBLE_DEVICES=all +ENV PATH=/usr/lib64/openmpi/bin:$PATH +ENV LD_LIBRARY_PATH=/usr/lib64:/usr/lib64/cuda-compat-12-8:/usr/lib64/openmpi/lib:/usr/lib/python3.12/site-packages/nvidia/nvshmem/lib:/usr/lib64/cuda:/usr/lib64/cuda/lib64:/usr/local/cuda/lib64 + +# Configure pip: parallel downloads + prefer pre-built wheels +ENV PIP_CONCURRENT_DOWNLOADS=5 + +# Install pip for python3.12, then install tensorrt-llm from NVIDIA PyPI +RUN python3.12 -m ensurepip --upgrade \ + && python3.12 -m pip install --no-cache-dir --upgrade pip setuptools wheel + +RUN --mount=type=cache,target=/root/.cache/pip \ + for i in 1 2 3; do \ + python3.12 -m pip install --prefer-binary \ + nvidia-cublas \ + torch \ + tensorrt_llm==1.2.0 \ + --extra-index-url https://pypi.nvidia.com/ \ + && break || (echo "pip install attempt $i failed, retrying in 10s..." && sleep 10); \ + done; \ + python3.12 -m pip show tensorrt_llm > /dev/null || { echo "ERROR: tensorrt_llm not installed after 3 attempts"; exit 1; } + +# Register nvidia pip package libraries (CUDA 13 runtime libs from pip) +RUN touch /etc/ld.so.conf.d/nvidia-pip.conf \ + && for dir in $(find / -path "*/nvidia/*/lib" -type d 2>/dev/null); do \ + echo "$dir" >> /etc/ld.so.conf.d/nvidia-pip.conf; \ + done \ + && cat /etc/ld.so.conf.d/nvidia-pip.conf \ + && ldconfig + +# Fix: OpenCloudOS Python reports version "3.12.12+" which breaks packaging.version.parse +RUN DATASETS_CFG="$(python3.12 -c 'import importlib.util as u; s=u.find_spec("datasets"); print(s.submodule_search_locations[0]+"/config.py") if s else ""')" \ + && if [ -n "$DATASETS_CFG" ]; then \ + sed -i "s/platform.python_version()/platform.python_version().split('+')[0]/" "$DATASETS_CFG"; \ + else \ + echo "datasets not installed, skipping version fix"; \ + fi + +RUN echo $(date +"%Y-%m-%dT%H:%M:%S%z") > /opencloudos_build_date.txt + +CMD ["python3.12"] diff --git a/frameworks/tensorrt-llm/1.2.0/README.md b/frameworks/tensorrt-llm/1.2.0/README.md new file mode 100644 index 0000000..cd13a63 --- /dev/null +++ b/frameworks/tensorrt-llm/1.2.0/README.md @@ -0,0 +1,54 @@ +# TensorRT-LLM 1.2.0 on OpenCloudOS 9 + +## 基本信息 +- **框架版本**:1.2.0 +- **基础镜像**:opencloudos/opencloudos9-cuda-devel:12.8 +- **Python 版本**:3.12 +- **CUDA 版本**:12.8(运行时依赖 CUDA 13.x 库由 pip 自动安装) + +## 构建 + +```bash +docker build -t oc9-tensorrtllm:1.2.0 . +``` + +## 使用示例 + +### 验证安装 + +```bash +docker run --rm --gpus all oc9-tensorrtllm:1.2.0 \ + python3 -c "import tensorrt_llm; print(tensorrt_llm.__version__)" +``` + +### 启动推理服务 + +```bash +# 1. 下载模型权重 +sudo mkdir -p /models +sudo git clone https://www.modelscope.cn/Qwen/Qwen2.5-7B-Instruct.git /models/Qwen2.5-7B-Instruct + +# 2. 启动容器 +docker run -itd --name tensorrt_serving \ + --gpus all \ + -p 8000:8000 \ + -v /models/Qwen2.5-7B-Instruct:/models/Qwen2.5-7B-Instruct \ + oc9-tensorrtllm:1.2.0 tail -f /dev/null + +# 3. 容器内启动推理服务 +docker exec -it tensorrt_serving bash -c \ + "trtllm-serve /models/Qwen2.5-7B-Instruct --host 0.0.0.0 --port 8000" + +# 4. 访问服务 +curl http://localhost:8000/v1/chat/completions \ + -H 'Content-Type: application/json' \ + -d '{ + "model": "Qwen2.5-7B-Instruct", + "messages": [{"role":"user","content":"你好"}], + "max_tokens": 128 + }' +``` + +## 已知问题 +- 构建时间较长(需从源码编译 TensorRT-LLM) +- 需要 NVIDIA Driver >= 535,建议使用较新的 GPU 驱动以兼容 CUDA 13.x 运行时 diff --git a/frameworks/tensorrt-llm/1.2.0/build.conf b/frameworks/tensorrt-llm/1.2.0/build.conf new file mode 100644 index 0000000..ec5c4e3 --- /dev/null +++ b/frameworks/tensorrt-llm/1.2.0/build.conf @@ -0,0 +1,4 @@ +# TensorRT-LLM 1.2.0 on OpenCloudOS 9 (GPU) +IMAGE_NAME=oc9-tensorrtllm +IMAGE_TAG=1.2.0 +GPU_TEST=true diff --git a/frameworks/tensorrt-llm/1.2.0/test.sh b/frameworks/tensorrt-llm/1.2.0/test.sh new file mode 100755 index 0000000..a4ee138 --- /dev/null +++ b/frameworks/tensorrt-llm/1.2.0/test.sh @@ -0,0 +1,52 @@ +#!/bin/bash +set -e + +IMAGE="${1:?ERROR: 缺少镜像参数。用法: bash test.sh }" + +echo "=== TensorRT-LLM 1.2.0 镜像功能测试 ===" + +# 1. Verify CUDA environment +echo -n "检查 CUDA 环境... " +docker run --rm --gpus all "$IMAGE" python3.12 -c " +import torch +assert torch.cuda.is_available(), 'CUDA not available' +print(f'GPU: {torch.cuda.get_device_name(0)}') +" && echo "✓ 通过" || { echo "✗ 失败"; exit 1; } + +# 2. Verify tensorrt_llm import +echo -n "检查 tensorrt_llm import... " +docker run --rm --gpus all "$IMAGE" python3.12 -c " +import tensorrt_llm +print(f'tensorrt_llm version: {tensorrt_llm.__version__}') +assert tensorrt_llm.__version__ == '1.2.0', f'version mismatch: {tensorrt_llm.__version__}' +" && echo "✓ 通过" || { echo "✗ 失败"; exit 1; } + +# 3. Verify trtllm-serve command +echo -n "检查 trtllm-serve 命令... " +docker run --rm --gpus all "$IMAGE" python3.12 -c " +import subprocess, sys +result = subprocess.run(['trtllm-serve', '--help'], capture_output=True, text=True) +if result.returncode == 0: + print('trtllm-serve 命令可用') +else: + print(f'trtllm-serve 异常: {result.stderr[:200]}') + sys.exit(1) +" && echo "✓ 通过" || { echo "✗ 失败"; exit 1; } + +# 4. Verify TensorRT version +echo -n "检查 TensorRT 版本... " +docker run --rm --gpus all "$IMAGE" python3.12 -c " +import tensorrt as trt +print(f'TensorRT version: {trt.__version__}') +" && echo "✓ 通过" || { echo "✗ 失败"; exit 1; } + +# 5. Verify key dependencies +echo -n "检查关键依赖... " +docker run --rm --gpus all "$IMAGE" python3.12 -c " +import torch, transformers, numpy as np +print(f'PyTorch: {torch.__version__}') +print(f'Transformers: {transformers.__version__}') +print(f'NumPy: {np.__version__}') +" && echo "✓ 通过" || { echo "✗ 失败"; exit 1; } + +echo "=== 所有测试通过 ===" diff --git a/frameworks/tensorrt-llm/1.2.0/test_result.png b/frameworks/tensorrt-llm/1.2.0/test_result.png new file mode 100644 index 0000000000000000000000000000000000000000..f8e5e6bde61b6566ae639765fc8c913ff3aeeb4a GIT binary patch literal 30359 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 literal 0 HcmV?d00001 -- Gitee