LogoTensorFusion 文档
LogoTensorFusion 文档
首页

快速开始

TensorFusion 概览在 Kubernetes 安装在虚拟机/服务器安装(K3S)Helm 快速安装在宿主机/虚拟机安装TensorFusion 架构

应用操作

创建 AI 应用注解使用场景配置自动扩缩容迁移现有应用最佳实践

自定义AI基础设施

生产级部署指南QoS 级别与计价云厂商集成(BYOC)管理许可证

维护与优化

组件更新配置告警GPU 热迁移预加载模型优化 GPU 效率

故障排除

问题处理手册链路追踪/性能分析查询指标和日志

参考

对比

与 NVIDIA vGPU 对比与 MIG/MPS 对比与趋动科技对比与 NVIDIA Run:ai 对比与 HAMi 的对比

在宿主机/虚拟机安装

在宿主机上运行 tensor-fusion-worker,在虚拟机内加载 tensor-fusion-client,虚拟机不需要 GPU 直通就能使用宿主机的物理 GPU。这种模式称为 TensorFusion HyperGPU。

本文介绍如何让虚拟机里的应用使用宿主机的 NVIDIA GPU,既不需要 GPU 直通,也不需要 Kubernetes。做法是:在宿主机上启动一个 worker 进程,在虚拟机里把 client 动态库加载进应用,再把 client 指向 worker。这种模式称为 TensorFusion HyperGPU。

如果要把多台服务器的 GPU 池化并统一调度,请改看在虚拟机/服务器安装(K3S)。

工作方式

组成运行位置作用
tensor-fusion-worker(下称 worker)宿主机独立的二进制程序。接收 client 发来的 CUDA 和 NVML 调用,在物理 GPU 上执行。一台宿主机可以同时运行多个 worker 实例。
tensor-fusion-client(下称 client)虚拟机一组动态库,导出 CUDA 和 NVML 的 API。应用加载它们来代替 NVIDIA 的库,每次调用都被转发给 worker。

多个 client 可以连接同一个 worker。生产环境建议每个 client 对应一个 worker,资源限制和问题排查都互不影响。

前置条件

  • 一台 x86-64 架构的 Linux 宿主机,装有 NVIDIA GPU 和 NVIDIA 驱动,nvidia-smi 能正常运行。建议驱动版本 570 或更高。
  • 宿主机的 glibc 版本不低于 2.34(例如 Ubuntu 22.04、RHEL 9),并装有 RDMA 用户态库 libibverbs.so.1 和 librdmacm.so.1,worker 二进制依赖这两个库。安装命令:apt-get install -y libibverbs1 librdmacm1 或 dnf install -y libibverbs librdmacm。
  • 一台或多台虚拟机,虚拟化平台不限(QEMU、MVisor、VMware、Hyper-V 等),能通过 TCP 或共享内存设备与宿主机通信。Linux 虚拟机需要 x86-64 架构,glibc 不低于 2.34。也支持 Windows 虚拟机。

第 1 步:下载 TensorFusion

在宿主机上下载并解压安装包:

curl -fLO https://cdn.tensor-fusion.ai/archive-lastest.zip
unzip archive-lastest.zip
cd archive-lastest

安装包的内容:

archive-lastest/
├── tensor-fusion-worker          # 在宿主机上运行
└── tensor-fusion-client/
    ├── linux/                    # libcuda.so、libnvidia-ml.so、libteleport.so
    └── windows/                  # nvcuda.dll、nvml.dll、teleport.dll

第 2 步:在宿主机启动 worker

  1. 选择 client 与 worker 之间的通信协议:

    协议传输方式适用场景
    nativeTCP部署最简单。虚拟机和宿主机在同一内网、往返延迟在 0.8 ms 左右或更低时使用。
    shmem共享内存延迟最低,适合对延迟敏感的业务。虚拟机需要挂载 IVSHMEM 设备。
  2. 按选定的协议启动 worker。

    监听 TCP 端口 12345:

    TF_ENABLE_LOG=1 ./tensor-fusion-worker -n native -p 12345

    创建一块名为 /my_shm、大小 256 MB 的共享内存,它在宿主机上对应文件 /dev/shm/my_shm:

    TF_ENABLE_LOG=1 ./tensor-fusion-worker -n shmem -m /my_shm -M 256

    worker 需要一直运行。生产环境用 systemd 之类的进程管理工具来托管。

