@draht/pods (英语)
在GPU吊舱上部署和管理LLMS,为代理工作量配置自动vLLM.
安装
bun add -g @draht/pods
什么鬼东西?
draht-pods 简化远程GPU吊舱上运行的大型语言模型. 自动:
- 在新鲜的 Ubuntu 舱上设置 vLLM
- 配置调用代理模型的工具( Quen, GPT- OSS, GLM等)
- 以“ 智能” GPU 分配方式管理同一舱上的多个模型
- 为每个模型提供 OpenAI 兼容的 API 端点
- 包括一个带有文件系统工具用于测试的交互式代理
快速启动
# Set required environment variables
export HF_TOKEN=your_huggingface_token # Get from https://huggingface.co/settings/tokens
export DRAHT_API_KEY=your_api_key # Any string you want for API authentication
# Setup a DataCrunch pod with NFS storage (models path auto-extracted)
draht-pods pods setup dc1 "ssh [email protected]" \
--mount "sudo mount -t nfs -o nconnect=16 nfs.fin-02.datacrunch.io:/your-pseudo /mnt/hf-models"
# Start a model (automatic configuration for known models)
draht-pods start Qwen/Qwen2.5-Coder-32B-Instruct --name qwen
# Send a single message to the model
draht-pods agent qwen "What is the Fibonacci sequence?"
# Interactive chat mode with file system tools
draht-pods agent qwen -i
# Use with any OpenAI-compatible client
export OPENAI_BASE_URL='http://1.2.3.4:8001/v1'
export OPENAI_API_KEY=$DRAHT_API_KEY
先决条件
- 节点.js 18+
- 拥抱 面相符 (用于模型下载)
- GPU 调用 :
- 乌邦图22.04或24.04
- SSH 根访问
- 安装 NVIDIA 驱动程序
- 模型的持续存储
支持供应商
主要支助
数据搜索 - 共享模型存储的最佳方法
- 同一区域多个吊舱的NFS卷
- 模型下载一次, 随处使用
- 团队的理想或多项实验
运行Pod - 长期保存良好
- 网络量持续独立
- 无法同时共享运行中的 pocks
- 适合单波段工作流程
也用过
- Vast.ai(锁定在特定机器上的数量)
- Prime Intellect( 无持续存储)
- AWS EC2( 带有 EFS 设置)
- 任何带有 NVIDIA GPU、 CUDA 驱动器和 SSH 的 Ubuntu 机器
图标
方案管理
draht-pods pods setup <name> "<ssh>" [options] # Setup new pod
--mount "<mount_command>" # Run mount command during setup
--models-path <path> # Override extracted path (optional)
--vllm release|nightly|gpt-oss # vLLM version (default: release)
draht-pods pods # List all configured pods
draht-pods pods active <name> # Switch active pod
draht-pods pods remove <name> # Remove pod from local config
draht-pods shell [<name>] # SSH into pod
draht-pods ssh [<name>] "<command>" # Run command on pod
说明: 当使用时 --mount,模型路径会自动从挂载命令的目标目录中取出. 你们只需要 --models-path 如果没有使用 --mount 或覆盖已提取路径.
vLLM 版本选项
release(默认):稳定 vLLM 发布,向大多数用户推荐nightly: 最新 vLLM 特性, GLM- 4.5 等最新模型所需gpt-oss: 只用于 OpenAI 的 GPT- OSS 模型的特殊构建
模型管理
draht-pods start <model> --name <name> [options] # Start a model
--memory <percent> # GPU memory: 30%, 50%, 90% (default: 90%)
--context <size> # Context window: 4k, 8k, 16k, 32k, 64k, 128k
--gpus <count> # Number of GPUs to use (predefined models only)
--pod <name> # Target specific pod (overrides active)
--vllm <args...> # Pass custom args directly to vLLM
draht-pods stop [<name>] # Stop model (or all if no name given)
draht-pods list # List running models with status
draht-pods logs <name> # Stream model logs (tail -f)
代理聊天接口( C)
draht-pods agent <name> "<message>" # Single message to model
draht-pods agent <name> "<msg1>" "<msg2>" # Multiple messages in sequence
draht-pods agent <name> -i # Interactive chat mode
draht-pods agent <name> -i -c # Continue previous session
# Standalone OpenAI-compatible agent (works with any API)
draht --base-url http://localhost:8000/v1 --model llama-3.1 "Hello"
draht --api-key sk-... "What is 2+2?" # Uses OpenAI by default
draht --json "What is 2+2?" # Output event stream as JSONL
draht -i # Interactive mode
该代理包括用于文件操作的工具(读取,列表,bash,glob,rg)来测试代理能力,特别是用于代码导航和分析任务.
预定义模型配置
draht-pods 包括流行代理模型的预定义配置,所以不需要指定 --vllm 手动参数. draht-pods 还会检查您所选择的模型是否可按 GPU 的数量和可用的 VRAM 运行。 运行 draht-pods start 不需要附加参数即可看到可以运行在活性吊舱上的预定义模型列表.
Quen 模型
# Qwen2.5-Coder-32B - Excellent coding model, fits on single H100/H200
draht-pods start Qwen/Qwen2.5-Coder-32B-Instruct --name qwen
# Qwen3-Coder-30B - Advanced reasoning with tool use
draht-pods start Qwen/Qwen3-Coder-30B-A3B-Instruct --name qwen3
# Qwen3-Coder-480B - State-of-the-art on 8xH200 (data-parallel mode)
draht-pods start Qwen/Qwen3-Coder-480B-A35B-Instruct-FP8 --name qwen-480b
GPT-OSS 模型
# Requires special vLLM build during setup
draht-pods pods setup gpt-pod "ssh [email protected]" --models-path /workspace --vllm gpt-oss
# GPT-OSS-20B - Fits on 16GB+ VRAM
draht-pods start openai/gpt-oss-20b --name gpt20
# GPT-OSS-120B - Needs 60GB+ VRAM
draht-pods start openai/gpt-oss-120b --name gpt120
GLM 模型
# GLM-4.5 - Requires 8-16 GPUs, includes thinking mode
draht-pods start zai-org/GLM-4.5 --name glm
# GLM-4.5-Air - Smaller version, 1-2 GPUs
draht-pods start zai-org/GLM-4.5-Air --name glm-air
自定义型号为 -- vllm
对于未在预定义列表中的模型,请使用 --vllm 将参数直接传递到 vLLM :
# DeepSeek with custom settings
draht-pods start deepseek-ai/DeepSeek-V3 --name deepseek --vllm \
--tensor-parallel-size 4 --trust-remote-code
# Mistral with pipeline parallelism
draht-pods start mistralai/Mixtral-8x22B-Instruct-v0.1 --name mixtral --vllm \
--tensor-parallel-size 8 --pipeline-parallel-size 2
# Any model with specific tool parser
draht-pods start some/model --name mymodel --vllm \
--tool-call-parser hermes --enable-auto-tool-choice
DataCrunch 设置
DataCrunch 提供了共享 NFS 存储跨吊舱的最佳经验:
1. 创建共享文件系统(SFS)
- 转到 DataCrunch 仪表板 → 存储 → 创建 SFS
- 选择大小和数据中心
- 注意挂载命令( 例如 ),
sudo mount -t nfs -o nconnect=16 nfs.fin-02.datacrunch.io:/hf-models-fin02-8ac1bab7 /mnt/hf-models-fin02(中文(简体) )
2. 创建 GPU 实例
- 在 SFS 相同的数据中心创建实例
- 与实例共享 SFS
- 从仪表板获取 SSH 命令
3. 与 draht- pod 设置
# Get mount command from DataCrunch dashboard
draht-pods pods setup dc1 "ssh [email protected]" \
--mount "sudo mount -t nfs -o nconnect=16 nfs.fin-02.datacrunch.io:/your-pseudo /mnt/hf-models"
# Models automatically stored in /mnt/hf-models (extracted from mount command)
4. 养恤金
- 模式在重启中持续存在
- 在同一数据中心多个实例之间共享模型
- 下载一次, 随处使用
- 只支付存储费, 不计算下载时间
运行Pod 设置
RunPod 以网络音量提供良好的持续存储 :
1. 创建网络量( 可选)
- 转到 RunPod 仪表板 → 存储 → 创建网络音量
- 选择大小和区域
2. 创建 GPU Pod
- 创建 pock 时选择“ 网络音量 ” (如果使用)
- 将您的音量附加到
/runpod-volume - 从 pock 细节获取 SSH 命令
3. 与 draht- pod 设置
# With network volume
draht-pods pods setup runpod "ssh [email protected]" --models-path /runpod-volume
# Or use workspace (persists with pod but not shareable)
draht-pods pods setup runpod "ssh [email protected]" --models-path /workspace
多 GPU 支持
自动 GPU 任务
Draht-pods在运行多个模型时,会自动将它们分配到不同的GPU:
draht-pods start model1 --name m1 # Auto-assigns to GPU 0
draht-pods start model2 --name m2 # Auto-assigns to GPU 1
draht-pods start model3 --name m3 # Auto-assigns to GPU 2
指定预定义模型的 GPU 计数
对于多个配置的预定义模型,使用 --gpus 来控制 GPU 的使用 :
# Run Qwen on 1 GPU instead of all available
draht-pods start Qwen/Qwen2.5-Coder-32B-Instruct --name qwen --gpus 1
# Run GLM-4.5 on 8 GPUs (if it has an 8-GPU config)
draht-pods start zai-org/GLM-4.5 --name glm --gpus 8
如果模型没有被请求的GPU计数的配置,你会看到可用的选项.
大型模型的十相平行
对于不符合单个GPU的模型:
# Use all available GPUs
draht-pods start meta-llama/Llama-3.1-70B-Instruct --name llama70b --vllm \
--tensor-parallel-size 4
# Specific GPU count
draht-pods start Qwen/Qwen3-Coder-480B-A35B-Instruct-FP8 --name qwen480 --vllm \
--data-parallel-size 8 --enable-expert-parallel
API 整合
所有模型都暴露出OpenAI相容的端点:
from openai import OpenAI
client = OpenAI(
base_url="http://your-pod-ip:8001/v1",
api_key="your-api-key"
)
# Chat completion with tool calling
response = client.chat.completions.create(
model="Qwen/Qwen2.5-Coder-32B-Instruct",
messages=[
{"role": "user", "content": "Write a Python function to calculate fibonacci"}
],
tools=[{
"type": "function",
"function": {
"name": "execute_code",
"description": "Execute Python code",
"parameters": {
"type": "object",
"properties": {
"code": {"type": "string"}
},
"required": ["code"]
}
}
}],
tool_choice="auto"
)
独立代理CLI
draht-pods 包括一个独立的OpenAI兼容代理,可以与任何API合作:
# Install globally to get draht command
bun add -g @draht/coding-agent
# Use with OpenAI
draht --api-key sk-... "What is machine learning?"
# Use with local vLLM
draht --base-url http://localhost:8000/v1 \
--model meta-llama/Llama-3.1-8B-Instruct \
--api-key dummy \
"Explain quantum computing"
# Interactive mode
draht -i
# Continue previous session
draht --continue "Follow up question"
# Custom system prompt
draht --system-prompt "You are a Python expert" "Write a web scraper"
# Use responses API (for GPT-OSS models)
draht --api responses --model openai/gpt-oss-20b "Hello"
该代理支持:
- 持续对话
- 有语法加亮的交互式 TUI 模式
- 代码导航的文件系统工具( 读取、 列表、 bash、 glob、 rg)
- 聊天补全和回复 API 格式
- 自定义系统提示
工具调用支持
draht-pods 自动配置为已知模型调用解析器的适当工具 :
- Quen 型号数字 :
hermes解析器( Quen3- Coder 使用)qwen3_coder(中文(简体) ) - GLM 模型数字 :
glm4_moe带有推理支持的解析器 - GPT-OSS 模型: 用途
/v1/responses端点,作为工具调用(函数调用OpenAI parlance)目前是一个 妇女信息方案v1/chat/completions结束点。 。 。 . - 自定义模型: 指定为
--vllm --tool-call-parser <parser> --enable-auto-tool-choice
要禁用调用的工具 :
draht-pods start model --name mymodel --vllm --disable-tool-call-parser
内存和上下文管理
GPU 内存分配
控制多少 GPU 内存 vLLM 预分配 :
--memory 30%: 高通币,上下文有限--memory 50%: 平衡(默认)--memory 90%: 最大上下文, 低货币
背景窗口
设置最大输入 + 输出符号 :
--context 4k: 4 096个令牌共计--context 32k:32 768个令牌共计--context 128k: 131 072个令牌共计
编码工作量示例:
# Large context for code analysis, moderate concurrency
draht-pods start Qwen/Qwen2.5-Coder-32B-Instruct --name coder \
--context 64k --memory 70%
说明: 当使用时 --vllm,则 --memory, (中文(简体) ), --context,以及 --gpus 参数被忽略。 如果你试图一起使用,你会看到一个警告.
会话持久性
交互式代理模式( E)-i)为每个项目目录保存会话 :
# Start new session
draht-pods agent qwen -i
# Continue previous session (maintains chat history)
draht-pods agent qwen -i -c
会话存储于 ~/.draht/sessions/ 按项目路径排列,包括:
- 完整对话历史
- 工具调用结果
- Token 使用统计
建筑事件系统( E)
代理服务器使用一个基于事件的统一架构,其中所有互动都流经 AgentEvent 类型。 这样可以:
- 横跨控制台和 TUI 模式的一致 UI 渲染
- 会话录音和重播
- API 调用和 UI 更新之间的清洁分隔
- JSON 方案整合的产出模式
事件会根据模型类型自动转换为相应的API格式(Chat Refults或Resolution).
JSON 输出模式
使用 --json 将事件流输出为 JSONL (JSON Lines) 用于程序消耗的旗帜 :
draht --api-key sk-... --json "What is 2+2?"
每行是一个完整的 JSON 对象,代表一个事件:
{"type":"user_message","text":"What is 2+2?"}
{"type":"assistant_start"}
{"type":"assistant_message","text":"2 + 2 = 4"}
{"type":"token_usage","inputTokens":10,"outputTokens":5,"totalTokens":15,"cacheReadTokens":0,"cacheWriteTokens":0}
解决问题
OOM (内存出处) 出错
- 减少
--memory百分比 - 使用更小的模型或量化版本( FP8)
- 减少
--context大小
模型不会启动
# Check GPU usage
draht-pods ssh "nvidia-smi"
# Check if port is in use
draht-pods list
# Force stop all models
draht-pods stop
工具调用问题
- 不是所有的模型支持工具都可靠地调用
- 尝试不同的解析器 :
--vllm --tool-call-parser mistral - 或禁用:
--vllm --disable-tool-call-parser
拒绝模式访问
有些型号(Llama,Mistral)需要休克 面相访问批准. 访问模型页面并点击"请求访问".
vLLM 数据 构建问题
如果使用 --vllm nightly 失败, 请尝试 :
- 使用
--vllm release用于稳定版本 - 检查 CUDA 兼容性
draht-pods ssh "nvidia-smi"
代理找不到信件
如果代理服务器显示配置而不是您的消息, 请确保引用带有特殊字符的信息 :
# Good
draht-pods agent qwen "What is this file about?"
# Bad (shell might interpret special chars)
draht-pods agent qwen What is this file about?
高级使用
与多个方案合作
# Override active pod for any command
draht-pods start model --name test --pod dev-pod
draht-pods list --pod prod-pod
draht-pods stop test --pod dev-pod
自定义 vLLM 参数
# Pass any vLLM argument after --vllm
draht-pods start model --name custom --vllm \
--quantization awq \
--enable-prefix-caching \
--max-num-seqs 256 \
--gpu-memory-utilization 0.95
监测
# Watch GPU utilization
draht-pods ssh "watch -n 1 nvidia-smi"
# Check model downloads
draht-pods ssh "du -sh ~/.cache/huggingface/hub/*"
# View all logs
draht-pods ssh "ls -la ~/.vllm_logs/"
# Check agent session history
ls -la ~/.draht/sessions/
环境变量
HF_TOKEN- 拥抱 模型下载的面值符DRAHT_API_KEY- vLLM 端点的 API 密钥DRAHT_CONFIG_DIR- 配置目录( 默认 ):~/.draht(中文(简体) )OPENAI_API_KEY- 用来draht-agent否时--api-key提供
许可证
麻省理工学院