worker 的命令行参数,即 ./tensor-fusion-worker -h 的输出:

Usage: tensor-fusion-worker [option]
Options
  -h, --help              Display this information.
  -v, --version           Display version information.
  -n, --net               Specified network protocol.
  -p, --port              Specified the port for server.
  -c, --controller-pipe   Specified the path of the controller pipe.
  -m, --shmem-file        Specified the file path of shared memory.
  -M, --shmem-size        Specified the size(MB) of shared memory.
  -R, --rdma-buffer-size  Specified the size(MB) of RDMA buffer.

-n 默认为 native。native 必须指定 -p,shmem 必须同时指定 -m 和 -M。

worker 的环境变量:

变量默认值含义
TF_ENABLE_LOG关闭设为 1 开启日志。
TF_LOG_LEVELinfo可选 trace、debug、info、warn、error。
TF_LOG_PATH空日志文件路径。为空时输出到标准输出。
TF_GPU_MEMORY_LIMIT不限制显存上限,单位 MB。较早构建的 worker(包括本文撰写时提供下载的安装包)读取的变量名是 TF_CUDA_MEMORY_LIMIT。把两个变量设成相同的值,两种构建都能生效。

第 3 步:在虚拟机中安装 client

把安装包里的 tensor-fusion-client 目录复制到虚拟机。下面的示例假设它位于 /opt/tensor-fusion-client。

用 LD_PRELOAD 或 LD_LIBRARY_PATH 把 tensor-fusion-client/linux 下的三个动态库加载进应用:

export LD_PRELOAD=/opt/tensor-fusion-client/linux/libteleport.so:/opt/tensor-fusion-client/linux/libcuda.so:/opt/tensor-fusion-client/linux/libnvidia-ml.so

把 tensor-fusion-client\windows 下的三个文件(nvcuda.dll、nvml.dll、teleport.dll)放到系统 PATH 包含的目录,或者放在应用的可执行文件旁边。

各系统环境差别较大,请确认应用实际加载的是这几个库,而不是 NVIDIA 的原生库。设置 TF_ENABLE_LOG=1 后,client 启动时会打印日志。

client 的环境变量:

变量默认值含义
TENSOR_FUSION_OPERATOR_CONNECTION_INFO空worker 的连接信息,格式为 协议+参数1+参数2+版本号,版本号目前固定为 0。没有设置下一个变量时必填。
TENSOR_FUSION_OPERATOR_GET_CONNECTION_URL空一个 HTTP GET 地址,返回同样格式的连接信息。设置后优先于 TENSOR_FUSION_OPERATOR_CONNECTION_INFO。
TF_ENABLE_LOG关闭设为 1 开启日志。
TF_LOG_LEVELinfo可选 trace、debug、info、warn、error。
TF_LOG_PATH空日志文件路径。为空时,Linux 下输出到控制台,Windows 下用 DebugView 查看。
TF_MAX_CACHE_REQUEST_COUNT内置值client 缓存请求的最大数量。

第 4 步:连接并验证

下面以装有 Python 和 CUDA 版 PyTorch 的 Linux 虚拟机为例。

  1. 在虚拟机中开启日志并加载 client:

    export TF_ENABLE_LOG=1
    export LD_PRELOAD=/opt/tensor-fusion-client/linux/libteleport.so:/opt/tensor-fusion-client/linux/libcuda.so:/opt/tensor-fusion-client/linux/libnvidia-ml.so
  2. 按 worker 使用的协议设置连接信息。

    格式为 native+<宿主机 IP>+<端口>+<版本号>。假设 worker 所在宿主机的 IP 是 192.168.1.100,端口是 12345:

    export TENSOR_FUSION_OPERATOR_CONNECTION_INFO=native+192.168.1.100+12345+0

    虚拟机必须能访问这个 IP 和端口。

    把 worker 创建的共享内存作为 IVSHMEM 设备挂给虚拟机。以 QEMU 为例,对应用 -m /my_shm -M 256 启动的 worker:

    qemu-system-x86_64 \
      -m 8192 \
      -hda centos8.4.qcow2 \
      -vnc :1 \
      -enable-kvm \
      -cpu host \
      -object memory-backend-file,id=shm0,mem-path=/dev/shm/my_shm,size=256M,share=on \
      -device ivshmem-plain,memdev=shm0 \
      -smp 4

    在虚拟机里找到 IVSHMEM 设备的 PCI 地址:

    lspci -vv | grep -i Inter-VM
    00:04.0 RAM memory: Red Hat, Inc. Inter-VM shared memory (rev 01)

    这里的地址是 00:04.0。连接信息的格式为 shmem+<设备资源文件>+<大小(MB)>+<版本号>,资源文件是该设备在 /sys 下的 resource2 文件:

    export TENSOR_FUSION_OPERATOR_CONNECTION_INFO=shmem+/sys/devices/pci0000:00/0000:00:04.0/resource2+256+0

    大小必须与 worker 的 -M 参数一致。映射 IVSHMEM 资源文件通常需要 root 权限。

  3. 用 PyTorch 和 Qwen3-0.6B 跑一次推理:

    pip install modelscope packaging transformers accelerate
    
    cat << 'EOF' > test-qwen.py
    from modelscope import AutoModelForCausalLM, AutoTokenizer
    
    model_name = "Qwen/Qwen3-0.6B"
    
    tokenizer = AutoTokenizer.from_pretrained(model_name)
    model = AutoModelForCausalLM.from_pretrained(
        model_name,
        torch_dtype="auto",
        device_map="cuda:0"
    )
    
    prompt = "Give me a short introduction to large language model."
    messages = [
        {"role": "user", "content": prompt}
    ]
    text = tokenizer.apply_chat_template(
        messages,
        tokenize=False,
        add_generation_prompt=True,
        enable_thinking=True
    )
    model_inputs = tokenizer([text], return_tensors="pt").to(model.device)
    generated_ids = model.generate(
        **model_inputs,
        max_new_tokens=32768
    )
    output_ids = generated_ids[0][len(model_inputs.input_ids[0]):].tolist()
    try:
        # rindex finding 151668 (</think>)
        index = len(output_ids) - output_ids[::-1].index(151668)
    except ValueError:
        index = 0
    
    thinking_content = tokenizer.decode(output_ids[:index], skip_special_tokens=True).strip("\n")
    content = tokenizer.decode(output_ids[index:], skip_special_tokens=True).strip("\n")
    
    print("thinking content:", thinking_content)
    print("content:", content)
    EOF
    
    python3 test-qwen.py

    在中国大陆可以先给 pip 配置镜像源加速下载:pip config set global.index-url https://pypi.mirrors.ustc.edu.cn/simple。

  4. 检查结果:

    • 虚拟机里的脚本打印出模型的回答。
    • 在宿主机上运行 nvidia-smi,能看到 worker 进程和它占用的显存。

脚本报错时,查看虚拟机里的 client 日志和宿主机上的 worker 日志。设置了 TF_ENABLE_LOG=1 后两边都会输出日志。

下一步

  • 在虚拟机/服务器安装(K3S):把多台服务器的 GPU 池化,由 TensorFusion 统一调度。
  • TensorFusion 架构:client、worker 与 TensorFusion 其他组件如何协作。
  • GPU Go:在笔记本或工作站上使用远程 GPU。

Helm 快速安装

只用 Helm 安装 TensorFusion,不安装 cluster agent,也不接入 TensorFusion 控制台

TensorFusion 架构

组件、隔离模式,以及 Pod 如何拿到 GPU

目录

工作方式
前置条件
第 1 步:下载 TensorFusion
第 2 步:在宿主机启动 worker
第 3 步:在虚拟机中安装 client
第 4 步:连接并验证
下一步