[{"data":1,"prerenderedAt":5548},["ShallowReactive",2],{"wiki-\u002Fwiki\u002F2026-08-21-qwen3-8-vllm-shuang-a4000-bu-shu-jiao-cheng":3,"wiki-doc-nav":4929},{"id":4,"title":5,"body":6,"description":86,"extension":4923,"meta":4924,"navigation":286,"path":4925,"seo":4926,"stem":4927,"__hash__":4928},"wiki\u002Fwiki\u002F2026-08-21-Qwen3.8_vLLM_双A4000部署教程.md","Qwen3.8-27B-AWQ-INT4 双 RTX A4000 部署教程",{"type":7,"value":8,"toc":4856},"minimark",[9,13,18,69,72,76,79,89,92,98,101,108,110,114,118,121,124,130,133,163,166,172,174,178,181,207,210,216,220,223,229,232,234,238,241,247,250,310,313,319,321,325,328,331,337,340,346,348,371,374,380,382,386,390,393,399,402,408,411,426,429,454,456,460,463,469,472,478,481,487,489,493,496,502,505,511,515,521,524,530,533,537,540,546,550,553,556,562,565,571,573,577,580,586,590,604,608,611,614,620,623,627,630,632,636,671,674,729,732,761,763,767,770,776,779,803,806,898,901,903,907,910,928,931,951,954,982,985,1004,1007,1064,1066,1070,1073,1076,1082,1085,1087,1095,1098,1101,1107,1110,1116,1119,1125,1130,1136,1138,1142,1151,1154,1214,1217,1272,1279,1282,1297,1300,1313,1316,1322,1328,1330,1334,1337,1340,1343,1368,1371,1390,1393,1421,1428,1434,1436,1440,1447,1470,1473,1479,1481,1485,1488,1493,1496,1562,1565,1584,1587,1592,1594,1598,1601,1607,1610,1642,1644,1662,1669,1671,1675,1678,1681,1697,1700,1703,1705,1709,1712,1732,1735,1769,1772,1778,1781,1783,1790,1795,1798,1804,1807,1830,1833,1860,1863,1887,1889,1893,1896,1899,1905,1907,1913,1916,1944,1947,1952,1955,1961,1968,1973,1976,1978,1982,1988,1991,2036,2042,2045,2051,2054,2060,2064,2067,2088,2091,2133,2136,2152,2162,2164,2168,2186,2189,2213,2215,2219,2223,2226,2232,2235,2238,2257,2260,2262,2266,2269,2275,2278,2284,2287,2363,2366,2372,2375,2381,2384,2389,2391,2395,2417,2420,2444,2446,2452,2455,2458,2460,2464,2467,2486,2489,2495,2497,2503,2510,2512,2516,2520,2975,2979,3082,3091,3093,3097,3103,3106,3108,3136,3139,3145,3151,3157,3160,3163,3169,3175,3178,3181,3187,3190,3196,3202,3205,3208,3214,3217,3220,3226,3229,3235,3241,3244,3253,3256,3262,3265,3267,3271,3274,3300,3303,3326,3329,3353,3356,3385,3388,3412,3414,3434,3436,3440,3443,3473,3476,3521,3528,3530,3534,3677,3686,3688,3692,3696,3699,3702,3708,3712,3715,3721,3724,3789,3793,4047,4050,4052,4056,4059,4065,4067,4073,4076,4082,4085,4087,4091,4095,4098,4101,4107,4111,4114,4120,4123,4126,4132,4135,4141,4145,4151,4155,4158,4160,4166,4169,4171,4175,4179,4185,4188,4194,4197,4201,4207,4210,4216,4218,4224,4227,4231,4237,4240,4246,4249,4251,4255,4258,4264,4267,4273,4276,4279,4292,4295,4298,4300,4304,4310,4313,4333,4336,4351,4357,4360,4388,4392,4395,4401,4404,4413,4419,4421,4466,4469,4491,4494,4499,4502,4504,4508,4611,4616,4622,4624,4628,4771,4774,4780,4782,4786,4789,4792,4798,4801,4807,4810,4813,4819,4821,4825,4831,4834,4840,4842,4846,4852],[10,11,5],"h1",{"id":12},"qwen38-27b-awq-int4-双-rtx-a4000-部署教程",[14,15,17],"h2",{"id":16},"docker-vllm-多-gpu-长上下文-多模态-openai-api-cherry-studio","Docker + vLLM + 多 GPU + 长上下文 + 多模态 + OpenAI API + Cherry Studio",[19,20,21,38,41],"blockquote",{},[22,23,24,25,29,30,33,34,37],"p",{},"本教程完整记录在 ",[26,27,28],"strong",{},"2 × NVIDIA RTX A4000 16GB"," 服务器上，通过 ",[26,31,32],{},"Docker + vLLM"," 部署 ",[26,35,36],{},"Qwen3.8-27B-AWQ-INT4"," 的全过程。",[22,39,40],{},"最终实现：",[42,43,44,48,51,54,60,63,66],"ul",{},[45,46,47],"li",{},"2 张 A4000 共同运行一个 27B 模型",[45,49,50],{},"Tensor Parallel = 2",[45,52,53],{},"最大上下文 112K",[45,55,56],{},[57,58,59],"code",{},"max-num-seqs = 4",[45,61,62],{},"支持文本和图片",[45,64,65],{},"提供 OpenAI 兼容 API",[45,67,68],{},"可供 Cherry Studio、curl、OpenAI SDK 等客户端访问",[70,71],"hr",{},[10,73,75],{"id":74},"_1-先理解整套部署架构","1. 先理解整套部署架构",[22,77,78],{},"本次系统分成 5 层：",[80,81,87],"pre",{"className":82,"code":84,"language":85,"meta":86},[83],"language-text","Cherry Studio \u002F curl \u002F OpenAI SDK\n              │\n              │ HTTP \u002F OpenAI API\n              ▼\n        vLLM API Server\n              │\n              ▼\n Qwen3.8-27B-AWQ-INT4\n              │\n       Tensor Parallel = 2\n          ┌──────┴──────┐\n          ▼             ▼\n     RTX A4000      RTX A4000\n       16GB            16GB\n","text","",[57,88,84],{"__ignoreMap":86},[22,90,91],{},"再往下看运行环境：",[80,93,96],{"className":94,"code":95,"language":85,"meta":86},[83],"NVIDIA GPU\n   ↓\nNVIDIA Driver\n   ↓\nNVIDIA Container Runtime\n   ↓\nDocker\n   ↓\nvLLM\n   ↓\nQwen3.8\n   ↓\nOpenAI API\n   ↓\nCherry Studio\n",[57,97,95],{"__ignoreMap":86},[22,99,100],{},"最重要的一点：",[19,102,103],{},[22,104,105],{},[26,106,107],{},"Docker、vLLM、模型、客户端不是一回事。",[70,109],{},[10,111,113],{"id":112},"_2-dockervllmollamaonnx-分别是什么","2. Docker、vLLM、Ollama、ONNX 分别是什么",[14,115,117],{"id":116},"_21-docker负责运行环境","2.1 Docker：负责运行环境",[22,119,120],{},"Docker 不负责模型推理。",[22,122,123],{},"它主要负责把这些依赖封装起来：",[80,125,128],{"className":126,"code":127,"language":85,"meta":86},[83],"Python\nPyTorch\nCUDA 运行库\nvLLM\n其他依赖\n",[57,129,127],{"__ignoreMap":86},[22,131,132],{},"例如：",[80,134,138],{"className":135,"code":136,"language":137,"meta":86,"style":86},"language-bash shiki shiki-themes github-light github-dark","# 下载已经预装好 vLLM 的 Docker 镜像\ndocker pull vllm\u002Fvllm-openai:latest\n","bash",[57,139,140,149],{"__ignoreMap":86},[141,142,145],"span",{"class":143,"line":144},"line",1,[141,146,148],{"class":147},"sJ8bj","# 下载已经预装好 vLLM 的 Docker 镜像\n",[141,150,152,156,160],{"class":143,"line":151},2,[141,153,155],{"class":154},"sScJk","docker",[141,157,159],{"class":158},"sZZnC"," pull",[141,161,162],{"class":158}," vllm\u002Fvllm-openai:latest\n",[22,164,165],{},"可以简单理解：",[80,167,170],{"className":168,"code":169,"language":85,"meta":86},[83],"Docker = 运行环境\nvLLM   = 推理引擎\nQwen   = 被加载的模型\n",[57,171,169],{"__ignoreMap":86},[70,173],{},[14,175,177],{"id":176},"_22-vllm负责高性能大模型服务端推理","2.2 vLLM：负责高性能大模型服务端推理",[22,179,180],{},"vLLM 特别适合：",[42,182,183,186,189,192,195,198,201,204],{},[45,184,185],{},"NVIDIA GPU 服务器",[45,187,188],{},"多 GPU",[45,190,191],{},"高并发",[45,193,194],{},"长上下文",[45,196,197],{},"OpenAI API",[45,199,200],{},"多用户访问",[45,202,203],{},"KV Cache 管理",[45,205,206],{},"Continuous Batching",[22,208,209],{},"vLLM 的基本工作流：",[80,211,214],{"className":212,"code":213,"language":85,"meta":86},[83],"客户端发请求\n    ↓\nvLLM 接收\n    ↓\n调度请求\n    ↓\n管理 KV Cache\n    ↓\n调用 GPU\n    ↓\n返回 OpenAI 兼容结果\n",[57,215,213],{"__ignoreMap":86},[217,218,206],"h3",{"id":219},"continuous-batching",[22,221,222],{},"vLLM 可以动态调度不同时间到达的请求：",[80,224,227],{"className":225,"code":226,"language":85,"meta":86},[83],"请求 A 先到\n请求 B 后到\n请求 C 再到\n      ↓\nvLLM 动态加入\u002F移出 batch\n      ↓\n尽量保持 GPU 忙碌\n",[57,228,226],{"__ignoreMap":86},[22,230,231],{},"因此它非常适合服务器 API 场景。",[70,233],{},[14,235,237],{"id":236},"_23-ollama更适合个人本地快速运行","2.3 Ollama：更适合个人本地快速运行",[22,239,240],{},"Ollama 更强调：",[80,242,245],{"className":243,"code":244,"language":85,"meta":86},[83],"安装简单\n模型管理方便\n命令简单\n适合本地快速体验\n",[57,246,244],{"__ignoreMap":86},[22,248,249],{},"典型命令：",[80,251,253],{"className":135,"code":252,"language":137,"meta":86,"style":86},"# 下载模型\nollama pull \u003C模型名>\n\n# 运行模型\nollama run \u003C模型名>\n",[57,254,255,260,281,288,294],{"__ignoreMap":86},[141,256,257],{"class":143,"line":144},[141,258,259],{"class":147},"# 下载模型\n",[141,261,262,265,267,271,274,278],{"class":143,"line":151},[141,263,264],{"class":154},"ollama",[141,266,159],{"class":158},[141,268,270],{"class":269},"szBVR"," \u003C",[141,272,273],{"class":158},"模型",[141,275,277],{"class":276},"sVt8B","名",[141,279,280],{"class":269},">\n",[141,282,284],{"class":143,"line":283},3,[141,285,287],{"emptyLinePlaceholder":286},true,"\n",[141,289,291],{"class":143,"line":290},4,[141,292,293],{"class":147},"# 运行模型\n",[141,295,297,299,302,304,306,308],{"class":143,"line":296},5,[141,298,264],{"class":154},[141,300,301],{"class":158}," run",[141,303,270],{"class":269},[141,305,273],{"class":158},[141,307,277],{"class":276},[141,309,280],{"class":269},[22,311,312],{},"更适合：",[80,314,317],{"className":315,"code":316,"language":85,"meta":86},[83],"Mac\nWindows\nLinux 桌面\n个人电脑\n单用户\n快速测试模型\n",[57,318,316],{"__ignoreMap":86},[70,320],{},[14,322,324],{"id":323},"_24-onnx-onnx-runtime","2.4 ONNX \u002F ONNX Runtime",[22,326,327],{},"ONNX 是一种模型交换格式。",[22,329,330],{},"典型流程：",[80,332,335],{"className":333,"code":334,"language":85,"meta":86},[83],"PyTorch \u002F TensorFlow\n        ↓\n      导出\n        ↓\n      ONNX\n        ↓\n ONNX Runtime\n        ↓\nCPU \u002F CUDA \u002F TensorRT\n",[57,336,334],{"__ignoreMap":86},[22,338,339],{},"ONNX Runtime 更偏向：",[80,341,344],{"className":342,"code":343,"language":85,"meta":86},[83],"把模型嵌入自己的软件\n",[57,345,343],{"__ignoreMap":86},[22,347,132],{},[42,349,350,353,356,359,362,365,368],{},[45,351,352],{},"C++",[45,354,355],{},"C#",[45,357,358],{},"Python",[45,360,361],{},"工业软件",[45,363,364],{},"桌面软件",[45,366,367],{},"边缘端",[45,369,370],{},"跨平台应用",[22,372,373],{},"可以简单记：",[80,375,378],{"className":376,"code":377,"language":85,"meta":86},[83],"Ollama\n→ 本地快速运行模型\n\nvLLM\n→ GPU 服务器提供大模型 API\n\nONNX Runtime\n→ 把模型嵌入自己的应用程序\n",[57,379,377],{"__ignoreMap":86},[70,381],{},[10,383,385],{"id":384},"_3-本次服务器和模型信息","3. 本次服务器和模型信息",[14,387,389],{"id":388},"_31-gpu","3.1 GPU",[22,391,392],{},"服务器：",[80,394,397],{"className":395,"code":396,"language":85,"meta":86},[83],"GPU 0：NVIDIA RTX A4000 16GB\nGPU 1：NVIDIA RTX A4000 16GB\n",[57,398,396],{"__ignoreMap":86},[22,400,401],{},"总显存约：",[80,403,406],{"className":404,"code":405,"language":85,"meta":86},[83],"32GB\n",[57,407,405],{"__ignoreMap":86},[22,409,410],{},"查看 GPU：",[80,412,414],{"className":135,"code":413,"language":137,"meta":86,"style":86},"# 查看 GPU 型号、显存、温度、利用率和进程\nnvidia-smi\n",[57,415,416,421],{"__ignoreMap":86},[141,417,418],{"class":143,"line":144},[141,419,420],{"class":147},"# 查看 GPU 型号、显存、温度、利用率和进程\n",[141,422,423],{"class":143,"line":151},[141,424,425],{"class":154},"nvidia-smi\n",[22,427,428],{},"实时监控：",[80,430,432],{"className":135,"code":431,"language":137,"meta":86,"style":86},"# 每 1 秒刷新一次 GPU 状态\nwatch -n 1 nvidia-smi\n",[57,433,434,439],{"__ignoreMap":86},[141,435,436],{"class":143,"line":144},[141,437,438],{"class":147},"# 每 1 秒刷新一次 GPU 状态\n",[141,440,441,444,448,451],{"class":143,"line":151},[141,442,443],{"class":154},"watch",[141,445,447],{"class":446},"sj4cs"," -n",[141,449,450],{"class":446}," 1",[141,452,453],{"class":158}," nvidia-smi\n",[70,455],{},[14,457,459],{"id":458},"_32-模型","3.2 模型",[22,461,462],{},"本次准备了：",[80,464,467],{"className":465,"code":466,"language":85,"meta":86},[83],"\u002Fdata\u002Fqwen\u002Fmodels\u002FQwen3.8-27B-AWQ-BF16-INT4\n\u002Fdata\u002Fqwen\u002Fmodels\u002FQwen3.8-27B-AWQ-INT4\n",[57,468,466],{"__ignoreMap":86},[22,470,471],{},"最终使用：",[80,473,476],{"className":474,"code":475,"language":85,"meta":86},[83],"\u002Fdata\u002Fqwen\u002Fmodels\u002FQwen3.8-27B-AWQ-INT4\n",[57,477,475],{"__ignoreMap":86},[22,479,480],{},"原因：",[80,482,485],{"className":483,"code":484,"language":85,"meta":86},[83],"模型权重占用相对更小\n↓\n留给 KV Cache 的空间更多\n↓\n更适合长上下文和多模态\n",[57,486,484],{"__ignoreMap":86},[70,488],{},[10,490,492],{"id":491},"_4-理解模型名称27bawqint4","4. 理解模型名称：27B、AWQ、INT4",[22,494,495],{},"模型名：",[80,497,500],{"className":498,"code":499,"language":85,"meta":86},[83],"Qwen3.8-27B-AWQ-INT4\n",[57,501,499],{"__ignoreMap":86},[22,503,504],{},"可拆成：",[80,506,509],{"className":507,"code":508,"language":85,"meta":86},[83],"Qwen3.8\n├── 27B\n├── AWQ\n└── INT4\n",[57,510,508],{"__ignoreMap":86},[14,512,514],{"id":513},"_41-27b","4.1 27B",[80,516,519],{"className":517,"code":518,"language":85,"meta":86},[83],"B = Billion\n",[57,520,518],{"__ignoreMap":86},[22,522,523],{},"所以：",[80,525,528],{"className":526,"code":527,"language":85,"meta":86},[83],"27B ≈ 270 亿参数\n",[57,529,527],{"__ignoreMap":86},[22,531,532],{},"INT4 不会让 27B 变成 7B，参数规模仍是 27B。",[14,534,536],{"id":535},"_42-awq","4.2 AWQ",[22,538,539],{},"AWQ 是一种权重量化方案。",[80,541,544],{"className":542,"code":543,"language":85,"meta":86},[83],"高精度权重\n   ↓\nAWQ 量化\n   ↓\n低 bit 权重\n   ↓\n降低显存和存储压力\n",[57,545,543],{"__ignoreMap":86},[14,547,549],{"id":548},"_43-int4","4.3 INT4",[22,551,552],{},"INT4 表示模型权重主要采用 4 bit 表示。",[22,554,555],{},"粗略对比：",[80,557,560],{"className":558,"code":559,"language":85,"meta":86},[83],"BF16 → 16 bit\nINT8 →  8 bit\nINT4 →  4 bit\n",[57,561,559],{"__ignoreMap":86},[22,563,564],{},"本次选择 INT4 的核心目的：",[80,566,569],{"className":567,"code":568,"language":85,"meta":86},[83],"减少权重显存\n↓\n给 KV Cache 留更多空间\n",[57,570,568],{"__ignoreMap":86},[70,572],{},[10,574,576],{"id":575},"_5-gpu驱动cudadocker-runtime-的关系","5. GPU、驱动、CUDA、Docker Runtime 的关系",[22,578,579],{},"完整关系：",[80,581,584],{"className":582,"code":583,"language":85,"meta":86},[83],"NVIDIA GPU\n   ↓\nNVIDIA Driver\n   ↓\nCUDA Runtime\n   ↓\nNVIDIA Container Toolkit\n   ↓\nDocker\n   ↓\nPyTorch \u002F vLLM\n",[57,585,583],{"__ignoreMap":86},[217,587,589],{"id":588},"nvidia-driver","NVIDIA Driver",[80,591,593],{"className":135,"code":592,"language":137,"meta":86,"style":86},"# 能正常显示 GPU，说明宿主机驱动基本正常\nnvidia-smi\n",[57,594,595,600],{"__ignoreMap":86},[141,596,597],{"class":143,"line":144},[141,598,599],{"class":147},"# 能正常显示 GPU，说明宿主机驱动基本正常\n",[141,601,602],{"class":143,"line":151},[141,603,425],{"class":154},[217,605,607],{"id":606},"cuda","CUDA",[22,609,610],{},"vLLM 和 PyTorch 通过 CUDA 使用 NVIDIA GPU。",[22,612,613],{},"注意：",[80,615,618],{"className":616,"code":617,"language":85,"meta":86},[83],"nvidia-smi 里的 CUDA Version\n",[57,619,617],{"__ignoreMap":86},[22,621,622],{},"更接近“当前驱动支持的最高 CUDA Runtime 版本”，不等于系统一定安装了同版本 CUDA Toolkit。",[217,624,626],{"id":625},"nvidia-container-toolkit","NVIDIA Container Toolkit",[22,628,629],{},"它负责把宿主机 GPU 暴露给 Docker 容器。",[70,631],{},[10,633,635],{"id":634},"_6-配置-nvidia-container-toolkit","6. 配置 NVIDIA Container Toolkit",[80,637,639],{"className":135,"code":638,"language":137,"meta":86,"style":86},"# 查看 nvidia-ctk 是否已经安装\nwhich nvidia-ctk\n\n# 查看版本\nnvidia-ctk --version\n",[57,640,641,646,654,658,663],{"__ignoreMap":86},[141,642,643],{"class":143,"line":144},[141,644,645],{"class":147},"# 查看 nvidia-ctk 是否已经安装\n",[141,647,648,651],{"class":143,"line":151},[141,649,650],{"class":446},"which",[141,652,653],{"class":158}," nvidia-ctk\n",[141,655,656],{"class":143,"line":283},[141,657,287],{"emptyLinePlaceholder":286},[141,659,660],{"class":143,"line":290},[141,661,662],{"class":147},"# 查看版本\n",[141,664,665,668],{"class":143,"line":296},[141,666,667],{"class":154},"nvidia-ctk",[141,669,670],{"class":446}," --version\n",[22,672,673],{},"配置 Docker：",[80,675,677],{"className":135,"code":676,"language":137,"meta":86,"style":86},"# 把 NVIDIA Runtime 注册到 Docker\nsudo nvidia-ctk runtime configure --runtime=docker\n\n# 重新加载 Docker 配置\n# 本机还有其他重要容器，因此优先 reload\nsudo systemctl reload docker\n",[57,678,679,684,701,705,710,715],{"__ignoreMap":86},[141,680,681],{"class":143,"line":144},[141,682,683],{"class":147},"# 把 NVIDIA Runtime 注册到 Docker\n",[141,685,686,689,692,695,698],{"class":143,"line":151},[141,687,688],{"class":154},"sudo",[141,690,691],{"class":158}," nvidia-ctk",[141,693,694],{"class":158}," runtime",[141,696,697],{"class":158}," configure",[141,699,700],{"class":446}," --runtime=docker\n",[141,702,703],{"class":143,"line":283},[141,704,287],{"emptyLinePlaceholder":286},[141,706,707],{"class":143,"line":290},[141,708,709],{"class":147},"# 重新加载 Docker 配置\n",[141,711,712],{"class":143,"line":296},[141,713,714],{"class":147},"# 本机还有其他重要容器，因此优先 reload\n",[141,716,718,720,723,726],{"class":143,"line":717},6,[141,719,688],{"class":154},[141,721,722],{"class":158}," systemctl",[141,724,725],{"class":158}," reload",[141,727,728],{"class":158}," docker\n",[22,730,731],{},"检查：",[80,733,735],{"className":135,"code":734,"language":137,"meta":86,"style":86},"# 确认 Docker 已经识别 nvidia runtime\ndocker info | grep -i runtime\n",[57,736,737,742],{"__ignoreMap":86},[141,738,739],{"class":143,"line":144},[141,740,741],{"class":147},"# 确认 Docker 已经识别 nvidia runtime\n",[141,743,744,746,749,752,755,758],{"class":143,"line":151},[141,745,155],{"class":154},[141,747,748],{"class":158}," info",[141,750,751],{"class":269}," |",[141,753,754],{"class":154}," grep",[141,756,757],{"class":446}," -i",[141,759,760],{"class":158}," runtime\n",[70,762],{},[10,764,766],{"id":765},"_7-检查-docker-是否能使用-gpu","7. 检查 Docker 是否能使用 GPU",[22,768,769],{},"本机标准的：",[80,771,774],{"className":772,"code":773,"language":85,"meta":86},[83],"--gpus all\n",[57,775,773],{"__ignoreMap":86},[22,777,778],{},"曾出现兼容问题，因此最终使用：",[80,780,782],{"className":135,"code":781,"language":137,"meta":86,"style":86},"--runtime=nvidia\n-e NVIDIA_VISIBLE_DEVICES=all\n",[57,783,784,795],{"__ignoreMap":86},[141,785,786,789,792],{"class":143,"line":144},[141,787,788],{"class":276},"--runtime",[141,790,791],{"class":269},"=",[141,793,794],{"class":158},"nvidia\n",[141,796,797,800],{"class":143,"line":151},[141,798,799],{"class":154},"-e",[141,801,802],{"class":158}," NVIDIA_VISIBLE_DEVICES=all\n",[22,804,805],{},"测试：",[80,807,809],{"className":135,"code":808,"language":137,"meta":86,"style":86},"# --rm：\n# 容器退出后自动删除，只适合一次性测试\n#\n# --runtime=nvidia：\n# 使用 NVIDIA Container Runtime\n#\n# NVIDIA_VISIBLE_DEVICES=all：\n# 让容器看到所有 NVIDIA GPU\ndocker run --rm \\\n  --runtime=nvidia \\\n  -e NVIDIA_VISIBLE_DEVICES=all \\\n  nvidia\u002Fcuda:12.8.0-base-ubuntu22.04 \\\n  nvidia-smi\n",[57,810,811,816,821,826,831,836,840,846,852,865,873,884,892],{"__ignoreMap":86},[141,812,813],{"class":143,"line":144},[141,814,815],{"class":147},"# --rm：\n",[141,817,818],{"class":143,"line":151},[141,819,820],{"class":147},"# 容器退出后自动删除，只适合一次性测试\n",[141,822,823],{"class":143,"line":283},[141,824,825],{"class":147},"#\n",[141,827,828],{"class":143,"line":290},[141,829,830],{"class":147},"# --runtime=nvidia：\n",[141,832,833],{"class":143,"line":296},[141,834,835],{"class":147},"# 使用 NVIDIA Container Runtime\n",[141,837,838],{"class":143,"line":717},[141,839,825],{"class":147},[141,841,843],{"class":143,"line":842},7,[141,844,845],{"class":147},"# NVIDIA_VISIBLE_DEVICES=all：\n",[141,847,849],{"class":143,"line":848},8,[141,850,851],{"class":147},"# 让容器看到所有 NVIDIA GPU\n",[141,853,855,857,859,862],{"class":143,"line":854},9,[141,856,155],{"class":154},[141,858,301],{"class":158},[141,860,861],{"class":446}," --rm",[141,863,864],{"class":446}," \\\n",[141,866,868,871],{"class":143,"line":867},10,[141,869,870],{"class":446},"  --runtime=nvidia",[141,872,864],{"class":446},[141,874,876,879,882],{"class":143,"line":875},11,[141,877,878],{"class":446},"  -e",[141,880,881],{"class":158}," NVIDIA_VISIBLE_DEVICES=all",[141,883,864],{"class":446},[141,885,887,890],{"class":143,"line":886},12,[141,888,889],{"class":158},"  nvidia\u002Fcuda:12.8.0-base-ubuntu22.04",[141,891,864],{"class":446},[141,893,895],{"class":143,"line":894},13,[141,896,897],{"class":158},"  nvidia-smi\n",[22,899,900],{},"容器里能看到两张 A4000，就说明 Docker → GPU 链路正常。",[70,902],{},[10,904,906],{"id":905},"_8-磁盘检查与目录准备","8. 磁盘检查与目录准备",[22,908,909],{},"查看磁盘：",[80,911,913],{"className":135,"code":912,"language":137,"meta":86,"style":86},"# 查看根分区和 \u002Fdata 使用情况\ndf -h\n",[57,914,915,920],{"__ignoreMap":86},[141,916,917],{"class":143,"line":144},[141,918,919],{"class":147},"# 查看根分区和 \u002Fdata 使用情况\n",[141,921,922,925],{"class":143,"line":151},[141,923,924],{"class":154},"df",[141,926,927],{"class":446}," -h\n",[22,929,930],{},"查看 Docker 占用：",[80,932,934],{"className":135,"code":933,"language":137,"meta":86,"style":86},"# 查看 Docker 镜像、容器、volume、build cache 占用\ndocker system df\n",[57,935,936,941],{"__ignoreMap":86},[141,937,938],{"class":143,"line":144},[141,939,940],{"class":147},"# 查看 Docker 镜像、容器、volume、build cache 占用\n",[141,942,943,945,948],{"class":143,"line":151},[141,944,155],{"class":154},[141,946,947],{"class":158}," system",[141,949,950],{"class":158}," df\n",[22,952,953],{},"清理未使用 Build Cache：",[80,955,957],{"className":135,"code":956,"language":137,"meta":86,"style":86},"# -a：清理全部未使用 build cache\n# -f：不再确认\ndocker builder prune -af\n",[57,958,959,964,969],{"__ignoreMap":86},[141,960,961],{"class":143,"line":144},[141,962,963],{"class":147},"# -a：清理全部未使用 build cache\n",[141,965,966],{"class":143,"line":151},[141,967,968],{"class":147},"# -f：不再确认\n",[141,970,971,973,976,979],{"class":143,"line":283},[141,972,155],{"class":154},[141,974,975],{"class":158}," builder",[141,977,978],{"class":158}," prune",[141,980,981],{"class":446}," -af\n",[22,983,984],{},"不要在有重要数据库 volume 的服务器上盲目执行：",[80,986,988],{"className":135,"code":987,"language":137,"meta":86,"style":86},"docker system prune -a --volumes\n",[57,989,990],{"__ignoreMap":86},[141,991,992,994,996,998,1001],{"class":143,"line":144},[141,993,155],{"class":154},[141,995,947],{"class":158},[141,997,978],{"class":158},[141,999,1000],{"class":446}," -a",[141,1002,1003],{"class":446}," --volumes\n",[22,1005,1006],{},"准备目录：",[80,1008,1010],{"className":135,"code":1009,"language":137,"meta":86,"style":86},"# 模型目录\nmkdir -p \u002Fdata\u002Fqwen\u002Fmodels\n\n# vLLM \u002F Hugging Face 缓存\nmkdir -p \u002Fdata\u002Fqwen\u002Fvllm-cache\n\n# 临时目录\nmkdir -p \u002Fdata\u002Fqwen\u002Ftmp\n",[57,1011,1012,1017,1028,1032,1037,1046,1050,1055],{"__ignoreMap":86},[141,1013,1014],{"class":143,"line":144},[141,1015,1016],{"class":147},"# 模型目录\n",[141,1018,1019,1022,1025],{"class":143,"line":151},[141,1020,1021],{"class":154},"mkdir",[141,1023,1024],{"class":446}," -p",[141,1026,1027],{"class":158}," \u002Fdata\u002Fqwen\u002Fmodels\n",[141,1029,1030],{"class":143,"line":283},[141,1031,287],{"emptyLinePlaceholder":286},[141,1033,1034],{"class":143,"line":290},[141,1035,1036],{"class":147},"# vLLM \u002F Hugging Face 缓存\n",[141,1038,1039,1041,1043],{"class":143,"line":296},[141,1040,1021],{"class":154},[141,1042,1024],{"class":446},[141,1044,1045],{"class":158}," \u002Fdata\u002Fqwen\u002Fvllm-cache\n",[141,1047,1048],{"class":143,"line":717},[141,1049,287],{"emptyLinePlaceholder":286},[141,1051,1052],{"class":143,"line":842},[141,1053,1054],{"class":147},"# 临时目录\n",[141,1056,1057,1059,1061],{"class":143,"line":848},[141,1058,1021],{"class":154},[141,1060,1024],{"class":446},[141,1062,1063],{"class":158}," \u002Fdata\u002Fqwen\u002Ftmp\n",[70,1065],{},[10,1067,1069],{"id":1068},"_9-从-hugging-face-下载-qwen38-模型","9. 从 Hugging Face 下载 Qwen3.8 模型",[22,1071,1072],{},"在使用 vLLM 启动 Qwen3.8 之前，首先要把模型文件准备好。",[22,1074,1075],{},"本教程采用的方式是：",[80,1077,1080],{"className":1078,"code":1079,"language":85,"meta":86},[83],"Hugging Face\n    ↓\nhf download\n    ↓\n\u002Fdata\u002Fqwen\u002Fmodels\u002F\n    ↓\nDocker 只读挂载\n    ↓\nvLLM 加载本地模型\n",[57,1081,1079],{"__ignoreMap":86},[22,1083,1084],{},"这样做的优点是模型文件位置固定，Docker 容器删除或重建以后也不需要重新下载模型。",[70,1086],{},[14,1088,1090,1091,1094],{"id":1089},"_91-hugging-face-和-hf-命令分别是什么","9.1 Hugging Face 和 ",[57,1092,1093],{},"hf"," 命令分别是什么",[22,1096,1097],{},"Hugging Face 是常用的模型、数据集和机器学习资源托管平台。",[22,1099,1100],{},"模型仓库通常写成：",[80,1102,1105],{"className":1103,"code":1104,"language":85,"meta":86},[83],"用户名或组织名\u002F模型名\n",[57,1106,1104],{"__ignoreMap":86},[22,1108,1109],{},"例如本次使用：",[80,1111,1114],{"className":1112,"code":1113,"language":85,"meta":86},[83],"cyankiwi\u002FQwen3.8-27B-AWQ-INT4\n",[57,1115,1113],{"__ignoreMap":86},[22,1117,1118],{},"其中：",[80,1120,1123],{"className":1121,"code":1122,"language":85,"meta":86},[83],"cyankiwi\n→ Hugging Face 用户 \u002F 组织\n\nQwen3.8-27B-AWQ-INT4\n→ 模型仓库名称\n",[57,1124,1122],{"__ignoreMap":86},[22,1126,1127,1129],{},[57,1128,1093],{}," 是 Hugging Face Hub 官方命令行工具，可以完成：",[80,1131,1134],{"className":1132,"code":1133,"language":85,"meta":86},[83],"登录\n下载模型\n上传文件\n查看缓存\n管理仓库\n",[57,1135,1133],{"__ignoreMap":86},[70,1137],{},[14,1139,1141],{"id":1140},"_92-安装-hugging-face-cli","9.2 安装 Hugging Face CLI",[22,1143,1144,1146,1147,1150],{},[57,1145,1093],{}," 命令由 Python 包 ",[57,1148,1149],{},"huggingface_hub"," 提供。",[22,1152,1153],{},"建议在专门用于 Qwen 部署的 Conda 环境中安装：",[80,1155,1157],{"className":135,"code":1156,"language":137,"meta":86,"style":86},"# 进入自己的 Qwen Python \u002F Conda 环境\n# 如果已经进入目标环境，可以跳过这一步\nconda activate \u002Fdata\u002Fconda_envs\u002Fqwen\n\n# 安装或升级 huggingface_hub\n# -U：upgrade，升级到较新的版本\npython -m pip install -U huggingface_hub\n",[57,1158,1159,1164,1169,1180,1184,1189,1194],{"__ignoreMap":86},[141,1160,1161],{"class":143,"line":144},[141,1162,1163],{"class":147},"# 进入自己的 Qwen Python \u002F Conda 环境\n",[141,1165,1166],{"class":143,"line":151},[141,1167,1168],{"class":147},"# 如果已经进入目标环境，可以跳过这一步\n",[141,1170,1171,1174,1177],{"class":143,"line":283},[141,1172,1173],{"class":154},"conda",[141,1175,1176],{"class":158}," activate",[141,1178,1179],{"class":158}," \u002Fdata\u002Fconda_envs\u002Fqwen\n",[141,1181,1182],{"class":143,"line":290},[141,1183,287],{"emptyLinePlaceholder":286},[141,1185,1186],{"class":143,"line":296},[141,1187,1188],{"class":147},"# 安装或升级 huggingface_hub\n",[141,1190,1191],{"class":143,"line":717},[141,1192,1193],{"class":147},"# -U：upgrade，升级到较新的版本\n",[141,1195,1196,1199,1202,1205,1208,1211],{"class":143,"line":842},[141,1197,1198],{"class":154},"python",[141,1200,1201],{"class":446}," -m",[141,1203,1204],{"class":158}," pip",[141,1206,1207],{"class":158}," install",[141,1209,1210],{"class":446}," -U",[141,1212,1213],{"class":158}," huggingface_hub\n",[22,1215,1216],{},"安装后检查：",[80,1218,1220],{"className":135,"code":1219,"language":137,"meta":86,"style":86},"# 查看 hf 命令位于哪里\nwhich hf\n\n# 查看 hf CLI 帮助，能正常输出说明安装成功\nhf --help\n\n# 查看 huggingface_hub Python 包版本\npython -m pip show huggingface_hub\n",[57,1221,1222,1227,1234,1238,1243,1250,1254,1259],{"__ignoreMap":86},[141,1223,1224],{"class":143,"line":144},[141,1225,1226],{"class":147},"# 查看 hf 命令位于哪里\n",[141,1228,1229,1231],{"class":143,"line":151},[141,1230,650],{"class":446},[141,1232,1233],{"class":158}," hf\n",[141,1235,1236],{"class":143,"line":283},[141,1237,287],{"emptyLinePlaceholder":286},[141,1239,1240],{"class":143,"line":290},[141,1241,1242],{"class":147},"# 查看 hf CLI 帮助，能正常输出说明安装成功\n",[141,1244,1245,1247],{"class":143,"line":296},[141,1246,1093],{"class":154},[141,1248,1249],{"class":446}," --help\n",[141,1251,1252],{"class":143,"line":717},[141,1253,287],{"emptyLinePlaceholder":286},[141,1255,1256],{"class":143,"line":842},[141,1257,1258],{"class":147},"# 查看 huggingface_hub Python 包版本\n",[141,1260,1261,1263,1265,1267,1270],{"class":143,"line":848},[141,1262,1198],{"class":154},[141,1264,1201],{"class":446},[141,1266,1204],{"class":158},[141,1268,1269],{"class":158}," show",[141,1271,1213],{"class":158},[217,1273,1275,1276],{"id":1274},"为什么不再推荐-huggingface-cli","为什么不再推荐 ",[57,1277,1278],{},"huggingface-cli",[22,1280,1281],{},"旧教程经常使用：",[80,1283,1285],{"className":135,"code":1284,"language":137,"meta":86,"style":86},"huggingface-cli download ...\n",[57,1286,1287],{"__ignoreMap":86},[141,1288,1289,1291,1294],{"class":143,"line":144},[141,1290,1278],{"class":154},[141,1292,1293],{"class":158}," download",[141,1295,1296],{"class":158}," ...\n",[22,1298,1299],{},"较新的 Hugging Face Hub 已经统一推荐：",[80,1301,1303],{"className":135,"code":1302,"language":137,"meta":86,"style":86},"hf download ...\n",[57,1304,1305],{"__ignoreMap":86},[141,1306,1307,1309,1311],{"class":143,"line":144},[141,1308,1093],{"class":154},[141,1310,1293],{"class":158},[141,1312,1296],{"class":158},[22,1314,1315],{},"如果终端提示：",[80,1317,1320],{"className":1318,"code":1319,"language":85,"meta":86},[83],"huggingface-cli is deprecated\n",[57,1321,1319],{"__ignoreMap":86},[22,1323,1324,1325,1327],{},"直接改用 ",[57,1326,1093],{}," 即可。",[70,1329],{},[14,1331,1333],{"id":1332},"_93-是否需要登录-hugging-face","9.3 是否需要登录 Hugging Face",[22,1335,1336],{},"如果模型仓库是公开的，很多情况下可以直接下载。",[22,1338,1339],{},"如果仓库需要授权、访问受限，或者匿名下载受到限制，则需要登录。",[22,1341,1342],{},"交互式登录：",[80,1344,1346],{"className":135,"code":1345,"language":137,"meta":86,"style":86},"# 登录 Hugging Face\n# 执行后终端会提示输入 Access Token\nhf auth login\n",[57,1347,1348,1353,1358],{"__ignoreMap":86},[141,1349,1350],{"class":143,"line":144},[141,1351,1352],{"class":147},"# 登录 Hugging Face\n",[141,1354,1355],{"class":143,"line":151},[141,1356,1357],{"class":147},"# 执行后终端会提示输入 Access Token\n",[141,1359,1360,1362,1365],{"class":143,"line":283},[141,1361,1093],{"class":154},[141,1363,1364],{"class":158}," auth",[141,1366,1367],{"class":158}," login\n",[22,1369,1370],{},"检查当前账号：",[80,1372,1374],{"className":135,"code":1373,"language":137,"meta":86,"style":86},"# 查看当前登录的 Hugging Face 用户\nhf auth whoami\n",[57,1375,1376,1381],{"__ignoreMap":86},[141,1377,1378],{"class":143,"line":144},[141,1379,1380],{"class":147},"# 查看当前登录的 Hugging Face 用户\n",[141,1382,1383,1385,1387],{"class":143,"line":151},[141,1384,1093],{"class":154},[141,1386,1364],{"class":158},[141,1388,1389],{"class":158}," whoami\n",[22,1391,1392],{},"也可以使用环境变量：",[80,1394,1396],{"className":135,"code":1395,"language":137,"meta":86,"style":86},"# 把 Hugging Face Token 保存到当前 Shell\n# 不要把真实 Token 提交到 Git 或公开教程\nexport HF_TOKEN='你的_HuggingFace_Access_Token'\n",[57,1397,1398,1403,1408],{"__ignoreMap":86},[141,1399,1400],{"class":143,"line":144},[141,1401,1402],{"class":147},"# 把 Hugging Face Token 保存到当前 Shell\n",[141,1404,1405],{"class":143,"line":151},[141,1406,1407],{"class":147},"# 不要把真实 Token 提交到 Git 或公开教程\n",[141,1409,1410,1413,1416,1418],{"class":143,"line":283},[141,1411,1412],{"class":269},"export",[141,1414,1415],{"class":276}," HF_TOKEN",[141,1417,791],{"class":269},[141,1419,1420],{"class":158},"'你的_HuggingFace_Access_Token'\n",[22,1422,1423,1424,1427],{},"Hugging Face Token 和后面 vLLM 的 ",[57,1425,1426],{},"--api-key"," 不是同一个东西：",[80,1429,1432],{"className":1430,"code":1431,"language":85,"meta":86},[83],"HF_TOKEN\n→ 用来访问 Hugging Face 下载模型\n\nVLLM_API_KEY\n→ 用来保护自己部署的 vLLM API\n",[57,1433,1431],{"__ignoreMap":86},[70,1435],{},[14,1437,1439],{"id":1438},"_94-创建模型存储目录","9.4 创建模型存储目录",[22,1441,1442,1443,1446],{},"本次不把模型下载到系统根分区，而是统一放到容量更大的 ",[57,1444,1445],{},"\u002Fdata","：",[80,1448,1450],{"className":135,"code":1449,"language":137,"meta":86,"style":86},"# 创建模型根目录\n# -p：父目录不存在时一起创建；目录已经存在也不会报错\nmkdir -p \u002Fdata\u002Fqwen\u002Fmodels\n",[57,1451,1452,1457,1462],{"__ignoreMap":86},[141,1453,1454],{"class":143,"line":144},[141,1455,1456],{"class":147},"# 创建模型根目录\n",[141,1458,1459],{"class":143,"line":151},[141,1460,1461],{"class":147},"# -p：父目录不存在时一起创建；目录已经存在也不会报错\n",[141,1463,1464,1466,1468],{"class":143,"line":283},[141,1465,1021],{"class":154},[141,1467,1024],{"class":446},[141,1469,1027],{"class":158},[22,1471,1472],{},"推荐目录结构：",[80,1474,1477],{"className":1475,"code":1476,"language":85,"meta":86},[83],"\u002Fdata\u002Fqwen\u002F\n├── models\u002F\n│   ├── Qwen3.8-27B-AWQ-INT4\u002F\n│   └── Qwen3.8-27B-AWQ-BF16-INT4\u002F\n├── vllm-cache\u002F\n└── tmp\u002F\n",[57,1478,1476],{"__ignoreMap":86},[70,1480],{},[14,1482,1484],{"id":1483},"_95-下载本次最终使用的-awq-int4-模型","9.5 下载本次最终使用的 AWQ-INT4 模型",[22,1486,1487],{},"本次最终部署的是：",[80,1489,1491],{"className":1490,"code":1113,"language":85,"meta":86},[83],[57,1492,1113],{"__ignoreMap":86},[22,1494,1495],{},"推荐命令：",[80,1497,1499],{"className":135,"code":1498,"language":137,"meta":86,"style":86},"# hf download：\n# 下载 Hugging Face 仓库中的模型文件\n#\n# cyankiwi\u002FQwen3.8-27B-AWQ-INT4：\n# Hugging Face 仓库 ID\n#\n# --local-dir：\n# 指定模型最终保存到哪个本地目录\nhf download \\\n  cyankiwi\u002FQwen3.8-27B-AWQ-INT4 \\\n  --local-dir \u002Fdata\u002Fqwen\u002Fmodels\u002FQwen3.8-27B-AWQ-INT4\n",[57,1500,1501,1506,1511,1515,1520,1525,1529,1534,1539,1547,1554],{"__ignoreMap":86},[141,1502,1503],{"class":143,"line":144},[141,1504,1505],{"class":147},"# hf download：\n",[141,1507,1508],{"class":143,"line":151},[141,1509,1510],{"class":147},"# 下载 Hugging Face 仓库中的模型文件\n",[141,1512,1513],{"class":143,"line":283},[141,1514,825],{"class":147},[141,1516,1517],{"class":143,"line":290},[141,1518,1519],{"class":147},"# cyankiwi\u002FQwen3.8-27B-AWQ-INT4：\n",[141,1521,1522],{"class":143,"line":296},[141,1523,1524],{"class":147},"# Hugging Face 仓库 ID\n",[141,1526,1527],{"class":143,"line":717},[141,1528,825],{"class":147},[141,1530,1531],{"class":143,"line":842},[141,1532,1533],{"class":147},"# --local-dir：\n",[141,1535,1536],{"class":143,"line":848},[141,1537,1538],{"class":147},"# 指定模型最终保存到哪个本地目录\n",[141,1540,1541,1543,1545],{"class":143,"line":854},[141,1542,1093],{"class":154},[141,1544,1293],{"class":158},[141,1546,864],{"class":446},[141,1548,1549,1552],{"class":143,"line":867},[141,1550,1551],{"class":158},"  cyankiwi\u002FQwen3.8-27B-AWQ-INT4",[141,1553,864],{"class":446},[141,1555,1556,1559],{"class":143,"line":875},[141,1557,1558],{"class":446},"  --local-dir",[141,1560,1561],{"class":158}," \u002Fdata\u002Fqwen\u002Fmodels\u002FQwen3.8-27B-AWQ-INT4\n",[22,1563,1564],{},"一行版：",[80,1566,1568],{"className":135,"code":1567,"language":137,"meta":86,"style":86},"hf download cyankiwi\u002FQwen3.8-27B-AWQ-INT4 --local-dir \u002Fdata\u002Fqwen\u002Fmodels\u002FQwen3.8-27B-AWQ-INT4\n",[57,1569,1570],{"__ignoreMap":86},[141,1571,1572,1574,1576,1579,1582],{"class":143,"line":144},[141,1573,1093],{"class":154},[141,1575,1293],{"class":158},[141,1577,1578],{"class":158}," cyankiwi\u002FQwen3.8-27B-AWQ-INT4",[141,1580,1581],{"class":446}," --local-dir",[141,1583,1561],{"class":158},[22,1585,1586],{},"下载完成以后，宿主机模型路径就是：",[80,1588,1590],{"className":1589,"code":475,"language":85,"meta":86},[83],[57,1591,475],{"__ignoreMap":86},[70,1593],{},[14,1595,1597],{"id":1596},"_96-下载另一个-awq-bf16-int4-版本","9.6 下载另一个 AWQ-BF16-INT4 版本",[22,1599,1600],{},"本次还准备过：",[80,1602,1605],{"className":1603,"code":1604,"language":85,"meta":86},[83],"cyankiwi\u002FQwen3.8-27B-AWQ-BF16-INT4\n",[57,1606,1604],{"__ignoreMap":86},[22,1608,1609],{},"下载：",[80,1611,1613],{"className":135,"code":1612,"language":137,"meta":86,"style":86},"# 下载另一个显存压力更大的量化版本\nhf download \\\n  cyankiwi\u002FQwen3.8-27B-AWQ-BF16-INT4 \\\n  --local-dir \u002Fdata\u002Fqwen\u002Fmodels\u002FQwen3.8-27B-AWQ-BF16-INT4\n",[57,1614,1615,1620,1628,1635],{"__ignoreMap":86},[141,1616,1617],{"class":143,"line":144},[141,1618,1619],{"class":147},"# 下载另一个显存压力更大的量化版本\n",[141,1621,1622,1624,1626],{"class":143,"line":151},[141,1623,1093],{"class":154},[141,1625,1293],{"class":158},[141,1627,864],{"class":446},[141,1629,1630,1633],{"class":143,"line":283},[141,1631,1632],{"class":158},"  cyankiwi\u002FQwen3.8-27B-AWQ-BF16-INT4",[141,1634,864],{"class":446},[141,1636,1637,1639],{"class":143,"line":290},[141,1638,1558],{"class":446},[141,1640,1641],{"class":158}," \u002Fdata\u002Fqwen\u002Fmodels\u002FQwen3.8-27B-AWQ-BF16-INT4\n",[22,1643,1564],{},[80,1645,1647],{"className":135,"code":1646,"language":137,"meta":86,"style":86},"hf download cyankiwi\u002FQwen3.8-27B-AWQ-BF16-INT4 --local-dir \u002Fdata\u002Fqwen\u002Fmodels\u002FQwen3.8-27B-AWQ-BF16-INT4\n",[57,1648,1649],{"__ignoreMap":86},[141,1650,1651,1653,1655,1658,1660],{"class":143,"line":144},[141,1652,1093],{"class":154},[141,1654,1293],{"class":158},[141,1656,1657],{"class":158}," cyankiwi\u002FQwen3.8-27B-AWQ-BF16-INT4",[141,1659,1581],{"class":446},[141,1661,1641],{"class":158},[22,1663,1664,1665,1668],{},"两者都属于 27B 模型，但本次最终选择 ",[57,1666,1667],{},"AWQ-INT4","，因为它能给 KV Cache 留出更多显存。",[70,1670],{},[14,1672,1674],{"id":1673},"_97-下载中断后怎么办","9.7 下载中断后怎么办",[22,1676,1677],{},"下载几十 GB 的模型时，中途断网并不罕见。",[22,1679,1680],{},"一般情况下，重新执行同一条：",[80,1682,1683],{"className":135,"code":1567,"language":137,"meta":86,"style":86},[57,1684,1685],{"__ignoreMap":86},[141,1686,1687,1689,1691,1693,1695],{"class":143,"line":144},[141,1688,1093],{"class":154},[141,1690,1293],{"class":158},[141,1692,1578],{"class":158},[141,1694,1581],{"class":446},[141,1696,1561],{"class":158},[22,1698,1699],{},"Hugging Face Hub 会重新检查已有文件，并继续处理缺失或未完成的内容。",[22,1701,1702],{},"因此不需要因为一次网络中断就删除整个模型目录重新下载。",[70,1704],{},[14,1706,1708],{"id":1707},"_98-下载完成后检查模型文件","9.8 下载完成后检查模型文件",[22,1710,1711],{},"先看目录：",[80,1713,1715],{"className":135,"code":1714,"language":137,"meta":86,"style":86},"# 查看模型目录中的文件\nls -lh \u002Fdata\u002Fqwen\u002Fmodels\u002FQwen3.8-27B-AWQ-INT4\n",[57,1716,1717,1722],{"__ignoreMap":86},[141,1718,1719],{"class":143,"line":144},[141,1720,1721],{"class":147},"# 查看模型目录中的文件\n",[141,1723,1724,1727,1730],{"class":143,"line":151},[141,1725,1726],{"class":154},"ls",[141,1728,1729],{"class":446}," -lh",[141,1731,1561],{"class":158},[22,1733,1734],{},"查看总大小：",[80,1736,1738],{"className":135,"code":1737,"language":137,"meta":86,"style":86},"# -s：只显示总大小\n# -h：使用 GB \u002F MB 等人类可读单位\n# du：查看目录占用空间\n\ndu -sh \u002Fdata\u002Fqwen\u002Fmodels\u002FQwen3.8-27B-AWQ-INT4\n",[57,1739,1740,1745,1750,1755,1759],{"__ignoreMap":86},[141,1741,1742],{"class":143,"line":144},[141,1743,1744],{"class":147},"# -s：只显示总大小\n",[141,1746,1747],{"class":143,"line":151},[141,1748,1749],{"class":147},"# -h：使用 GB \u002F MB 等人类可读单位\n",[141,1751,1752],{"class":143,"line":283},[141,1753,1754],{"class":147},"# du：查看目录占用空间\n",[141,1756,1757],{"class":143,"line":290},[141,1758,287],{"emptyLinePlaceholder":286},[141,1760,1761,1764,1767],{"class":143,"line":296},[141,1762,1763],{"class":154},"du",[141,1765,1766],{"class":446}," -sh",[141,1768,1561],{"class":158},[22,1770,1771],{},"通常会看到一些重要文件：",[80,1773,1776],{"className":1774,"code":1775,"language":85,"meta":86},[83],"config.json\n生成配置相关 JSON\nTokenizer 相关文件\n*.safetensors\n模型索引文件\nProcessor \u002F 多模态相关配置\n",[57,1777,1775],{"__ignoreMap":86},[22,1779,1780],{},"具体文件名取决于仓库内容。",[70,1782],{},[14,1784,1786,1787],{"id":1785},"_99-检查-configjson","9.9 检查 ",[57,1788,1789],{},"config.json",[22,1791,1792,1794],{},[57,1793,1789],{}," 是模型最重要的配置文件之一。",[22,1796,1797],{},"vLLM 会从中读取：",[80,1799,1802],{"className":1800,"code":1801,"language":85,"meta":86},[83],"模型架构\n隐藏层配置\n最大上下文配置\n量化信息\n部分多模态配置\n",[57,1803,1801],{"__ignoreMap":86},[22,1805,1806],{},"查看前 40 行：",[80,1808,1810],{"className":135,"code":1809,"language":137,"meta":86,"style":86},"# 查看 config.json 前 40 行\nhead -n 40 \u002Fdata\u002Fqwen\u002Fmodels\u002FQwen3.8-27B-AWQ-INT4\u002Fconfig.json\n",[57,1811,1812,1817],{"__ignoreMap":86},[141,1813,1814],{"class":143,"line":144},[141,1815,1816],{"class":147},"# 查看 config.json 前 40 行\n",[141,1818,1819,1822,1824,1827],{"class":143,"line":151},[141,1820,1821],{"class":154},"head",[141,1823,447],{"class":446},[141,1825,1826],{"class":446}," 40",[141,1828,1829],{"class":158}," \u002Fdata\u002Fqwen\u002Fmodels\u002FQwen3.8-27B-AWQ-INT4\u002Fconfig.json\n",[22,1831,1832],{},"搜索架构：",[80,1834,1836],{"className":135,"code":1835,"language":137,"meta":86,"style":86},"# -n：显示匹配行号\n# 搜索 architectures 字段\ngrep -n '\"architectures\"' \u002Fdata\u002Fqwen\u002Fmodels\u002FQwen3.8-27B-AWQ-INT4\u002Fconfig.json\n",[57,1837,1838,1843,1848],{"__ignoreMap":86},[141,1839,1840],{"class":143,"line":144},[141,1841,1842],{"class":147},"# -n：显示匹配行号\n",[141,1844,1845],{"class":143,"line":151},[141,1846,1847],{"class":147},"# 搜索 architectures 字段\n",[141,1849,1850,1853,1855,1858],{"class":143,"line":283},[141,1851,1852],{"class":154},"grep",[141,1854,447],{"class":446},[141,1856,1857],{"class":158}," '\"architectures\"'",[141,1859,1829],{"class":158},[22,1861,1862],{},"如果想查最大位置 \u002F 上下文相关配置，也可以：",[80,1864,1866],{"className":135,"code":1865,"language":137,"meta":86,"style":86},"# 搜索常见上下文长度字段；不同模型字段名称可能不同\ngrep -n -E 'max_position|max_seq|rope' \u002Fdata\u002Fqwen\u002Fmodels\u002FQwen3.8-27B-AWQ-INT4\u002Fconfig.json\n",[57,1867,1868,1873],{"__ignoreMap":86},[141,1869,1870],{"class":143,"line":144},[141,1871,1872],{"class":147},"# 搜索常见上下文长度字段；不同模型字段名称可能不同\n",[141,1874,1875,1877,1879,1882,1885],{"class":143,"line":151},[141,1876,1852],{"class":154},[141,1878,447],{"class":446},[141,1880,1881],{"class":446}," -E",[141,1883,1884],{"class":158}," 'max_position|max_seq|rope'",[141,1886,1829],{"class":158},[70,1888],{},[14,1890,1892],{"id":1891},"_910-为什么本教程选择先下载到本地","9.10 为什么本教程选择“先下载到本地”",[22,1894,1895],{},"vLLM 也可以在某些情况下直接使用 Hugging Face 仓库 ID，让运行时自动下载模型。",[22,1897,1898],{},"本次没有采用这种方式，而是：",[80,1900,1903],{"className":1901,"code":1902,"language":85,"meta":86},[83],"先 hf download\n↓\n固定模型目录\n↓\nDocker 只读挂载\n↓\nvLLM 加载本地路径\n",[57,1904,1902],{"__ignoreMap":86},[22,1906,480],{},[80,1908,1911],{"className":1909,"code":1910,"language":85,"meta":86},[83],"模型位置明确\n容器删除后模型仍然存在\n重新创建容器不需要重新下载\n方便比较不同量化版本\n方便检查模型大小和完整性\n减少 Docker 层和模型文件混在一起\n",[57,1912,1910],{"__ignoreMap":86},[22,1914,1915],{},"Docker 中使用：",[80,1917,1919],{"className":135,"code":1918,"language":137,"meta":86,"style":86},"# 宿主机 \u002Fdata\u002Fqwen\u002Fmodels\n# 映射成容器里的 \u002Fmodels\n# :ro 表示 read-only，只读\n-v \u002Fdata\u002Fqwen\u002Fmodels:\u002Fmodels:ro\n",[57,1920,1921,1926,1931,1936],{"__ignoreMap":86},[141,1922,1923],{"class":143,"line":144},[141,1924,1925],{"class":147},"# 宿主机 \u002Fdata\u002Fqwen\u002Fmodels\n",[141,1927,1928],{"class":143,"line":151},[141,1929,1930],{"class":147},"# 映射成容器里的 \u002Fmodels\n",[141,1932,1933],{"class":143,"line":283},[141,1934,1935],{"class":147},"# :ro 表示 read-only，只读\n",[141,1937,1938,1941],{"class":143,"line":290},[141,1939,1940],{"class":154},"-v",[141,1942,1943],{"class":158}," \u002Fdata\u002Fqwen\u002Fmodels:\u002Fmodels:ro\n",[22,1945,1946],{},"所以宿主机：",[80,1948,1950],{"className":1949,"code":475,"language":85,"meta":86},[83],[57,1951,475],{"__ignoreMap":86},[22,1953,1954],{},"在容器中就变成：",[80,1956,1959],{"className":1957,"code":1958,"language":85,"meta":86},[83],"\u002Fmodels\u002FQwen3.8-27B-AWQ-INT4\n",[57,1960,1958],{"__ignoreMap":86},[22,1962,1963,1964,1967],{},"这也解释了最终 ",[57,1965,1966],{},"docker run"," 为什么写：",[80,1969,1971],{"className":1970,"code":1958,"language":85,"meta":86},[83],[57,1972,1958],{"__ignoreMap":86},[22,1974,1975],{},"而不是宿主机完整路径。",[70,1977],{},[14,1979,1981],{"id":1980},"_911-hugging-face-下载常见错误","9.11 Hugging Face 下载常见错误",[217,1983,1985],{"id":1984},"hf-command-not-found",[57,1986,1987],{},"hf: command not found",[22,1989,1990],{},"说明当前 Python 环境没有安装 CLI，或者 PATH 没找到它：",[80,1992,1994],{"className":135,"code":1993,"language":137,"meta":86,"style":86},"# 在当前 Python 环境安装 \u002F 升级\npython -m pip install -U huggingface_hub\n\n# 再检查\nwhich hf\nhf --help\n",[57,1995,1996,2001,2015,2019,2024,2030],{"__ignoreMap":86},[141,1997,1998],{"class":143,"line":144},[141,1999,2000],{"class":147},"# 在当前 Python 环境安装 \u002F 升级\n",[141,2002,2003,2005,2007,2009,2011,2013],{"class":143,"line":151},[141,2004,1198],{"class":154},[141,2006,1201],{"class":446},[141,2008,1204],{"class":158},[141,2010,1207],{"class":158},[141,2012,1210],{"class":446},[141,2014,1213],{"class":158},[141,2016,2017],{"class":143,"line":283},[141,2018,287],{"emptyLinePlaceholder":286},[141,2020,2021],{"class":143,"line":290},[141,2022,2023],{"class":147},"# 再检查\n",[141,2025,2026,2028],{"class":143,"line":296},[141,2027,650],{"class":446},[141,2029,1233],{"class":158},[141,2031,2032,2034],{"class":143,"line":717},[141,2033,1093],{"class":154},[141,2035,1249],{"class":446},[217,2037,2039],{"id":2038},"huggingface-cli-is-deprecated",[57,2040,2041],{},"huggingface-cli is deprecated",[22,2043,2044],{},"不要继续使用旧命令：",[80,2046,2049],{"className":2047,"code":2048,"language":85,"meta":86},[83],"huggingface-cli download\n",[57,2050,2048],{"__ignoreMap":86},[22,2052,2053],{},"改成：",[80,2055,2058],{"className":2056,"code":2057,"language":85,"meta":86},[83],"hf download\n",[57,2059,2057],{"__ignoreMap":86},[217,2061,2063],{"id":2062},"hugging-face-无法连接","Hugging Face 无法连接",[22,2065,2066],{},"先测试网络：",[80,2068,2070],{"className":135,"code":2069,"language":137,"meta":86,"style":86},"# -I：只获取 HTTP 响应头，不下载完整网页\ncurl -I https:\u002F\u002Fhuggingface.co\n",[57,2071,2072,2077],{"__ignoreMap":86},[141,2073,2074],{"class":143,"line":144},[141,2075,2076],{"class":147},"# -I：只获取 HTTP 响应头，不下载完整网页\n",[141,2078,2079,2082,2085],{"class":143,"line":151},[141,2080,2081],{"class":154},"curl",[141,2083,2084],{"class":446}," -I",[141,2086,2087],{"class":158}," https:\u002F\u002Fhuggingface.co\n",[22,2089,2090],{},"如果服务器必须通过代理联网，可在当前 Shell 临时设置：",[80,2092,2094],{"className":135,"code":2093,"language":137,"meta":86,"style":86},"# HTTP 代理；端口根据自己的代理实际配置填写\nexport http_proxy=http:\u002F\u002F127.0.0.1:代理端口\n\n# HTTPS 代理\nexport https_proxy=http:\u002F\u002F127.0.0.1:代理端口\n",[57,2095,2096,2101,2113,2117,2122],{"__ignoreMap":86},[141,2097,2098],{"class":143,"line":144},[141,2099,2100],{"class":147},"# HTTP 代理；端口根据自己的代理实际配置填写\n",[141,2102,2103,2105,2108,2110],{"class":143,"line":151},[141,2104,1412],{"class":269},[141,2106,2107],{"class":276}," http_proxy",[141,2109,791],{"class":269},[141,2111,2112],{"class":276},"http:\u002F\u002F127.0.0.1:代理端口\n",[141,2114,2115],{"class":143,"line":283},[141,2116,287],{"emptyLinePlaceholder":286},[141,2118,2119],{"class":143,"line":290},[141,2120,2121],{"class":147},"# HTTPS 代理\n",[141,2123,2124,2126,2129,2131],{"class":143,"line":296},[141,2125,1412],{"class":269},[141,2127,2128],{"class":276}," https_proxy",[141,2130,791],{"class":269},[141,2132,2112],{"class":276},[22,2134,2135],{},"再执行：",[80,2137,2138],{"className":135,"code":1567,"language":137,"meta":86,"style":86},[57,2139,2140],{"__ignoreMap":86},[141,2141,2142,2144,2146,2148,2150],{"class":143,"line":144},[141,2143,1093],{"class":154},[141,2145,1293],{"class":158},[141,2147,1578],{"class":158},[141,2149,1581],{"class":446},[141,2151,1561],{"class":158},[22,2153,2154,2155,2158,2159,2161],{},"如果代理只运行在另一台电脑上，需要保证服务器能真正访问那个代理地址，不能把服务器自己的 ",[57,2156,2157],{},"127.0.0.1"," 和另一台电脑的 ",[57,2160,2157],{}," 混淆。",[70,2163],{},[10,2165,2167],{"id":2166},"_10-拉取-vllm-镜像","10. 拉取 vLLM 镜像",[80,2169,2171],{"className":135,"code":2170,"language":137,"meta":86,"style":86},"# 下载 vLLM OpenAI-Compatible Server 镜像\ndocker pull vllm\u002Fvllm-openai:latest\n",[57,2172,2173,2178],{"__ignoreMap":86},[141,2174,2175],{"class":143,"line":144},[141,2176,2177],{"class":147},"# 下载 vLLM OpenAI-Compatible Server 镜像\n",[141,2179,2180,2182,2184],{"class":143,"line":151},[141,2181,155],{"class":154},[141,2183,159],{"class":158},[141,2185,162],{"class":158},[22,2187,2188],{},"确认：",[80,2190,2192],{"className":135,"code":2191,"language":137,"meta":86,"style":86},"# 查看镜像\ndocker images | grep vllm\n",[57,2193,2194,2199],{"__ignoreMap":86},[141,2195,2196],{"class":143,"line":144},[141,2197,2198],{"class":147},"# 查看镜像\n",[141,2200,2201,2203,2206,2208,2210],{"class":143,"line":151},[141,2202,155],{"class":154},[141,2204,2205],{"class":158}," images",[141,2207,751],{"class":269},[141,2209,754],{"class":154},[141,2211,2212],{"class":158}," vllm\n",[70,2214],{},[10,2216,2218],{"id":2217},"_11-api-keyopenssl-和-bearer","11. API Key、OpenSSL 和 Bearer",[14,2220,2222],{"id":2221},"_111-为什么需要-api-key","11.1 为什么需要 API Key",[22,2224,2225],{},"服务如果开放到：",[80,2227,2230],{"className":2228,"code":2229,"language":85,"meta":86},[83],"http:\u002F\u002F服务器IP:8000\n",[57,2231,2229],{"__ignoreMap":86},[22,2233,2234],{},"就应该加鉴权，避免任意用户直接调用。",[22,2236,2237],{},"vLLM 使用：",[80,2239,2241],{"className":135,"code":2240,"language":137,"meta":86,"style":86},"--api-key \u003CKEY>\n",[57,2242,2243],{"__ignoreMap":86},[141,2244,2245,2247,2249,2252,2255],{"class":143,"line":144},[141,2246,1426],{"class":154},[141,2248,270],{"class":269},[141,2250,2251],{"class":158},"KE",[141,2253,2254],{"class":276},"Y",[141,2256,280],{"class":269},[22,2258,2259],{},"开启 API Key 验证。",[70,2261],{},[14,2263,2265],{"id":2264},"_112-openssl-是什么","11.2 OpenSSL 是什么",[22,2267,2268],{},"OpenSSL 是一个常用的密码学和 TLS 工具集，常见能力包括：",[80,2270,2273],{"className":2271,"code":2272,"language":85,"meta":86},[83],"生成随机数\n计算哈希\n生成密钥\n处理证书\nTLS \u002F HTTPS\n",[57,2274,2272],{"__ignoreMap":86},[22,2276,2277],{},"本次部署只用到了它的：",[80,2279,2282],{"className":2280,"code":2281,"language":85,"meta":86},[83],"安全随机数生成\n",[57,2283,2281],{"__ignoreMap":86},[22,2285,2286],{},"命令：",[80,2288,2290],{"className":135,"code":2289,"language":137,"meta":86,"style":86},"# openssl：\n# 调用 OpenSSL\n#\n# rand：\n# 生成密码学安全随机数据\n#\n# -hex：\n# 以十六进制字符串输出\n#\n# 32：\n# 生成 32 字节随机数据\n# 32 字节 = 256 bit\nopenssl rand -hex 32\n",[57,2291,2292,2297,2302,2306,2311,2316,2320,2325,2330,2334,2339,2344,2349],{"__ignoreMap":86},[141,2293,2294],{"class":143,"line":144},[141,2295,2296],{"class":147},"# openssl：\n",[141,2298,2299],{"class":143,"line":151},[141,2300,2301],{"class":147},"# 调用 OpenSSL\n",[141,2303,2304],{"class":143,"line":283},[141,2305,825],{"class":147},[141,2307,2308],{"class":143,"line":290},[141,2309,2310],{"class":147},"# rand：\n",[141,2312,2313],{"class":143,"line":296},[141,2314,2315],{"class":147},"# 生成密码学安全随机数据\n",[141,2317,2318],{"class":143,"line":717},[141,2319,825],{"class":147},[141,2321,2322],{"class":143,"line":842},[141,2323,2324],{"class":147},"# -hex：\n",[141,2326,2327],{"class":143,"line":848},[141,2328,2329],{"class":147},"# 以十六进制字符串输出\n",[141,2331,2332],{"class":143,"line":854},[141,2333,825],{"class":147},[141,2335,2336],{"class":143,"line":867},[141,2337,2338],{"class":147},"# 32：\n",[141,2340,2341],{"class":143,"line":875},[141,2342,2343],{"class":147},"# 生成 32 字节随机数据\n",[141,2345,2346],{"class":143,"line":886},[141,2347,2348],{"class":147},"# 32 字节 = 256 bit\n",[141,2350,2351,2354,2357,2360],{"class":143,"line":894},[141,2352,2353],{"class":154},"openssl",[141,2355,2356],{"class":158}," rand",[141,2358,2359],{"class":446}," -hex",[141,2361,2362],{"class":446}," 32\n",[22,2364,2365],{},"由于：",[80,2367,2370],{"className":2368,"code":2369,"language":85,"meta":86},[83],"1 字节 = 2 个十六进制字符\n",[57,2371,2369],{"__ignoreMap":86},[22,2373,2374],{},"所以会得到：",[80,2376,2379],{"className":2377,"code":2378,"language":85,"meta":86},[83],"64 个十六进制字符\n",[57,2380,2378],{"__ignoreMap":86},[22,2382,2383],{},"这里的 OpenSSL：",[19,2385,2386],{},[22,2387,2388],{},"只是用来生成一个难以猜测的 API Key，并不是在给模型本身加密。",[70,2390],{},[14,2392,2394],{"id":2393},"_113-用环境变量保存-api-key","11.3 用环境变量保存 API Key",[80,2396,2398],{"className":135,"code":2397,"language":137,"meta":86,"style":86},"# 把 API Key 保存到当前 Shell 的环境变量\nexport VLLM_API_KEY='你的API_KEY'\n",[57,2399,2400,2405],{"__ignoreMap":86},[141,2401,2402],{"class":143,"line":144},[141,2403,2404],{"class":147},"# 把 API Key 保存到当前 Shell 的环境变量\n",[141,2406,2407,2409,2412,2414],{"class":143,"line":151},[141,2408,1412],{"class":269},[141,2410,2411],{"class":276}," VLLM_API_KEY",[141,2413,791],{"class":269},[141,2415,2416],{"class":158},"'你的API_KEY'\n",[22,2418,2419],{},"检查长度：",[80,2421,2423],{"className":135,"code":2422,"language":137,"meta":86,"style":86},"# 只查看长度，不直接打印 Key\necho ${#VLLM_API_KEY}\n",[57,2424,2425,2430],{"__ignoreMap":86},[141,2426,2427],{"class":143,"line":144},[141,2428,2429],{"class":147},"# 只查看长度，不直接打印 Key\n",[141,2431,2432,2435,2438,2441],{"class":143,"line":151},[141,2433,2434],{"class":446},"echo",[141,2436,2437],{"class":276}," ${",[141,2439,2440],{"class":269},"#",[141,2442,2443],{"class":276},"VLLM_API_KEY}\n",[22,2445,613],{},[80,2447,2450],{"className":2448,"code":2449,"language":85,"meta":86},[83],"export\n",[57,2451,2449],{"__ignoreMap":86},[22,2453,2454],{},"通常只对当前 Shell 和它启动的子进程生效。",[22,2456,2457],{},"重新 SSH 或新开终端后，可能需要重新设置。",[70,2459],{},[14,2461,2463],{"id":2462},"_114-bearer-是什么","11.4 Bearer 是什么",[22,2465,2466],{},"请求中：",[80,2468,2470],{"className":135,"code":2469,"language":137,"meta":86,"style":86},"-H \"Authorization: Bearer $VLLM_API_KEY\"\n",[57,2471,2472],{"__ignoreMap":86},[141,2473,2474,2477,2480,2483],{"class":143,"line":144},[141,2475,2476],{"class":154},"-H",[141,2478,2479],{"class":158}," \"Authorization: Bearer ",[141,2481,2482],{"class":276},"$VLLM_API_KEY",[141,2484,2485],{"class":158},"\"\n",[22,2487,2488],{},"可以拆成：",[80,2490,2493],{"className":2491,"code":2492,"language":85,"meta":86},[83],"Authorization\n→ HTTP 身份认证请求头\n\nBearer\n→ 使用 Token 作为凭证的认证格式\n\n$VLLM_API_KEY\n→ 真正的 API Key\n",[57,2494,2492],{"__ignoreMap":86},[22,2496,132],{},[80,2498,2501],{"className":2499,"code":2500,"language":85,"meta":86},[83],"Authorization: Bearer abc123\n",[57,2502,2500],{"__ignoreMap":86},[22,2504,2505,2506,2509],{},"其中 ",[57,2507,2508],{},"Bearer"," 不是 API Key 的一部分。",[70,2511],{},[10,2513,2515],{"id":2514},"_12-最终部署命令","12. 最终部署命令",[14,2517,2519],{"id":2518},"_121-教学版","12.1 教学版",[80,2521,2523],{"className":135,"code":2522,"language":137,"meta":86,"style":86},"docker run -d \\\n  \\\n  # 容器名称\n  --name qwen38-int4 \\\n  \\\n  # Docker \u002F 服务器重启后自动恢复\n  --restart unless-stopped \\\n  \\\n  # 使用 NVIDIA Container Runtime\n  --runtime=nvidia \\\n  \\\n  # 让容器看到全部 NVIDIA GPU\n  -e NVIDIA_VISIBLE_DEVICES=all \\\n  \\\n  # vLLM 临时目录\n  -e TMPDIR=\u002Ftmp\u002Fvllm \\\n  \\\n  # 使用宿主机 IPC；\n  # 多 GPU \u002F PyTorch multiprocessing \u002F NCCL 更友好\n  --ipc=host \\\n  \\\n  # 宿主机 8000 → 容器 8000\n  -p 8000:8000 \\\n  \\\n  # 模型目录只读挂载\n  -v \u002Fdata\u002Fqwen\u002Fmodels:\u002Fmodels:ro \\\n  \\\n  # 缓存放到 \u002Fdata，避免继续占根分区\n  -v \u002Fdata\u002Fqwen\u002Fvllm-cache:\u002Froot\u002F.cache \\\n  \\\n  # 临时目录放到 \u002Fdata\n  -v \u002Fdata\u002Fqwen\u002Ftmp:\u002Ftmp\u002Fvllm \\\n  \\\n  # vLLM 官方 OpenAI Server 镜像\n  vllm\u002Fvllm-openai:latest \\\n  \\\n  # 实际加载的模型路径\n  \u002Fmodels\u002FQwen3.8-27B-AWQ-INT4 \\\n  \\\n  # API 对外暴露的模型 ID\n  --served-model-name qwen38 \\\n  \\\n  # 两张 GPU 共同运行同一个模型\n  --tensor-parallel-size 2 \\\n  \\\n  # vLLM 规划使用约 96% GPU 显存\n  --gpu-memory-utilization 0.96 \\\n  \\\n  # 单条 sequence 最大上下文\n  # 114688 = 112 × 1024 = 112K\n  --max-model-len 114688 \\\n  \\\n  # 最大活跃 sequence 数\n  --max-num-seqs 4 \\\n  \\\n  # 强制 eager mode\n  # 更偏稳定和兼容，可能牺牲部分速度\n  --enforce-eager \\\n  \\\n  # 解析 Qwen reasoning \u002F thinking\n  --reasoning-parser qwen3 \\\n  \\\n  # 开启 API Key 鉴权\n  --api-key \"$VLLM_API_KEY\"\n",[57,2524,2525,2536,2541,2546,2556,2560,2565,2575,2579,2584,2596,2600,2605,2613,2618,2624,2634,2639,2645,2651,2664,2669,2675,2686,2691,2697,2708,2713,2719,2729,2734,2740,2750,2755,2761,2769,2774,2780,2788,2793,2799,2810,2815,2821,2832,2837,2843,2854,2859,2865,2871,2882,2887,2893,2904,2909,2915,2921,2929,2934,2940,2951,2956,2962],{"__ignoreMap":86},[141,2526,2527,2529,2531,2534],{"class":143,"line":144},[141,2528,155],{"class":154},[141,2530,301],{"class":158},[141,2532,2533],{"class":446}," -d",[141,2535,864],{"class":446},[141,2537,2538],{"class":143,"line":151},[141,2539,2540],{"class":446},"  \\\n",[141,2542,2543],{"class":143,"line":283},[141,2544,2545],{"class":147},"  # 容器名称\n",[141,2547,2548,2551,2554],{"class":143,"line":290},[141,2549,2550],{"class":154},"  --name",[141,2552,2553],{"class":158}," qwen38-int4",[141,2555,864],{"class":446},[141,2557,2558],{"class":143,"line":296},[141,2559,2540],{"class":446},[141,2561,2562],{"class":143,"line":717},[141,2563,2564],{"class":147},"  # Docker \u002F 服务器重启后自动恢复\n",[141,2566,2567,2570,2573],{"class":143,"line":842},[141,2568,2569],{"class":154},"  --restart",[141,2571,2572],{"class":158}," unless-stopped",[141,2574,864],{"class":446},[141,2576,2577],{"class":143,"line":848},[141,2578,2540],{"class":446},[141,2580,2581],{"class":143,"line":854},[141,2582,2583],{"class":147},"  # 使用 NVIDIA Container Runtime\n",[141,2585,2586,2589,2591,2594],{"class":143,"line":867},[141,2587,2588],{"class":276},"  --runtime",[141,2590,791],{"class":269},[141,2592,2593],{"class":158},"nvidia",[141,2595,864],{"class":154},[141,2597,2598],{"class":143,"line":875},[141,2599,2540],{"class":446},[141,2601,2602],{"class":143,"line":886},[141,2603,2604],{"class":147},"  # 让容器看到全部 NVIDIA GPU\n",[141,2606,2607,2609,2611],{"class":143,"line":894},[141,2608,878],{"class":154},[141,2610,881],{"class":158},[141,2612,864],{"class":446},[141,2614,2616],{"class":143,"line":2615},14,[141,2617,2540],{"class":446},[141,2619,2621],{"class":143,"line":2620},15,[141,2622,2623],{"class":147},"  # vLLM 临时目录\n",[141,2625,2627,2629,2632],{"class":143,"line":2626},16,[141,2628,878],{"class":154},[141,2630,2631],{"class":158}," TMPDIR=\u002Ftmp\u002Fvllm",[141,2633,864],{"class":446},[141,2635,2637],{"class":143,"line":2636},17,[141,2638,2540],{"class":446},[141,2640,2642],{"class":143,"line":2641},18,[141,2643,2644],{"class":147},"  # 使用宿主机 IPC；\n",[141,2646,2648],{"class":143,"line":2647},19,[141,2649,2650],{"class":147},"  # 多 GPU \u002F PyTorch multiprocessing \u002F NCCL 更友好\n",[141,2652,2654,2657,2659,2662],{"class":143,"line":2653},20,[141,2655,2656],{"class":276},"  --ipc",[141,2658,791],{"class":269},[141,2660,2661],{"class":158},"host",[141,2663,864],{"class":154},[141,2665,2667],{"class":143,"line":2666},21,[141,2668,2540],{"class":446},[141,2670,2672],{"class":143,"line":2671},22,[141,2673,2674],{"class":147},"  # 宿主机 8000 → 容器 8000\n",[141,2676,2678,2681,2684],{"class":143,"line":2677},23,[141,2679,2680],{"class":154},"  -p",[141,2682,2683],{"class":158}," 8000:8000",[141,2685,864],{"class":446},[141,2687,2689],{"class":143,"line":2688},24,[141,2690,2540],{"class":446},[141,2692,2694],{"class":143,"line":2693},25,[141,2695,2696],{"class":147},"  # 模型目录只读挂载\n",[141,2698,2700,2703,2706],{"class":143,"line":2699},26,[141,2701,2702],{"class":154},"  -v",[141,2704,2705],{"class":158}," \u002Fdata\u002Fqwen\u002Fmodels:\u002Fmodels:ro",[141,2707,864],{"class":446},[141,2709,2711],{"class":143,"line":2710},27,[141,2712,2540],{"class":446},[141,2714,2716],{"class":143,"line":2715},28,[141,2717,2718],{"class":147},"  # 缓存放到 \u002Fdata，避免继续占根分区\n",[141,2720,2722,2724,2727],{"class":143,"line":2721},29,[141,2723,2702],{"class":154},[141,2725,2726],{"class":158}," \u002Fdata\u002Fqwen\u002Fvllm-cache:\u002Froot\u002F.cache",[141,2728,864],{"class":446},[141,2730,2732],{"class":143,"line":2731},30,[141,2733,2540],{"class":446},[141,2735,2737],{"class":143,"line":2736},31,[141,2738,2739],{"class":147},"  # 临时目录放到 \u002Fdata\n",[141,2741,2743,2745,2748],{"class":143,"line":2742},32,[141,2744,2702],{"class":154},[141,2746,2747],{"class":158}," \u002Fdata\u002Fqwen\u002Ftmp:\u002Ftmp\u002Fvllm",[141,2749,864],{"class":446},[141,2751,2753],{"class":143,"line":2752},33,[141,2754,2540],{"class":446},[141,2756,2758],{"class":143,"line":2757},34,[141,2759,2760],{"class":147},"  # vLLM 官方 OpenAI Server 镜像\n",[141,2762,2764,2767],{"class":143,"line":2763},35,[141,2765,2766],{"class":154},"  vllm\u002Fvllm-openai:latest",[141,2768,864],{"class":446},[141,2770,2772],{"class":143,"line":2771},36,[141,2773,2540],{"class":446},[141,2775,2777],{"class":143,"line":2776},37,[141,2778,2779],{"class":147},"  # 实际加载的模型路径\n",[141,2781,2783,2786],{"class":143,"line":2782},38,[141,2784,2785],{"class":154},"  \u002Fmodels\u002FQwen3.8-27B-AWQ-INT4",[141,2787,864],{"class":446},[141,2789,2791],{"class":143,"line":2790},39,[141,2792,2540],{"class":446},[141,2794,2796],{"class":143,"line":2795},40,[141,2797,2798],{"class":147},"  # API 对外暴露的模型 ID\n",[141,2800,2802,2805,2808],{"class":143,"line":2801},41,[141,2803,2804],{"class":154},"  --served-model-name",[141,2806,2807],{"class":158}," qwen38",[141,2809,864],{"class":446},[141,2811,2813],{"class":143,"line":2812},42,[141,2814,2540],{"class":446},[141,2816,2818],{"class":143,"line":2817},43,[141,2819,2820],{"class":147},"  # 两张 GPU 共同运行同一个模型\n",[141,2822,2824,2827,2830],{"class":143,"line":2823},44,[141,2825,2826],{"class":154},"  --tensor-parallel-size",[141,2828,2829],{"class":446}," 2",[141,2831,864],{"class":446},[141,2833,2835],{"class":143,"line":2834},45,[141,2836,2540],{"class":446},[141,2838,2840],{"class":143,"line":2839},46,[141,2841,2842],{"class":147},"  # vLLM 规划使用约 96% GPU 显存\n",[141,2844,2846,2849,2852],{"class":143,"line":2845},47,[141,2847,2848],{"class":154},"  --gpu-memory-utilization",[141,2850,2851],{"class":446}," 0.96",[141,2853,864],{"class":446},[141,2855,2857],{"class":143,"line":2856},48,[141,2858,2540],{"class":446},[141,2860,2862],{"class":143,"line":2861},49,[141,2863,2864],{"class":147},"  # 单条 sequence 最大上下文\n",[141,2866,2868],{"class":143,"line":2867},50,[141,2869,2870],{"class":147},"  # 114688 = 112 × 1024 = 112K\n",[141,2872,2874,2877,2880],{"class":143,"line":2873},51,[141,2875,2876],{"class":154},"  --max-model-len",[141,2878,2879],{"class":446}," 114688",[141,2881,864],{"class":446},[141,2883,2885],{"class":143,"line":2884},52,[141,2886,2540],{"class":446},[141,2888,2890],{"class":143,"line":2889},53,[141,2891,2892],{"class":147},"  # 最大活跃 sequence 数\n",[141,2894,2896,2899,2902],{"class":143,"line":2895},54,[141,2897,2898],{"class":154},"  --max-num-seqs",[141,2900,2901],{"class":446}," 4",[141,2903,864],{"class":446},[141,2905,2907],{"class":143,"line":2906},55,[141,2908,2540],{"class":446},[141,2910,2912],{"class":143,"line":2911},56,[141,2913,2914],{"class":147},"  # 强制 eager mode\n",[141,2916,2918],{"class":143,"line":2917},57,[141,2919,2920],{"class":147},"  # 更偏稳定和兼容，可能牺牲部分速度\n",[141,2922,2924,2927],{"class":143,"line":2923},58,[141,2925,2926],{"class":154},"  --enforce-eager",[141,2928,864],{"class":446},[141,2930,2932],{"class":143,"line":2931},59,[141,2933,2540],{"class":446},[141,2935,2937],{"class":143,"line":2936},60,[141,2938,2939],{"class":147},"  # 解析 Qwen reasoning \u002F thinking\n",[141,2941,2943,2946,2949],{"class":143,"line":2942},61,[141,2944,2945],{"class":154},"  --reasoning-parser",[141,2947,2948],{"class":158}," qwen3",[141,2950,864],{"class":446},[141,2952,2954],{"class":143,"line":2953},62,[141,2955,2540],{"class":446},[141,2957,2959],{"class":143,"line":2958},63,[141,2960,2961],{"class":147},"  # 开启 API Key 鉴权\n",[141,2963,2965,2968,2971,2973],{"class":143,"line":2964},64,[141,2966,2967],{"class":154},"  --api-key",[141,2969,2970],{"class":158}," \"",[141,2972,2482],{"class":276},[141,2974,2485],{"class":158},[14,2976,2978],{"id":2977},"_122-一行版","12.2 一行版",[80,2980,2982],{"className":135,"code":2981,"language":137,"meta":86,"style":86},"docker run -d --name qwen38-int4 --restart unless-stopped --runtime=nvidia -e NVIDIA_VISIBLE_DEVICES=all -e TMPDIR=\u002Ftmp\u002Fvllm --ipc=host -p 8000:8000 -v \u002Fdata\u002Fqwen\u002Fmodels:\u002Fmodels:ro -v \u002Fdata\u002Fqwen\u002Fvllm-cache:\u002Froot\u002F.cache -v \u002Fdata\u002Fqwen\u002Ftmp:\u002Ftmp\u002Fvllm vllm\u002Fvllm-openai:latest \u002Fmodels\u002FQwen3.8-27B-AWQ-INT4 --served-model-name qwen38 --tensor-parallel-size 2 --gpu-memory-utilization 0.96 --max-model-len 114688 --max-num-seqs 4 --enforce-eager --reasoning-parser qwen3 --api-key \"$VLLM_API_KEY\"\n",[57,2983,2984],{"__ignoreMap":86},[141,2985,2986,2988,2990,2992,2995,2997,3000,3002,3005,3008,3010,3012,3014,3017,3019,3021,3024,3026,3028,3030,3032,3034,3037,3040,3043,3045,3048,3050,3053,3055,3058,3060,3063,3065,3068,3071,3073,3076,3078,3080],{"class":143,"line":144},[141,2987,155],{"class":154},[141,2989,301],{"class":158},[141,2991,2533],{"class":446},[141,2993,2994],{"class":446}," --name",[141,2996,2553],{"class":158},[141,2998,2999],{"class":446}," --restart",[141,3001,2572],{"class":158},[141,3003,3004],{"class":446}," --runtime=nvidia",[141,3006,3007],{"class":446}," -e",[141,3009,881],{"class":158},[141,3011,3007],{"class":446},[141,3013,2631],{"class":158},[141,3015,3016],{"class":446}," --ipc=host",[141,3018,1024],{"class":446},[141,3020,2683],{"class":158},[141,3022,3023],{"class":446}," -v",[141,3025,2705],{"class":158},[141,3027,3023],{"class":446},[141,3029,2726],{"class":158},[141,3031,3023],{"class":446},[141,3033,2747],{"class":158},[141,3035,3036],{"class":158}," vllm\u002Fvllm-openai:latest",[141,3038,3039],{"class":158}," \u002Fmodels\u002FQwen3.8-27B-AWQ-INT4",[141,3041,3042],{"class":446}," --served-model-name",[141,3044,2807],{"class":158},[141,3046,3047],{"class":446}," --tensor-parallel-size",[141,3049,2829],{"class":446},[141,3051,3052],{"class":446}," --gpu-memory-utilization",[141,3054,2851],{"class":446},[141,3056,3057],{"class":446}," --max-model-len",[141,3059,2879],{"class":446},[141,3061,3062],{"class":446}," --max-num-seqs",[141,3064,2901],{"class":446},[141,3066,3067],{"class":446}," --enforce-eager",[141,3069,3070],{"class":446}," --reasoning-parser",[141,3072,2948],{"class":158},[141,3074,3075],{"class":446}," --api-key",[141,3077,2970],{"class":158},[141,3079,2482],{"class":276},[141,3081,2485],{"class":158},[19,3083,3084],{},[22,3085,3086,3087,3090],{},"为了支持图片，最终命令中没有加入 ",[57,3088,3089],{},"--language-model-only","。",[70,3092],{},[10,3094,3096],{"id":3095},"_13-vllm-核心参数","13. vLLM 核心参数",[14,3098,3100],{"id":3099},"served-model-name-qwen38",[57,3101,3102],{},"--served-model-name qwen38",[22,3104,3105],{},"这是 API 对外显示的模型 ID。",[22,3107,2466],{},[80,3109,3113],{"className":3110,"code":3111,"language":3112,"meta":86,"style":86},"language-json shiki shiki-themes github-light github-dark","{\n  \"model\": \"qwen38\"\n}\n","json",[57,3114,3115,3120,3131],{"__ignoreMap":86},[141,3116,3117],{"class":143,"line":144},[141,3118,3119],{"class":276},"{\n",[141,3121,3122,3125,3128],{"class":143,"line":151},[141,3123,3124],{"class":446},"  \"model\"",[141,3126,3127],{"class":276},": ",[141,3129,3130],{"class":158},"\"qwen38\"\n",[141,3132,3133],{"class":143,"line":283},[141,3134,3135],{"class":276},"}\n",[22,3137,3138],{},"必须匹配。",[14,3140,3142],{"id":3141},"tensor-parallel-size-2",[57,3143,3144],{},"--tensor-parallel-size 2",[80,3146,3149],{"className":3147,"code":3148,"language":85,"meta":86},[83],"一个模型\n↓\n拆到 2 张 GPU\n↓\n两张卡协同完成推理\n",[57,3150,3148],{"__ignoreMap":86},[14,3152,3154],{"id":3153},"gpu-memory-utilization-096",[57,3155,3156],{},"--gpu-memory-utilization 0.96",[22,3158,3159],{},"表示 vLLM 在规划显存时，目标使用比例约 96%。",[22,3161,3162],{},"它会综合考虑：",[80,3164,3167],{"className":3165,"code":3166,"language":85,"meta":86},[83],"模型权重\nKV Cache\nCUDA Runtime\nVision 模块\n工作空间\n",[57,3168,3166],{"__ignoreMap":86},[14,3170,3172],{"id":3171},"max-model-len-114688",[57,3173,3174],{},"--max-model-len 114688",[22,3176,3177],{},"控制单条 sequence 的最大上下文。",[22,3179,3180],{},"这里：",[80,3182,3185],{"className":3183,"code":3184,"language":85,"meta":86},[83],"114688 = 112K\n",[57,3186,3184],{"__ignoreMap":86},[22,3188,3189],{},"上下文包含：",[80,3191,3194],{"className":3192,"code":3193,"language":85,"meta":86},[83],"System Prompt\n历史对话\n当前输入\n图片视觉 token\n输出 token\n",[57,3195,3193],{"__ignoreMap":86},[14,3197,3199],{"id":3198},"max-num-seqs-4",[57,3200,3201],{},"--max-num-seqs 4",[22,3203,3204],{},"最多允许 4 条活跃 sequence 参与调度。",[22,3206,3207],{},"不代表 4 条请求都可以同时各自占满 112K，因为它们共享有限 KV Cache。",[14,3209,3211],{"id":3210},"enforce-eager",[57,3212,3213],{},"--enforce-eager",[22,3215,3216],{},"强制 eager mode。",[22,3218,3219],{},"优点：",[80,3221,3224],{"className":3222,"code":3223,"language":85,"meta":86},[83],"兼容性较好\n显存行为更直观\n",[57,3225,3223],{"__ignoreMap":86},[22,3227,3228],{},"缺点：",[80,3230,3233],{"className":3231,"code":3232,"language":85,"meta":86},[83],"可能比 CUDA Graph 路径慢\n",[57,3234,3232],{"__ignoreMap":86},[14,3236,3238,3239],{"id":3237},"为什么没有-language-model-only","为什么没有 ",[57,3240,3089],{},[22,3242,3243],{},"如果加入：",[80,3245,3247],{"className":135,"code":3246,"language":137,"meta":86,"style":86},"--language-model-only\n",[57,3248,3249],{"__ignoreMap":86},[141,3250,3251],{"class":143,"line":144},[141,3252,3246],{"class":154},[22,3254,3255],{},"会：",[80,3257,3260],{"className":3258,"code":3259,"language":85,"meta":86},[83],"关闭视觉模块\n↓\n不能传图片\n↓\n节省显存\n",[57,3261,3259],{"__ignoreMap":86},[22,3263,3264],{},"本次需要多模态，所以没有加。",[70,3266],{},[10,3268,3270],{"id":3269},"_14-启动后检查","14. 启动后检查",[22,3272,3273],{},"查看容器：",[80,3275,3277],{"className":135,"code":3276,"language":137,"meta":86,"style":86},"# 查看 qwen 容器\ndocker ps -a | grep qwen\n",[57,3278,3279,3284],{"__ignoreMap":86},[141,3280,3281],{"class":143,"line":144},[141,3282,3283],{"class":147},"# 查看 qwen 容器\n",[141,3285,3286,3288,3291,3293,3295,3297],{"class":143,"line":151},[141,3287,155],{"class":154},[141,3289,3290],{"class":158}," ps",[141,3292,1000],{"class":446},[141,3294,751],{"class":269},[141,3296,754],{"class":154},[141,3298,3299],{"class":158}," qwen\n",[22,3301,3302],{},"查看日志：",[80,3304,3306],{"className":135,"code":3305,"language":137,"meta":86,"style":86},"# 实时日志\ndocker logs -f qwen38-int4\n",[57,3307,3308,3313],{"__ignoreMap":86},[141,3309,3310],{"class":143,"line":144},[141,3311,3312],{"class":147},"# 实时日志\n",[141,3314,3315,3317,3320,3323],{"class":143,"line":151},[141,3316,155],{"class":154},[141,3318,3319],{"class":158}," logs",[141,3321,3322],{"class":446}," -f",[141,3324,3325],{"class":158}," qwen38-int4\n",[22,3327,3328],{},"最近 100 行：",[80,3330,3332],{"className":135,"code":3331,"language":137,"meta":86,"style":86},"# 查看最近 100 行\ndocker logs --tail 100 qwen38-int4\n",[57,3333,3334,3339],{"__ignoreMap":86},[141,3335,3336],{"class":143,"line":144},[141,3337,3338],{"class":147},"# 查看最近 100 行\n",[141,3340,3341,3343,3345,3348,3351],{"class":143,"line":151},[141,3342,155],{"class":154},[141,3344,3319],{"class":158},[141,3346,3347],{"class":446}," --tail",[141,3349,3350],{"class":446}," 100",[141,3352,3325],{"class":158},[22,3354,3355],{},"查看状态：",[80,3357,3359],{"className":135,"code":3358,"language":137,"meta":86,"style":86},"# 查看是否 running、是否反复重启、退出码\ndocker inspect qwen38-int4 \\\n  --format 'Status={{.State.Status}} Restarting={{.State.Restarting}} RestartCount={{.RestartCount}} ExitCode={{.State.ExitCode}}'\n",[57,3360,3361,3366,3377],{"__ignoreMap":86},[141,3362,3363],{"class":143,"line":144},[141,3364,3365],{"class":147},"# 查看是否 running、是否反复重启、退出码\n",[141,3367,3368,3370,3373,3375],{"class":143,"line":151},[141,3369,155],{"class":154},[141,3371,3372],{"class":158}," inspect",[141,3374,2553],{"class":158},[141,3376,864],{"class":446},[141,3378,3379,3382],{"class":143,"line":283},[141,3380,3381],{"class":446},"  --format",[141,3383,3384],{"class":158}," 'Status={{.State.Status}} Restarting={{.State.Restarting}} RestartCount={{.RestartCount}} ExitCode={{.State.ExitCode}}'\n",[22,3386,3387],{},"查看真实启动参数：",[80,3389,3391],{"className":135,"code":3390,"language":137,"meta":86,"style":86},"# 查看当前容器实际使用的全部 vLLM 参数\ndocker inspect qwen38-int4 --format '{{json .Args}}'\n",[57,3392,3393,3398],{"__ignoreMap":86},[141,3394,3395],{"class":143,"line":144},[141,3396,3397],{"class":147},"# 查看当前容器实际使用的全部 vLLM 参数\n",[141,3399,3400,3402,3404,3406,3409],{"class":143,"line":151},[141,3401,155],{"class":154},[141,3403,3372],{"class":158},[141,3405,2553],{"class":158},[141,3407,3408],{"class":446}," --format",[141,3410,3411],{"class":158}," '{{json .Args}}'\n",[22,3413,410],{},[80,3415,3417],{"className":135,"code":3416,"language":137,"meta":86,"style":86},"# 每秒刷新一次\nwatch -n 1 nvidia-smi\n",[57,3418,3419,3424],{"__ignoreMap":86},[141,3420,3421],{"class":143,"line":144},[141,3422,3423],{"class":147},"# 每秒刷新一次\n",[141,3425,3426,3428,3430,3432],{"class":143,"line":151},[141,3427,443],{"class":154},[141,3429,447],{"class":446},[141,3431,450],{"class":446},[141,3433,453],{"class":158},[70,3435],{},[10,3437,3439],{"id":3438},"_15-查询真正的模型-id","15. 查询真正的模型 ID",[22,3441,3442],{},"不要猜模型名。",[80,3444,3446],{"className":135,"code":3445,"language":137,"meta":86,"style":86},"# 查询 vLLM 当前注册的模型 ID\ncurl http:\u002F\u002F127.0.0.1:8000\u002Fv1\u002Fmodels \\\n  -H \"Authorization: Bearer $VLLM_API_KEY\"\n",[57,3447,3448,3453,3462],{"__ignoreMap":86},[141,3449,3450],{"class":143,"line":144},[141,3451,3452],{"class":147},"# 查询 vLLM 当前注册的模型 ID\n",[141,3454,3455,3457,3460],{"class":143,"line":151},[141,3456,2081],{"class":154},[141,3458,3459],{"class":158}," http:\u002F\u002F127.0.0.1:8000\u002Fv1\u002Fmodels",[141,3461,864],{"class":446},[141,3463,3464,3467,3469,3471],{"class":143,"line":283},[141,3465,3466],{"class":446},"  -H",[141,3468,2479],{"class":158},[141,3470,2482],{"class":276},[141,3472,2485],{"class":158},[22,3474,3475],{},"返回中：",[80,3477,3479],{"className":3110,"code":3478,"language":3112,"meta":86,"style":86},"{\n  \"data\": [\n    {\n      \"id\": \"qwen38\"\n    }\n  ]\n}\n",[57,3480,3481,3485,3493,3498,3507,3512,3517],{"__ignoreMap":86},[141,3482,3483],{"class":143,"line":144},[141,3484,3119],{"class":276},[141,3486,3487,3490],{"class":143,"line":151},[141,3488,3489],{"class":446},"  \"data\"",[141,3491,3492],{"class":276},": [\n",[141,3494,3495],{"class":143,"line":283},[141,3496,3497],{"class":276},"    {\n",[141,3499,3500,3503,3505],{"class":143,"line":290},[141,3501,3502],{"class":446},"      \"id\"",[141,3504,3127],{"class":276},[141,3506,3130],{"class":158},[141,3508,3509],{"class":143,"line":296},[141,3510,3511],{"class":276},"    }\n",[141,3513,3514],{"class":143,"line":717},[141,3515,3516],{"class":276},"  ]\n",[141,3518,3519],{"class":143,"line":842},[141,3520,3135],{"class":276},[22,3522,3523,3524,3527],{},"这里的 ",[57,3525,3526],{},"id"," 才是 API 请求应使用的模型名。",[70,3529],{},[10,3531,3533],{"id":3532},"_16-curl-纯文本测试","16. curl 纯文本测试",[80,3535,3537],{"className":135,"code":3536,"language":137,"meta":86,"style":86},"# time：\n# 统计整个请求耗时\n#\n# curl：\n# 命令行 HTTP 客户端\n#\n# -H：\n# 添加 HTTP Header\n#\n# -d：\n# 发送 JSON 请求体\ntime curl http:\u002F\u002F127.0.0.1:8000\u002Fv1\u002Fchat\u002Fcompletions \\\n  -H \"Authorization: Bearer $VLLM_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"model\":\"qwen38\",\n    \"messages\":[\n      {\n        \"role\":\"user\",\n        \"content\":\"1+1等于多少？只回答结果\"\n      }\n    ],\n    \"max_tokens\":20\n  }'\n",[57,3538,3539,3544,3549,3553,3558,3563,3567,3572,3577,3581,3586,3591,3602,3615,3624,3632,3637,3642,3647,3652,3657,3662,3667,3672],{"__ignoreMap":86},[141,3540,3541],{"class":143,"line":144},[141,3542,3543],{"class":147},"# time：\n",[141,3545,3546],{"class":143,"line":151},[141,3547,3548],{"class":147},"# 统计整个请求耗时\n",[141,3550,3551],{"class":143,"line":283},[141,3552,825],{"class":147},[141,3554,3555],{"class":143,"line":290},[141,3556,3557],{"class":147},"# curl：\n",[141,3559,3560],{"class":143,"line":296},[141,3561,3562],{"class":147},"# 命令行 HTTP 客户端\n",[141,3564,3565],{"class":143,"line":717},[141,3566,825],{"class":147},[141,3568,3569],{"class":143,"line":842},[141,3570,3571],{"class":147},"# -H：\n",[141,3573,3574],{"class":143,"line":848},[141,3575,3576],{"class":147},"# 添加 HTTP Header\n",[141,3578,3579],{"class":143,"line":854},[141,3580,825],{"class":147},[141,3582,3583],{"class":143,"line":867},[141,3584,3585],{"class":147},"# -d：\n",[141,3587,3588],{"class":143,"line":875},[141,3589,3590],{"class":147},"# 发送 JSON 请求体\n",[141,3592,3593,3596,3599],{"class":143,"line":886},[141,3594,3595],{"class":269},"time",[141,3597,3598],{"class":276}," curl http:\u002F\u002F127.0.0.1:8000\u002Fv1\u002Fchat\u002Fcompletions ",[141,3600,3601],{"class":446},"\\\n",[141,3603,3604,3606,3608,3610,3613],{"class":143,"line":894},[141,3605,3466],{"class":154},[141,3607,2479],{"class":158},[141,3609,2482],{"class":276},[141,3611,3612],{"class":158},"\"",[141,3614,864],{"class":446},[141,3616,3617,3619,3622],{"class":143,"line":2615},[141,3618,3466],{"class":446},[141,3620,3621],{"class":158}," \"Content-Type: application\u002Fjson\"",[141,3623,864],{"class":446},[141,3625,3626,3629],{"class":143,"line":2620},[141,3627,3628],{"class":446},"  -d",[141,3630,3631],{"class":158}," '{\n",[141,3633,3634],{"class":143,"line":2626},[141,3635,3636],{"class":158},"    \"model\":\"qwen38\",\n",[141,3638,3639],{"class":143,"line":2636},[141,3640,3641],{"class":158},"    \"messages\":[\n",[141,3643,3644],{"class":143,"line":2641},[141,3645,3646],{"class":158},"      {\n",[141,3648,3649],{"class":143,"line":2647},[141,3650,3651],{"class":158},"        \"role\":\"user\",\n",[141,3653,3654],{"class":143,"line":2653},[141,3655,3656],{"class":158},"        \"content\":\"1+1等于多少？只回答结果\"\n",[141,3658,3659],{"class":143,"line":2666},[141,3660,3661],{"class":158},"      }\n",[141,3663,3664],{"class":143,"line":2671},[141,3665,3666],{"class":158},"    ],\n",[141,3668,3669],{"class":143,"line":2677},[141,3670,3671],{"class":158},"    \"max_tokens\":20\n",[141,3673,3674],{"class":143,"line":2688},[141,3675,3676],{"class":158},"  }'\n",[22,3678,3679,3682,3683,3090],{},[57,3680,3681],{},"max_tokens"," 只控制本次最多生成多少 token，不等于 ",[57,3684,3685],{},"max-model-len",[70,3687],{},[10,3689,3691],{"id":3690},"_17-curl-图片多模态测试","17. curl 图片多模态测试",[14,3693,3695],{"id":3694},"_171-base64-是什么","17.1 Base64 是什么",[22,3697,3698],{},"JSON 是文本格式，不能直接把 JPG 二进制原样放进去。",[22,3700,3701],{},"所以常见做法：",[80,3703,3706],{"className":3704,"code":3705,"language":85,"meta":86},[83],"JPG \u002F PNG\n↓\nBase64\n↓\n文本字符串\n↓\n放进 JSON\n",[57,3707,3705],{"__ignoreMap":86},[14,3709,3711],{"id":3710},"_172-转换图片","17.2 转换图片",[22,3713,3714],{},"假设：",[80,3716,3719],{"className":3717,"code":3718,"language":85,"meta":86},[83],"\u002Fdata\u002Fqwen\u002Ftest.jpg\n",[57,3720,3718],{"__ignoreMap":86},[22,3722,3723],{},"执行：",[80,3725,3727],{"className":135,"code":3726,"language":137,"meta":86,"style":86},"# base64：\n# 把二进制图片编码成 Base64 文本\n#\n# -w0：\n# 不自动换行\n#\n# IMG=：\n# 把结果保存到 Shell 变量 IMG\nIMG=$(base64 -w0 \u002Fdata\u002Fqwen\u002Ftest.jpg)\n",[57,3728,3729,3734,3739,3743,3748,3753,3757,3762,3767],{"__ignoreMap":86},[141,3730,3731],{"class":143,"line":144},[141,3732,3733],{"class":147},"# base64：\n",[141,3735,3736],{"class":143,"line":151},[141,3737,3738],{"class":147},"# 把二进制图片编码成 Base64 文本\n",[141,3740,3741],{"class":143,"line":283},[141,3742,825],{"class":147},[141,3744,3745],{"class":143,"line":290},[141,3746,3747],{"class":147},"# -w0：\n",[141,3749,3750],{"class":143,"line":296},[141,3751,3752],{"class":147},"# 不自动换行\n",[141,3754,3755],{"class":143,"line":717},[141,3756,825],{"class":147},[141,3758,3759],{"class":143,"line":842},[141,3760,3761],{"class":147},"# IMG=：\n",[141,3763,3764],{"class":143,"line":848},[141,3765,3766],{"class":147},"# 把结果保存到 Shell 变量 IMG\n",[141,3768,3769,3772,3774,3777,3780,3783,3786],{"class":143,"line":854},[141,3770,3771],{"class":276},"IMG",[141,3773,791],{"class":269},[141,3775,3776],{"class":276},"$(",[141,3778,3779],{"class":154},"base64",[141,3781,3782],{"class":446}," -w0",[141,3784,3785],{"class":158}," \u002Fdata\u002Fqwen\u002Ftest.jpg",[141,3787,3788],{"class":276},")\n",[14,3790,3792],{"id":3791},"_173-发送图片","17.3 发送图片",[80,3794,3796],{"className":135,"code":3795,"language":137,"meta":86,"style":86},"curl http:\u002F\u002F127.0.0.1:8000\u002Fv1\u002Fchat\u002Fcompletions \\\n  -H \"Authorization: Bearer $VLLM_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d \"{\n    \\\"model\\\": \\\"qwen38\\\",\n    \\\"messages\\\": [\n      {\n        \\\"role\\\": \\\"user\\\",\n        \\\"content\\\": [\n          {\n            \\\"type\\\": \\\"text\\\",\n            \\\"text\\\": \\\"请描述这张图片中的内容\\\"\n          },\n          {\n            \\\"type\\\": \\\"image_url\\\",\n            \\\"image_url\\\": {\n              \\\"url\\\": \\\"data:image\u002Fjpeg;base64,$IMG\\\"\n            }\n          }\n        ]\n      }\n    ],\n    \\\"max_tokens\\\": 512\n  }\"\n",[57,3797,3798,3807,3819,3827,3834,3857,3868,3872,3893,3904,3909,3929,3947,3952,3956,3975,3986,4008,4013,4018,4023,4027,4031,4042],{"__ignoreMap":86},[141,3799,3800,3802,3805],{"class":143,"line":144},[141,3801,2081],{"class":154},[141,3803,3804],{"class":158}," http:\u002F\u002F127.0.0.1:8000\u002Fv1\u002Fchat\u002Fcompletions",[141,3806,864],{"class":446},[141,3808,3809,3811,3813,3815,3817],{"class":143,"line":151},[141,3810,3466],{"class":446},[141,3812,2479],{"class":158},[141,3814,2482],{"class":276},[141,3816,3612],{"class":158},[141,3818,864],{"class":446},[141,3820,3821,3823,3825],{"class":143,"line":283},[141,3822,3466],{"class":446},[141,3824,3621],{"class":158},[141,3826,864],{"class":446},[141,3828,3829,3831],{"class":143,"line":290},[141,3830,3628],{"class":446},[141,3832,3833],{"class":158}," \"{\n",[141,3835,3836,3839,3842,3845,3847,3849,3852,3854],{"class":143,"line":296},[141,3837,3838],{"class":446},"    \\\"",[141,3840,3841],{"class":158},"model",[141,3843,3844],{"class":446},"\\\"",[141,3846,3127],{"class":158},[141,3848,3844],{"class":446},[141,3850,3851],{"class":158},"qwen38",[141,3853,3844],{"class":446},[141,3855,3856],{"class":158},",\n",[141,3858,3859,3861,3864,3866],{"class":143,"line":717},[141,3860,3838],{"class":446},[141,3862,3863],{"class":158},"messages",[141,3865,3844],{"class":446},[141,3867,3492],{"class":158},[141,3869,3870],{"class":143,"line":842},[141,3871,3646],{"class":158},[141,3873,3874,3877,3880,3882,3884,3886,3889,3891],{"class":143,"line":848},[141,3875,3876],{"class":446},"        \\\"",[141,3878,3879],{"class":158},"role",[141,3881,3844],{"class":446},[141,3883,3127],{"class":158},[141,3885,3844],{"class":446},[141,3887,3888],{"class":158},"user",[141,3890,3844],{"class":446},[141,3892,3856],{"class":158},[141,3894,3895,3897,3900,3902],{"class":143,"line":854},[141,3896,3876],{"class":446},[141,3898,3899],{"class":158},"content",[141,3901,3844],{"class":446},[141,3903,3492],{"class":158},[141,3905,3906],{"class":143,"line":867},[141,3907,3908],{"class":158},"          {\n",[141,3910,3911,3914,3917,3919,3921,3923,3925,3927],{"class":143,"line":875},[141,3912,3913],{"class":446},"            \\\"",[141,3915,3916],{"class":158},"type",[141,3918,3844],{"class":446},[141,3920,3127],{"class":158},[141,3922,3844],{"class":446},[141,3924,85],{"class":158},[141,3926,3844],{"class":446},[141,3928,3856],{"class":158},[141,3930,3931,3933,3935,3937,3939,3941,3944],{"class":143,"line":886},[141,3932,3913],{"class":446},[141,3934,85],{"class":158},[141,3936,3844],{"class":446},[141,3938,3127],{"class":158},[141,3940,3844],{"class":446},[141,3942,3943],{"class":158},"请描述这张图片中的内容",[141,3945,3946],{"class":446},"\\\"\n",[141,3948,3949],{"class":143,"line":894},[141,3950,3951],{"class":158},"          },\n",[141,3953,3954],{"class":143,"line":2615},[141,3955,3908],{"class":158},[141,3957,3958,3960,3962,3964,3966,3968,3971,3973],{"class":143,"line":2620},[141,3959,3913],{"class":446},[141,3961,3916],{"class":158},[141,3963,3844],{"class":446},[141,3965,3127],{"class":158},[141,3967,3844],{"class":446},[141,3969,3970],{"class":158},"image_url",[141,3972,3844],{"class":446},[141,3974,3856],{"class":158},[141,3976,3977,3979,3981,3983],{"class":143,"line":2626},[141,3978,3913],{"class":446},[141,3980,3970],{"class":158},[141,3982,3844],{"class":446},[141,3984,3985],{"class":158},": {\n",[141,3987,3988,3991,3994,3996,3998,4000,4003,4006],{"class":143,"line":2636},[141,3989,3990],{"class":446},"              \\\"",[141,3992,3993],{"class":158},"url",[141,3995,3844],{"class":446},[141,3997,3127],{"class":158},[141,3999,3844],{"class":446},[141,4001,4002],{"class":158},"data:image\u002Fjpeg;base64,",[141,4004,4005],{"class":276},"$IMG",[141,4007,3946],{"class":446},[141,4009,4010],{"class":143,"line":2641},[141,4011,4012],{"class":158},"            }\n",[141,4014,4015],{"class":143,"line":2647},[141,4016,4017],{"class":158},"          }\n",[141,4019,4020],{"class":143,"line":2653},[141,4021,4022],{"class":158},"        ]\n",[141,4024,4025],{"class":143,"line":2666},[141,4026,3661],{"class":158},[141,4028,4029],{"class":143,"line":2671},[141,4030,3666],{"class":158},[141,4032,4033,4035,4037,4039],{"class":143,"line":2677},[141,4034,3838],{"class":446},[141,4036,3681],{"class":158},[141,4038,3844],{"class":446},[141,4040,4041],{"class":158},": 512\n",[141,4043,4044],{"class":143,"line":2688},[141,4045,4046],{"class":158},"  }\"\n",[22,4048,4049],{},"本次实际测试已经成功识别图片。",[70,4051],{},[10,4053,4055],{"id":4054},"_18-cherry-studio-接入","18. Cherry Studio 接入",[22,4057,4058],{},"Base URL：",[80,4060,4063],{"className":4061,"code":4062,"language":85,"meta":86},[83],"http:\u002F\u002F服务器IP:8000\u002Fv1\n",[57,4064,4062],{"__ignoreMap":86},[22,4066,132],{},[80,4068,4071],{"className":4069,"code":4070,"language":85,"meta":86},[83],"http:\u002F\u002F192.168.10.102:8000\u002Fv1\n",[57,4072,4070],{"__ignoreMap":86},[22,4074,4075],{},"配置：",[80,4077,4080],{"className":4078,"code":4079,"language":85,"meta":86},[83],"API 地址：\nhttp:\u002F\u002F服务器IP:8000\u002Fv1\n\nAPI Key：\n与 --api-key 一致\n\n模型：\n使用 \u002Fv1\u002Fmodels 返回的 id\n",[57,4081,4079],{"__ignoreMap":86},[22,4083,4084],{},"如果 curl 图片正常但 Cherry Studio 不能上传图片，优先检查客户端是否识别该模型的 Vision 能力。",[70,4086],{},[10,4088,4090],{"id":4089},"_19-上下文kv-cache-和并发","19. 上下文、KV Cache 和并发",[14,4092,4094],{"id":4093},"_191-上下文","19.1 上下文",[22,4096,4097],{},"上下文就是模型当前需要保留和处理的 token 总体。",[22,4099,4100],{},"包括：",[80,4102,4105],{"className":4103,"code":4104,"language":85,"meta":86},[83],"系统提示词\n历史聊天\n当前输入\n代码\n图片视觉 token\n输出\n",[57,4106,4104],{"__ignoreMap":86},[14,4108,4110],{"id":4109},"_192-kv-cache","19.2 KV Cache",[22,4112,4113],{},"Transformer Attention 会产生：",[80,4115,4118],{"className":4116,"code":4117,"language":85,"meta":86},[83],"K = Key\nV = Value\n",[57,4119,4117],{"__ignoreMap":86},[22,4121,4122],{},"为了避免每生成一个 token 都重新计算全部历史，模型会把历史 K\u002FV 缓存在 GPU 中。",[22,4124,4125],{},"这就是：",[80,4127,4130],{"className":4128,"code":4129,"language":85,"meta":86},[83],"KV Cache\n",[57,4131,4129],{"__ignoreMap":86},[22,4133,4134],{},"可以把显存粗略理解为：",[80,4136,4139],{"className":4137,"code":4138,"language":85,"meta":86},[83],"GPU 显存\n├── 模型权重\n├── CUDA \u002F vLLM Runtime\n├── Vision 模块\n├── 工作空间\n└── KV Cache\n",[57,4140,4138],{"__ignoreMap":86},[14,4142,4144],{"id":4143},"_193-为什么长上下文更吃显存","19.3 为什么长上下文更吃显存",[80,4146,4149],{"className":4147,"code":4148,"language":85,"meta":86},[83],"token 越多\n↓\n需要保存的 K\u002FV 越多\n↓\nKV Cache 越大\n↓\n显存越紧张\n",[57,4150,4148],{"__ignoreMap":86},[14,4152,4154],{"id":4153},"_194-为什么并发也吃-kv-cache","19.4 为什么并发也吃 KV Cache",[22,4156,4157],{},"每条活跃 sequence 都有自己的 K\u002FV 状态。",[22,4159,523],{},[80,4161,4164],{"className":4162,"code":4163,"language":85,"meta":86},[83],"长上下文\n+\n高并发\n",[57,4165,4163],{"__ignoreMap":86},[22,4167,4168],{},"会同时竞争显存。",[70,4170],{},[10,4172,4174],{"id":4173},"_20-为什么-256k128k-失败而-112k-成功","20. 为什么 256K、128K 失败，而 112K 成功",[14,4176,4178],{"id":4177},"_256k","256K",[80,4180,4183],{"className":4181,"code":4182,"language":85,"meta":86},[83],"262144 tokens\n",[57,4184,4182],{"__ignoreMap":86},[22,4186,4187],{},"当时日志显示：",[80,4189,4192],{"className":4190,"code":4191,"language":85,"meta":86},[83],"所需 KV Cache ≈ 8.09 GiB\n可用 KV Cache ≈ 3.7 GiB\n",[57,4193,4191],{"__ignoreMap":86},[22,4195,4196],{},"所以失败。",[14,4198,4200],{"id":4199},"_128k","128K",[80,4202,4205],{"className":4203,"code":4204,"language":85,"meta":86},[83],"131072 tokens\n",[57,4206,4204],{"__ignoreMap":86},[22,4208,4209],{},"日志显示：",[80,4211,4214],{"className":4212,"code":4213,"language":85,"meta":86},[83],"所需 KV Cache ≈ 4.09 GiB\n可用 KV Cache ≈ 3.7 GiB\n估计最大长度 ≈ 118384 tokens\n",[57,4215,4213],{"__ignoreMap":86},[22,4217,523],{},[80,4219,4222],{"className":4220,"code":4221,"language":85,"meta":86},[83],"131072 > 118384\n",[57,4223,4221],{"__ignoreMap":86},[22,4225,4226],{},"仍然失败。",[14,4228,4230],{"id":4229},"_112k","112K",[80,4232,4235],{"className":4233,"code":4234,"language":85,"meta":86},[83],"114688 tokens\n",[57,4236,4234],{"__ignoreMap":86},[22,4238,4239],{},"而：",[80,4241,4244],{"className":4242,"code":4243,"language":85,"meta":86},[83],"114688 \u003C 118384\n",[57,4245,4243],{"__ignoreMap":86},[22,4247,4248],{},"因此成功启动。",[70,4250],{},[10,4252,4254],{"id":4253},"_21-为什么图片模式更慢","21. 为什么图片模式更慢",[22,4256,4257],{},"纯文本：",[80,4259,4262],{"className":4260,"code":4261,"language":85,"meta":86},[83],"Text\n↓\nTokenizer\n↓\nLLM\n↓\nOutput\n",[57,4263,4261],{"__ignoreMap":86},[22,4265,4266],{},"图片：",[80,4268,4271],{"className":4269,"code":4270,"language":85,"meta":86},[83],"Image\n↓\nDecode \u002F Resize \u002F Processor\n↓\nVision Encoder\n↓\n视觉特征\n↓\nLLM\n↓\nReasoning\n↓\nOutput\n",[57,4272,4270],{"__ignoreMap":86},[22,4274,4275],{},"图片比纯文本多了一整段视觉编码，所以更慢是正常现象。",[22,4277,4278],{},"另外：",[80,4280,4282],{"className":135,"code":4281,"language":137,"meta":86,"style":86},"--reasoning-parser qwen3\n",[57,4283,4284],{"__ignoreMap":86},[141,4285,4286,4289],{"class":143,"line":144},[141,4287,4288],{"class":154},"--reasoning-parser",[141,4290,4291],{"class":158}," qwen3\n",[22,4293,4294],{},"意味着模型可能先生成 reasoning token，再生成最终答案。",[22,4296,4297],{},"如果客户端没有及时显示 reasoning，体感上会像“转了很久”。",[70,4299],{},[10,4301,4303],{"id":4302},"_22-常见错误","22. 常见错误",[14,4305,4307],{"id":4306},"unauthorized",[57,4308,4309],{},"Unauthorized",[22,4311,4312],{},"表示 API Key 不匹配。",[80,4314,4316],{"className":135,"code":4315,"language":137,"meta":86,"style":86},"# 查看当前 Shell 是否存在 API Key\necho ${#VLLM_API_KEY}\n",[57,4317,4318,4323],{"__ignoreMap":86},[141,4319,4320],{"class":143,"line":144},[141,4321,4322],{"class":147},"# 查看当前 Shell 是否存在 API Key\n",[141,4324,4325,4327,4329,4331],{"class":143,"line":151},[141,4326,2434],{"class":446},[141,4328,2437],{"class":276},[141,4330,2440],{"class":269},[141,4332,2443],{"class":276},[22,4334,4335],{},"重新设置：",[80,4337,4339],{"className":135,"code":4338,"language":137,"meta":86,"style":86},"export VLLM_API_KEY='你的API_KEY'\n",[57,4340,4341],{"__ignoreMap":86},[141,4342,4343,4345,4347,4349],{"class":143,"line":144},[141,4344,1412],{"class":269},[141,4346,2411],{"class":276},[141,4348,791],{"class":269},[141,4350,2416],{"class":158},[14,4352,4354],{"id":4353},"model-does-not-exist",[57,4355,4356],{},"model does not exist",[22,4358,4359],{},"表示鉴权已经通过，但模型 ID 不对。",[80,4361,4363],{"className":135,"code":4362,"language":137,"meta":86,"style":86},"# 查询真实模型 ID\ncurl http:\u002F\u002F127.0.0.1:8000\u002Fv1\u002Fmodels \\\n  -H \"Authorization: Bearer $VLLM_API_KEY\"\n",[57,4364,4365,4370,4378],{"__ignoreMap":86},[141,4366,4367],{"class":143,"line":144},[141,4368,4369],{"class":147},"# 查询真实模型 ID\n",[141,4371,4372,4374,4376],{"class":143,"line":151},[141,4373,2081],{"class":154},[141,4375,3459],{"class":158},[141,4377,864],{"class":446},[141,4379,4380,4382,4384,4386],{"class":143,"line":283},[141,4381,3466],{"class":446},[141,4383,2479],{"class":158},[141,4385,2482],{"class":276},[141,4387,2485],{"class":158},[14,4389,4391],{"id":4390},"kv-cache-不足","KV Cache 不足",[22,4393,4394],{},"典型：",[80,4396,4399],{"className":4397,"code":4398,"language":85,"meta":86},[83],"KV cache is needed\nlarger than available KV cache memory\n",[57,4400,4398],{"__ignoreMap":86},[22,4402,4403],{},"优先降低：",[80,4405,4407],{"className":135,"code":4406,"language":137,"meta":86,"style":86},"--max-model-len\n",[57,4408,4409],{"__ignoreMap":86},[141,4410,4411],{"class":143,"line":144},[141,4412,4406],{"class":154},[14,4414,4416],{"id":4415},"connection-reset-by-peer",[57,4417,4418],{},"Connection reset by peer",[22,4420,731],{},[80,4422,4424],{"className":135,"code":4423,"language":137,"meta":86,"style":86},"# 看容器状态\ndocker ps -a | grep qwen\n\n# 看错误日志\ndocker logs --tail 100 qwen38-int4\n",[57,4425,4426,4431,4445,4449,4454],{"__ignoreMap":86},[141,4427,4428],{"class":143,"line":144},[141,4429,4430],{"class":147},"# 看容器状态\n",[141,4432,4433,4435,4437,4439,4441,4443],{"class":143,"line":151},[141,4434,155],{"class":154},[141,4436,3290],{"class":158},[141,4438,1000],{"class":446},[141,4440,751],{"class":269},[141,4442,754],{"class":154},[141,4444,3299],{"class":158},[141,4446,4447],{"class":143,"line":283},[141,4448,287],{"emptyLinePlaceholder":286},[141,4450,4451],{"class":143,"line":290},[141,4452,4453],{"class":147},"# 看错误日志\n",[141,4455,4456,4458,4460,4462,4464],{"class":143,"line":296},[141,4457,155],{"class":154},[141,4459,3319],{"class":158},[141,4461,3347],{"class":446},[141,4463,3350],{"class":446},[141,4465,3325],{"class":158},[14,4467,4468],{"id":4468},"图片不能上传",[80,4470,4472],{"className":135,"code":4471,"language":137,"meta":86,"style":86},"# 查看真实启动参数\ndocker inspect qwen38-int4 --format '{{json .Args}}'\n",[57,4473,4474,4479],{"__ignoreMap":86},[141,4475,4476],{"class":143,"line":144},[141,4477,4478],{"class":147},"# 查看真实启动参数\n",[141,4480,4481,4483,4485,4487,4489],{"class":143,"line":151},[141,4482,155],{"class":154},[141,4484,3372],{"class":158},[141,4486,2553],{"class":158},[141,4488,3408],{"class":446},[141,4490,3411],{"class":158},[22,4492,4493],{},"确认没有：",[80,4495,4497],{"className":4496,"code":3246,"language":85,"meta":86},[83],[57,4498,3246],{"__ignoreMap":86},[22,4500,4501],{},"然后先用 curl 验证图片后端，再排查 Cherry Studio。",[70,4503],{},[10,4505,4507],{"id":4506},"_23-常用-docker-运维命令","23. 常用 Docker 运维命令",[80,4509,4511],{"className":135,"code":4510,"language":137,"meta":86,"style":86},"# 查看容器\ndocker ps -a | grep qwen\n\n# 停止，不删除\ndocker stop qwen38-int4\n\n# 启动已有容器\ndocker start qwen38-int4\n\n# 重启\ndocker restart qwen38-int4\n\n# 强制停止并删除容器\n# 不会删除 \u002Fdata\u002Fqwen\u002Fmodels 中的模型文件\ndocker rm -f qwen38-int4\n",[57,4512,4513,4518,4532,4536,4541,4550,4554,4559,4568,4572,4577,4586,4590,4595,4600],{"__ignoreMap":86},[141,4514,4515],{"class":143,"line":144},[141,4516,4517],{"class":147},"# 查看容器\n",[141,4519,4520,4522,4524,4526,4528,4530],{"class":143,"line":151},[141,4521,155],{"class":154},[141,4523,3290],{"class":158},[141,4525,1000],{"class":446},[141,4527,751],{"class":269},[141,4529,754],{"class":154},[141,4531,3299],{"class":158},[141,4533,4534],{"class":143,"line":283},[141,4535,287],{"emptyLinePlaceholder":286},[141,4537,4538],{"class":143,"line":290},[141,4539,4540],{"class":147},"# 停止，不删除\n",[141,4542,4543,4545,4548],{"class":143,"line":296},[141,4544,155],{"class":154},[141,4546,4547],{"class":158}," stop",[141,4549,3325],{"class":158},[141,4551,4552],{"class":143,"line":717},[141,4553,287],{"emptyLinePlaceholder":286},[141,4555,4556],{"class":143,"line":842},[141,4557,4558],{"class":147},"# 启动已有容器\n",[141,4560,4561,4563,4566],{"class":143,"line":848},[141,4562,155],{"class":154},[141,4564,4565],{"class":158}," start",[141,4567,3325],{"class":158},[141,4569,4570],{"class":143,"line":854},[141,4571,287],{"emptyLinePlaceholder":286},[141,4573,4574],{"class":143,"line":867},[141,4575,4576],{"class":147},"# 重启\n",[141,4578,4579,4581,4584],{"class":143,"line":875},[141,4580,155],{"class":154},[141,4582,4583],{"class":158}," restart",[141,4585,3325],{"class":158},[141,4587,4588],{"class":143,"line":886},[141,4589,287],{"emptyLinePlaceholder":286},[141,4591,4592],{"class":143,"line":894},[141,4593,4594],{"class":147},"# 强制停止并删除容器\n",[141,4596,4597],{"class":143,"line":2615},[141,4598,4599],{"class":147},"# 不会删除 \u002Fdata\u002Fqwen\u002Fmodels 中的模型文件\n",[141,4601,4602,4604,4607,4609],{"class":143,"line":2620},[141,4603,155],{"class":154},[141,4605,4606],{"class":158}," rm",[141,4608,3322],{"class":446},[141,4610,3325],{"class":158},[22,4612,4613,4614,1446],{},"只有修改这些启动参数时，才需要重新 ",[57,4615,1966],{},[80,4617,4620],{"className":4618,"code":4619,"language":85,"meta":86},[83],"模型路径\n端口\n上下文\n并发\nTensor Parallel\nVolume\nAPI Key\nserved-model-name\n",[57,4621,4619],{"__ignoreMap":86},[70,4623],{},[10,4625,4627],{"id":4626},"_24-vllmollamaonnx-的选择建议","24. vLLM、Ollama、ONNX 的选择建议",[4629,4630,4631,4650],"table",{},[4632,4633,4634],"thead",{},[4635,4636,4637,4641,4644,4647],"tr",{},[4638,4639,4640],"th",{},"项目",[4638,4642,4643],{},"vLLM",[4638,4645,4646],{},"Ollama",[4638,4648,4649],{},"ONNX Runtime",[4651,4652,4653,4668,4681,4695,4707,4720,4733,4746,4758],"tbody",{},[4635,4654,4655,4659,4662,4665],{},[4656,4657,4658],"td",{},"主要定位",[4656,4660,4661],{},"大模型服务器",[4656,4663,4664],{},"本地模型运行",[4656,4666,4667],{},"通用模型执行",[4635,4669,4670,4673,4676,4679],{},[4656,4671,4672],{},"上手难度",[4656,4674,4675],{},"中高",[4656,4677,4678],{},"低",[4656,4680,4675],{},[4635,4682,4683,4686,4689,4692],{},[4656,4684,4685],{},"多 GPU LLM",[4656,4687,4688],{},"强",[4656,4690,4691],{},"封装更多",[4656,4693,4694],{},"取决于实现",[4635,4696,4697,4699,4701,4704],{},[4656,4698,191],{},[4656,4700,4688],{},[4656,4702,4703],{},"一般",[4656,4705,4706],{},"取决于应用",[4635,4708,4709,4711,4714,4717],{},[4656,4710,197],{},[4656,4712,4713],{},"核心能力",[4656,4715,4716],{},"支持兼容接口",[4656,4718,4719],{},"一般自己实现",[4635,4721,4722,4725,4728,4731],{},[4656,4723,4724],{},"模型管理",[4656,4726,4727],{},"自己管理",[4656,4729,4730],{},"很方便",[4656,4732,4727],{},[4635,4734,4735,4738,4741,4743],{},[4656,4736,4737],{},"C++ 集成",[4656,4739,4740],{},"非主要用途",[4656,4742,4740],{},[4656,4744,4745],{},"很适合",[4635,4747,4748,4751,4754,4756],{},[4656,4749,4750],{},"长上下文调参",[4656,4752,4753],{},"灵活",[4656,4755,4691],{},[4656,4757,4694],{},[4635,4759,4760,4763,4766,4769],{},[4656,4761,4762],{},"适合本次",[4656,4764,4765],{},"是",[4656,4767,4768],{},"不优先",[4656,4770,4768],{},[22,4772,4773],{},"可以直接记：",[80,4775,4778],{"className":4776,"code":4777,"language":85,"meta":86},[83],"个人快速跑模型\n→ Ollama\n\nGPU 服务器模型服务\n→ vLLM\n\n软件内嵌模型\n→ ONNX Runtime\n",[57,4779,4777],{"__ignoreMap":86},[70,4781],{},[10,4783,4785],{"id":4784},"_25-后续性能优化方向","25. 后续性能优化方向",[22,4787,4788],{},"模型稳定运行以后，再研究性能。",[22,4790,4791],{},"重要指标：",[80,4793,4796],{"className":4794,"code":4795,"language":85,"meta":86},[83],"TTFT = Time To First Token\n首 token 延迟\n\nTPS = Tokens Per Second\n每秒生成 token 数\n",[57,4797,4795],{"__ignoreMap":86},[22,4799,4800],{},"建议分别对比：",[80,4802,4805],{"className":4803,"code":4804,"language":85,"meta":86},[83],"上下文：\n32K\n64K\n112K\n\n并发：\n1\n2\n4\n",[57,4806,4804],{"__ignoreMap":86},[22,4808,4809],{},"一次只改一个变量。",[22,4811,4812],{},"后续还可以研究：",[80,4814,4817],{"className":4815,"code":4816,"language":85,"meta":86},[83],"FP8 KV Cache\nPrefix Cache\nCUDA Graph\n移除 --enforce-eager\nNginx \u002F Caddy\nHTTPS\n监控\nBenchmark\n",[57,4818,4816],{"__ignoreMap":86},[70,4820],{},[10,4822,4824],{"id":4823},"_26-本次最终配置","26. 本次最终配置",[80,4826,4829],{"className":4827,"code":4828,"language":85,"meta":86},[83],"模型：\nQwen3.8-27B-AWQ-INT4\n\nGPU：\n2 × RTX A4000 16GB\n\n推理框架：\nvLLM\n\n部署方式：\nDocker\n\nTensor Parallel：\n2\n\nGPU Memory Utilization：\n0.96\n\n最大上下文：\n114688 tokens\n= 112K\n\n最大活跃 sequence：\n4\n\n多模态：\n开启\n\nReasoning Parser：\nqwen3\n\nEager：\n开启\n\nAPI：\nOpenAI-Compatible API\n\n端口：\n8000\n",[57,4830,4828],{"__ignoreMap":86},[22,4832,4833],{},"最终链路：",[80,4835,4838],{"className":4836,"code":4837,"language":85,"meta":86},[83],"2 × RTX A4000\n      ↓\nNVIDIA Container Runtime\n      ↓\nDocker\n      ↓\nvLLM\n      ↓\nQwen3.8-27B-AWQ-INT4\n      ↓\n112K Context\n+ 4 Active Sequences\n+ Vision\n      ↓\nOpenAI-Compatible API\n      ↓\nCherry Studio \u002F curl \u002F SDK\n",[57,4839,4837],{"__ignoreMap":86},[70,4841],{},[10,4843,4845],{"id":4844},"_27-最后应掌握的核心术语","27. 最后应掌握的核心术语",[80,4847,4850],{"className":4848,"code":4849,"language":85,"meta":86},[83],"Docker\n→ 容器运行环境\n\nvLLM\n→ 大模型服务端推理框架\n\nOllama\n→ 本地模型管理与运行工具\n\nONNX Runtime\n→ 通用模型执行运行时\n\n27B\n→ 参数规模\n\nAWQ\n→ 权重量化方案\n\nINT4\n→ 4-bit 权重量化\n\nTensor Parallel\n→ 多 GPU 共同运行一个模型\n\nKV Cache\n→ 保存历史 Attention K\u002FV 的显存缓存\n\nmax-model-len\n→ 单条 sequence 最大上下文\n\nmax-num-seqs\n→ 最大活跃 sequence 数\n\nserved-model-name\n→ API 对外暴露的模型 ID\n\nOpenSSL\n→ 本次用于生成安全随机 API Key\n\nBearer\n→ HTTP Token 鉴权格式\n\nBase64\n→ 把图片二进制编码成文本以便放进 JSON\n\nCherry Studio\n→ 客户端，真正推理发生在服务器 vLLM\n",[57,4851,4849],{"__ignoreMap":86},[4853,4854,4855],"style",{},"html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"title":86,"searchDepth":151,"depth":151,"links":4857},[4858,4859,4860,4863,4864,4865,4866,4867,4868,4869,4874,4876,4880,4881,4882,4883,4884,4885,4886,4888,4889,4894,4895,4896,4897,4898,4899,4900,4901,4902,4903,4904,4905,4906,4908,4909,4910,4911,4912,4913,4914,4915,4916,4917,4918,4919,4920,4921,4922],{"id":16,"depth":151,"text":17},{"id":116,"depth":151,"text":117},{"id":176,"depth":151,"text":177,"children":4861},[4862],{"id":219,"depth":283,"text":206},{"id":236,"depth":151,"text":237},{"id":323,"depth":151,"text":324},{"id":388,"depth":151,"text":389},{"id":458,"depth":151,"text":459},{"id":513,"depth":151,"text":514},{"id":535,"depth":151,"text":536},{"id":548,"depth":151,"text":549,"children":4870},[4871,4872,4873],{"id":588,"depth":283,"text":589},{"id":606,"depth":283,"text":607},{"id":625,"depth":283,"text":626},{"id":1089,"depth":151,"text":4875},"9.1 Hugging Face 和 hf 命令分别是什么",{"id":1140,"depth":151,"text":1141,"children":4877},[4878],{"id":1274,"depth":283,"text":4879},"为什么不再推荐 huggingface-cli",{"id":1332,"depth":151,"text":1333},{"id":1438,"depth":151,"text":1439},{"id":1483,"depth":151,"text":1484},{"id":1596,"depth":151,"text":1597},{"id":1673,"depth":151,"text":1674},{"id":1707,"depth":151,"text":1708},{"id":1785,"depth":151,"text":4887},"9.9 检查 config.json",{"id":1891,"depth":151,"text":1892},{"id":1980,"depth":151,"text":1981,"children":4890},[4891,4892,4893],{"id":1984,"depth":283,"text":1987},{"id":2038,"depth":283,"text":2041},{"id":2062,"depth":283,"text":2063},{"id":2221,"depth":151,"text":2222},{"id":2264,"depth":151,"text":2265},{"id":2393,"depth":151,"text":2394},{"id":2462,"depth":151,"text":2463},{"id":2518,"depth":151,"text":2519},{"id":2977,"depth":151,"text":2978},{"id":3099,"depth":151,"text":3102},{"id":3141,"depth":151,"text":3144},{"id":3153,"depth":151,"text":3156},{"id":3171,"depth":151,"text":3174},{"id":3198,"depth":151,"text":3201},{"id":3210,"depth":151,"text":3213},{"id":3237,"depth":151,"text":4907},"为什么没有 --language-model-only",{"id":3694,"depth":151,"text":3695},{"id":3710,"depth":151,"text":3711},{"id":3791,"depth":151,"text":3792},{"id":4093,"depth":151,"text":4094},{"id":4109,"depth":151,"text":4110},{"id":4143,"depth":151,"text":4144},{"id":4153,"depth":151,"text":4154},{"id":4177,"depth":151,"text":4178},{"id":4199,"depth":151,"text":4200},{"id":4229,"depth":151,"text":4230},{"id":4306,"depth":151,"text":4309},{"id":4353,"depth":151,"text":4356},{"id":4390,"depth":151,"text":4391},{"id":4415,"depth":151,"text":4418},{"id":4468,"depth":151,"text":4468},"md",{},"\u002Fwiki\u002F2026-08-21-qwen3.8_vllm_a4000",{"title":5,"description":86},"wiki\u002F2026-08-21-Qwen3.8_vLLM_双A4000部署教程","vmBobs-w7u-ZcctPSmT9LNrhjP8WLBrTa1phWwlSC7Q",[4930,4932,4937,4942,4948,4954,4959,4964,4969,4975,4982,4987,4993,4998,5003,5009,5015,5021,5026,5031,5036,5041,5046,5051,5056,5061,5066,5072,5077,5082,5088,5094,5099,5104,5109,5115,5120,5125,5130,5135,5142,5147,5152,5157,5162,5169,5174,5179,5184,5189,5194,5199,5204,5209,5214,5219,5224,5229,5234,5239,5244,5249,5254,5259,5264,5269,5274,5279,5284,5289,5294,5299,5304,5309,5314,5320,5325,5330,5335,5340,5345,5350,5355,5360,5366,5371,5376,5381,5386,5391,5396,5401,5406,5411,5416,5421,5426,5431,5436,5441,5446,5451,5456,5461,5466,5471,5476,5482,5487,5492,5497,5502,5507,5512,5517,5522,5527,5532,5537,5542],{"path":4925,"stem":4927,"title":5,"description":86,"meta":4931},{},{"path":4933,"stem":4934,"title":4935,"description":86,"meta":4936},"\u002Fwiki\u002F2026-05-24-c++\u002Fch1","wiki\u002F2026-05-24-c++学习\u002Fch1-基本认识","1.基础入门",{},{"path":4938,"stem":4939,"title":4940,"description":86,"meta":4941},"\u002Fwiki\u002F2026-05-24-c++\u002Fch2","wiki\u002F2026-05-24-c++学习\u002Fch2-函数","2.函数",{},{"path":4943,"stem":4944,"title":4945,"description":4946,"meta":4947},"\u002Fwiki\u002F2026-05-24-c++\u002Fch3","wiki\u002F2026-05-24-c++学习\u002Fch3-指针","3.指针","通过指针保存一个地址，指针就是个地址",{},{"path":4949,"stem":4950,"title":4951,"description":4952,"meta":4953},"\u002Fwiki\u002F2026-05-24-c++\u002Fch4","wiki\u002F2026-05-24-c++学习\u002Fch4-结构体","4.结构体","结构体属于用户自定义的数据类型，允许用户存储不同的数据类型",{},{"path":4955,"stem":4956,"title":4957,"description":86,"meta":4958},"\u002Fwiki\u002F2026-05-24-c++\u002Fch5","wiki\u002F2026-05-24-c++学习\u002Fch5-程序内存模型","5.程序内存模型",{},{"path":4960,"stem":4961,"title":4962,"description":86,"meta":4963},"\u002Fwiki\u002F2026-05-24-c++\u002Fch6","wiki\u002F2026-05-24-c++学习\u002Fch6-引用","6.引用",{},{"path":4965,"stem":4966,"title":4967,"description":86,"meta":4968},"\u002Fwiki\u002F2026-05-24-c++\u002Fch7","wiki\u002F2026-05-24-c++学习\u002Fch7-函数高级","7.函数(高级部分)",{},{"path":4970,"stem":4971,"title":4972,"description":4973,"meta":4974},"\u002Fwiki\u002F2026-05-24-c++\u002Fch8","wiki\u002F2026-05-24-c++学习\u002Fch8-类和对象","8.类和对象","C++面向对象的三大特性为封装、继承、多态",{},{"path":4976,"stem":4977,"title":4978,"description":4979,"meta":4980},"\u002Fwiki\u002F2026-05-24-c++","wiki\u002F2026-05-24-c++学习\u002Findex","c++",null,{"category":4981},"机器人",{"path":4983,"stem":4984,"title":4985,"description":86,"meta":4986},"\u002Fwiki\u002F2025-12-04\u002Fch1","wiki\u002F2025-12-04-强化学习\u002Fch1-强化学习的基本认识","1.强化学习基本认识",{},{"path":4988,"stem":4989,"title":4990,"description":4991,"meta":4992},"\u002Fwiki\u002F2025-12-04\u002Fch2","wiki\u002F2025-12-04-强化学习\u002Fch2-马尔可夫决策过程","2.马尔可夫决策过程","这是强化学习的基本框架",{},{"path":4994,"stem":4995,"title":4996,"description":86,"meta":4997},"\u002Fwiki\u002F2025-12-04\u002Fch3","wiki\u002F2025-12-04-强化学习\u002Fch3-动作价值函数","3.动作价值函数",{},{"path":4999,"stem":5000,"title":5001,"description":86,"meta":5002},"\u002Fwiki\u002F2025-12-04\u002Fch4","wiki\u002F2025-12-04-强化学习\u002Fch4-策略函数","4.策略学习",{},{"path":5004,"stem":5005,"title":5006,"description":5007,"meta":5008},"\u002Fwiki\u002F2025-12-04\u002Fch5-alphago","wiki\u002F2025-12-04-强化学习\u002Fch5-Alphago算法","5.Alphago算法","这一算法有两种实现形式：通过模仿学习来训练策略网络或通过强化学习来训练策略网络",{},{"path":5010,"stem":5011,"title":5012,"description":5013,"meta":5014},"\u002Fwiki\u002F2025-12-04\u002Fch6","wiki\u002F2025-12-04-强化学习\u002Fch6-价值网络","6.价值网络","价值网络是对状态价值函数V的近似，而不是对Q的近似",{},{"path":5016,"stem":5017,"title":5018,"description":5019,"meta":5020},"\u002Fwiki\u002F2025-12-04","wiki\u002F2025-12-04-强化学习\u002Findex","强化学习","记录自己的强化学习笔记。",{"category":4981},{"path":5022,"stem":5023,"title":5024,"description":4979,"meta":5025},"\u002Fwiki\u002F2025-12-01-lerobot101-act\u002Fch1","wiki\u002F2025-12-01-lerobot101-act算法复现\u002Fch1-项目概览与官方资源","1. 项目概览与官方资源",{},{"path":5027,"stem":5028,"title":5029,"description":4979,"meta":5030},"\u002Fwiki\u002F2025-12-01-lerobot101-act\u002Fch2","wiki\u002F2025-12-01-lerobot101-act算法复现\u002Fch2-环境准备与设备连接","2. 环境准备与设备连接",{},{"path":5032,"stem":5033,"title":5034,"description":4979,"meta":5035},"\u002Fwiki\u002F2025-12-01-lerobot101-act\u002Fch3-id","wiki\u002F2025-12-01-lerobot101-act算法复现\u002Fch3-电机ID配置与机械臂校准","3. 电机ID配置与机械臂校准",{},{"path":5037,"stem":5038,"title":5039,"description":4979,"meta":5040},"\u002Fwiki\u002F2025-12-01-lerobot101-act\u002Fch4","wiki\u002F2025-12-01-lerobot101-act算法复现\u002Fch4-遥操与相机接入","4. 遥操与相机接入",{},{"path":5042,"stem":5043,"title":5044,"description":4979,"meta":5045},"\u002Fwiki\u002F2025-12-01-lerobot101-act\u002Fch5-huggingface","wiki\u002F2025-12-01-lerobot101-act算法复现\u002Fch5-HuggingFace认证与仓库准备","5. HuggingFace认证与仓库准备",{},{"path":5047,"stem":5048,"title":5049,"description":4979,"meta":5050},"\u002Fwiki\u002F2025-12-01-lerobot101-act\u002Fch6","wiki\u002F2025-12-01-lerobot101-act算法复现\u002Fch6-数据录制重录与回放","6. 数据录制重录与回放",{},{"path":5052,"stem":5053,"title":5054,"description":4979,"meta":5055},"\u002Fwiki\u002F2025-12-01-lerobot101-act\u002Fch7-act","wiki\u002F2025-12-01-lerobot101-act算法复现\u002Fch7-ACT模型训练","7. ACT模型训练",{},{"path":5057,"stem":5058,"title":5059,"description":4979,"meta":5060},"\u002Fwiki\u002F2025-12-01-lerobot101-act\u002Fch8","wiki\u002F2025-12-01-lerobot101-act算法复现\u002Fch8-策略部署与自动采集","8. 策略部署与自动采集",{},{"path":5062,"stem":5063,"title":5064,"description":4979,"meta":5065},"\u002Fwiki\u002F2025-12-01-lerobot101-act\u002Fch9-isaaclab","wiki\u002F2025-12-01-lerobot101-act算法复现\u002Fch9-IsaacLab仿真拓展","9. IsaacLab仿真拓展",{},{"path":5067,"stem":5068,"title":5069,"description":5070,"meta":5071},"\u002Fwiki\u002F2025-12-01-lerobot101-act","wiki\u002F2025-12-01-lerobot101-act算法复现\u002Findex","lerobot-act算法复现","act复现",{"category":4981},{"path":5073,"stem":5074,"title":5075,"description":86,"meta":5076},"\u002Fwiki\u002F2025-11-10-docker\u002Fch1","wiki\u002F2025-11-10-Docker\u002Fch1-简介","1.简介",{},{"path":5078,"stem":5079,"title":5080,"description":86,"meta":5081},"\u002Fwiki\u002F2025-11-10-docker\u002Fch2-docker","wiki\u002F2025-11-10-Docker\u002Fch2-安装Docker","2.安装Docker",{},{"path":5083,"stem":5084,"title":5085,"description":5086,"meta":5087},"\u002Fwiki\u002F2025-11-10-docker\u002Fch3-docker","wiki\u002F2025-11-10-Docker\u002Fch3-Docker直通","3.Docker直通","将宿主机的硬件设备或特定资源直接传递给Docker容器使用的技术",{},{"path":5089,"stem":5090,"title":5091,"description":5092,"meta":5093},"\u002Fwiki\u002F2025-11-10-docker\u002Fch4-dockerhub","wiki\u002F2025-11-10-Docker\u002Fch4-DockerHub换源","4.DockerHub换源","（DockerHub已于2024年5月被🇨🇳封杀，各大国内镜像源均已下架DockerHub镜像源，直接挂梯用官方源吧）",{},{"path":5095,"stem":5096,"title":5097,"description":86,"meta":5098},"\u002Fwiki\u002F2025-11-10-docker\u002Fch5-docker","wiki\u002F2025-11-10-Docker\u002Fch5-Docker命令学习","5.Docker命令学习",{},{"path":5100,"stem":5101,"title":5102,"description":86,"meta":5103},"\u002Fwiki\u002F2025-11-10-docker\u002Fch6-docker","wiki\u002F2025-11-10-Docker\u002Fch6-手动创建Docker镜像","6.手动创建Docker镜像",{},{"path":5105,"stem":5106,"title":5107,"description":86,"meta":5108},"\u002Fwiki\u002F2025-11-10-docker\u002Fch7-vscode","wiki\u002F2025-11-10-Docker\u002Fch7-VScode远程开发","7.VScode远程开发",{},{"path":5110,"stem":5111,"title":5112,"description":4979,"meta":5113},"\u002Fwiki\u002F2025-11-10-docker","wiki\u002F2025-11-10-Docker\u002Findex","Docker",{"category":5114},"运维",{"path":5116,"stem":5117,"title":5118,"description":4979,"meta":5119},"\u002Fwiki\u002F2025-11-10-k8s","wiki\u002F2025-11-10-k8s","K8S",{"category":5114},{"path":5121,"stem":5122,"title":5123,"description":4979,"meta":5124},"\u002Fwiki\u002F2025-11-03-cnn\u002Fch1","wiki\u002F2025-11-03-cnn基础\u002Fch1-验证深度学习环境","1.验证深度学习环境",{},{"path":5126,"stem":5127,"title":5128,"description":4979,"meta":5129},"\u002Fwiki\u002F2025-11-03-cnn\u002Fch2","wiki\u002F2025-11-03-cnn基础\u002Fch2-经典神经网络","2.经典神经网络",{},{"path":5131,"stem":5132,"title":5133,"description":4979,"meta":5134},"\u002Fwiki\u002F2025-11-03-cnn\u002Fch3-yolo","wiki\u002F2025-11-03-cnn基础\u002Fch3-yolo模型学习","3.yolo模型学习",{},{"path":5136,"stem":5137,"title":5138,"description":5139,"meta":5140},"\u002Fwiki\u002F2025-11-03-cnn","wiki\u002F2025-11-03-cnn基础\u002Findex","CNN基础","深度学习学习",{"category":5141},"深度学习",{"path":5143,"stem":5144,"title":5145,"description":4979,"meta":5146},"\u002Fwiki\u002F2025-09-02-js\u002Fch1","wiki\u002F2025-09-02-JS学习\u002Fch1-工具","1.工具",{},{"path":5148,"stem":5149,"title":5150,"description":4979,"meta":5151},"\u002Fwiki\u002F2025-09-02-js\u002Fch2","wiki\u002F2025-09-02-JS学习\u002Fch2-基础语法","2.基础语法",{},{"path":5153,"stem":5154,"title":5155,"description":4979,"meta":5156},"\u002Fwiki\u002F2025-09-02-js\u002Fch3-web-apis","wiki\u002F2025-09-02-JS学习\u002Fch3-Web-APIs","3.Web APIs",{},{"path":5158,"stem":5159,"title":5160,"description":4979,"meta":5161},"\u002Fwiki\u002F2025-09-02-js\u002Fch4-js","wiki\u002F2025-09-02-JS学习\u002Fch4-js进阶","4.js进阶",{},{"path":5163,"stem":5164,"title":5165,"description":5166,"meta":5167},"\u002Fwiki\u002F2025-09-02-js","wiki\u002F2025-09-02-JS学习\u002Findex","JS学习","三件套第三套学习",{"category":5168},"前端",{"path":5170,"stem":5171,"title":5172,"description":4979,"meta":5173},"\u002Fwiki\u002F2025-08-14-numpy\u002Fch1","wiki\u002F2025-08-14-numpy\u002Fch1-安装","1.安装",{},{"path":5175,"stem":5176,"title":5177,"description":4979,"meta":5178},"\u002Fwiki\u002F2025-08-14-numpy\u002Fch10","wiki\u002F2025-08-14-numpy\u002Fch10-算数函数","10.算数函数",{},{"path":5180,"stem":5181,"title":5182,"description":4979,"meta":5183},"\u002Fwiki\u002F2025-08-14-numpy\u002Fch11","wiki\u002F2025-08-14-numpy\u002Fch11-统计函数","11.统计函数",{},{"path":5185,"stem":5186,"title":5187,"description":4979,"meta":5188},"\u002Fwiki\u002F2025-08-14-numpy\u002Fch12","wiki\u002F2025-08-14-numpy\u002Fch12-其他常用函数","12.其他常用函数",{},{"path":5190,"stem":5191,"title":5192,"description":4979,"meta":5193},"\u002Fwiki\u002F2025-08-14-numpy\u002Fch13","wiki\u002F2025-08-14-numpy\u002Fch13-数组排序","13.数组排序",{},{"path":5195,"stem":5196,"title":5197,"description":4979,"meta":5198},"\u002Fwiki\u002F2025-08-14-numpy\u002Fch14","wiki\u002F2025-08-14-numpy\u002Fch14-广播机制","14.广播机制",{},{"path":5200,"stem":5201,"title":5202,"description":4979,"meta":5203},"\u002Fwiki\u002F2025-08-14-numpy\u002Fch15","wiki\u002F2025-08-14-numpy\u002Fch15-比较掩码","15.比较掩码",{},{"path":5205,"stem":5206,"title":5207,"description":4979,"meta":5208},"\u002Fwiki\u002F2025-08-14-numpy\u002Fch16-time","wiki\u002F2025-08-14-numpy\u002Fch16-魔法命令time","16.魔法命令time",{},{"path":5210,"stem":5211,"title":5212,"description":4979,"meta":5213},"\u002Fwiki\u002F2025-08-14-numpy\u002Fch17-timeit","wiki\u002F2025-08-14-numpy\u002Fch17-魔法命令timeit","17.魔法命令timeit",{},{"path":5215,"stem":5216,"title":5217,"description":4979,"meta":5218},"\u002Fwiki\u002F2025-08-14-numpy\u002Fch18-writefilerun","wiki\u002F2025-08-14-numpy\u002Fch18-魔法命令writefile和run","18.魔法命令writefile和run",{},{"path":5220,"stem":5221,"title":5222,"description":4979,"meta":5223},"\u002Fwiki\u002F2025-08-14-numpy\u002Fch19-memit","wiki\u002F2025-08-14-numpy\u002Fch19-魔法命令memit","19.魔法命令memit",{},{"path":5225,"stem":5226,"title":5227,"description":4979,"meta":5228},"\u002Fwiki\u002F2025-08-14-numpy\u002Fch2","wiki\u002F2025-08-14-numpy\u002Fch2-创建数组","2.创建数组",{},{"path":5230,"stem":5231,"title":5232,"description":4979,"meta":5233},"\u002Fwiki\u002F2025-08-14-numpy\u002Fch20-mprun","wiki\u002F2025-08-14-numpy\u002Fch20-魔法命令mprun","20.魔法命令mprun",{},{"path":5235,"stem":5236,"title":5237,"description":4979,"meta":5238},"\u002Fwiki\u002F2025-08-14-numpy\u002Fch3","wiki\u002F2025-08-14-numpy\u002Fch3-一维数组的索引和切片","3.一维数组的索引和切片",{},{"path":5240,"stem":5241,"title":5242,"description":4979,"meta":5243},"\u002Fwiki\u002F2025-08-14-numpy\u002Fch4","wiki\u002F2025-08-14-numpy\u002Fch4-二维数组的索引与切片","4.二维数组的索引与切片",{},{"path":5245,"stem":5246,"title":5247,"description":4979,"meta":5248},"\u002Fwiki\u002F2025-08-14-numpy\u002Fch5","wiki\u002F2025-08-14-numpy\u002Fch5-改变数组的维度","5.改变数组的维度",{},{"path":5250,"stem":5251,"title":5252,"description":4979,"meta":5253},"\u002Fwiki\u002F2025-08-14-numpy\u002Fch6","wiki\u002F2025-08-14-numpy\u002Fch6-数组的拼接","6.数组的拼接",{},{"path":5255,"stem":5256,"title":5257,"description":4979,"meta":5258},"\u002Fwiki\u002F2025-08-14-numpy\u002Fch7","wiki\u002F2025-08-14-numpy\u002Fch7-数组转置","7.数组转置",{},{"path":5260,"stem":5261,"title":5262,"description":4979,"meta":5263},"\u002Fwiki\u002F2025-08-14-numpy\u002Fch8","wiki\u002F2025-08-14-numpy\u002Fch8-数组分割","8.数组分割",{},{"path":5265,"stem":5266,"title":5267,"description":4979,"meta":5268},"\u002Fwiki\u002F2025-08-14-numpy\u002Fch9","wiki\u002F2025-08-14-numpy\u002Fch9-数学函数","9.数学函数",{},{"path":5270,"stem":5271,"title":5272,"description":4979,"meta":5273},"\u002Fwiki\u002F2025-08-14-numpy","wiki\u002F2025-08-14-numpy\u002Findex","numpy",{"category":5141},{"path":5275,"stem":5276,"title":5277,"description":86,"meta":5278},"\u002Fwiki\u002F2025-05-17-mujoco\u002Fch1-mujoco","wiki\u002F2025-05-17-mujoco学习\u002Fch1-环境安装与第一个MuJoCo程序","1.环境安装与第一个 MuJoCo 程序",{},{"path":5280,"stem":5281,"title":5282,"description":86,"meta":5283},"\u002Fwiki\u002F2025-05-17-mujoco\u002Fch2-xmlmjcf","wiki\u002F2025-05-17-mujoco学习\u002Fch2-XML与MJCF物理建模基础","2.XML 与 MJCF 物理建模基础",{},{"path":5285,"stem":5286,"title":5287,"description":86,"meta":5288},"\u002Fwiki\u002F2025-05-17-mujoco\u002Fch3-python","wiki\u002F2025-05-17-mujoco学习\u002Fch3-Python控制接口","3.Python 控制接口：读取状态与推进仿真",{},{"path":5290,"stem":5291,"title":5292,"description":86,"meta":5293},"\u002Fwiki\u002F2025-05-17-mujoco\u002Fch4-actuator","wiki\u002F2025-05-17-mujoco学习\u002Fch4-关节Actuator与力控制","4.关节、Actuator 与力控制",{},{"path":5295,"stem":5296,"title":5297,"description":86,"meta":5298},"\u002Fwiki\u002F2025-05-17-mujoco\u002Fch5-viewerrenderer","wiki\u002F2025-05-17-mujoco学习\u002Fch5-Viewer与Renderer","5.Viewer 可视化与 Renderer 离屏渲染",{},{"path":5300,"stem":5301,"title":5302,"description":86,"meta":5303},"\u002Fwiki\u002F2025-05-17-mujoco\u002Fch6-cartpole","wiki\u002F2025-05-17-mujoco学习\u002Fch6-Cartpole控制任务","6.控制任务：Cartpole",{},{"path":5305,"stem":5306,"title":5307,"description":86,"meta":5308},"\u002Fwiki\u002F2025-05-17-mujoco\u002Fch7-reacher","wiki\u002F2025-05-17-mujoco学习\u002Fch7-Reacher控制任务","7.控制任务：Reacher 机械臂到达目标",{},{"path":5310,"stem":5311,"title":5312,"description":86,"meta":5313},"\u002Fwiki\u002F2025-05-17-mujoco\u002Fch8-gymnasium","wiki\u002F2025-05-17-mujoco学习\u002Fch8-Gymnasium接口基础","8.Gymnasium 风格强化学习接口基础",{},{"path":5315,"stem":5316,"title":5317,"description":5318,"meta":5319},"\u002Fwiki\u002F2025-05-17-mujoco","wiki\u002F2025-05-17-mujoco学习\u002Findex","mujoco学习","仿真搭建。",{"category":4981},{"path":5321,"stem":5322,"title":5323,"description":4979,"meta":5324},"\u002Fwiki\u002F2025-01-27-linux\u002Fch1","wiki\u002F2025-01-27-Linux基本操作\u002Fch1-最常用的基本操作（更新）","1. 最常用的基本操作（更新）",{},{"path":5326,"stem":5327,"title":5328,"description":4979,"meta":5329},"\u002Fwiki\u002F2025-01-27-linux\u002Fch2-linux","wiki\u002F2025-01-27-Linux基本操作\u002Fch2-Linux装机教程","2. Linux装机教程",{},{"path":5331,"stem":5332,"title":5333,"description":4979,"meta":5334},"\u002Fwiki\u002F2025-01-27-linux\u002Fch3","wiki\u002F2025-01-27-Linux基本操作\u002Fch3-安装必备配置","3. 安装必备配置",{},{"path":5336,"stem":5337,"title":5338,"description":4979,"meta":5339},"\u002Fwiki\u002F2025-01-27-linux\u002Fch4-()","wiki\u002F2025-01-27-Linux基本操作\u002Fch4-命令教程(长期积累)","4. 命令教程(长期积累)",{},{"path":5341,"stem":5342,"title":5343,"description":4979,"meta":5344},"\u002Fwiki\u002F2025-01-27-linux\u002Fch5","wiki\u002F2025-01-27-Linux基本操作\u002Fch5-各种环境配置","5. 各种环境配置",{},{"path":5346,"stem":5347,"title":5348,"description":4979,"meta":5349},"\u002Fwiki\u002F2025-01-27-linux\u002Fch6","wiki\u002F2025-01-27-Linux基本操作\u002Fch6-拓展功能","6. 拓展功能",{},{"path":5351,"stem":5352,"title":5353,"description":4979,"meta":5354},"\u002Fwiki\u002F2025-01-27-linux\u002Fch7","wiki\u002F2025-01-27-Linux基本操作\u002Fch7-其他操作","7. 其他操作",{},{"path":5356,"stem":5357,"title":5358,"description":4979,"meta":5359},"\u002Fwiki\u002F2025-01-27-linux","wiki\u002F2025-01-27-Linux基本操作\u002Findex","Linux基本操作",{"category":5114},{"path":5361,"stem":5362,"title":5363,"description":5364,"meta":5365},"\u002Fwiki\u002F2025-01-09-genesis-ai","wiki\u002F2025-01-09-Genesis-AI项目","Genesis AI项目","项目简介：Genesis是一个开源的生成式物理引擎，由卡内基梅隆大学等20多个研究机构经过两年合作开发而成，旨在为通用机器人、具身人工智能和物理人工智能应用提供支持。通过使用genesis对机器人及工程环境仿真实现实验内容。",{"category":4981},{"path":5367,"stem":5368,"title":5369,"description":4979,"meta":5370},"\u002Fwiki\u002F2024-10-10-htmlcss\u002Fch01","wiki\u002F2024-10-10-Html和CSS学习\u002Fch01-基础知识","1. 基础知识",{},{"path":5372,"stem":5373,"title":5374,"description":4979,"meta":5375},"\u002Fwiki\u002F2024-10-10-htmlcss\u002Fch02-vscode","wiki\u002F2024-10-10-Html和CSS学习\u002Fch02-vscode必备内容","2. vscode必备内容",{},{"path":5377,"stem":5378,"title":5379,"description":4979,"meta":5380},"\u002Fwiki\u002F2024-10-10-htmlcss\u002Fch03-html","wiki\u002F2024-10-10-Html和CSS学习\u002Fch03-HTML文本与容器标签","3. HTML文本与容器标签",{},{"path":5382,"stem":5383,"title":5384,"description":4979,"meta":5385},"\u002Fwiki\u002F2024-10-10-htmlcss\u002Fch04-html","wiki\u002F2024-10-10-Html和CSS学习\u002Fch04-HTML图像与链接","4. HTML图像与链接",{},{"path":5387,"stem":5388,"title":5389,"description":4979,"meta":5390},"\u002Fwiki\u002F2024-10-10-htmlcss\u002Fch05-html","wiki\u002F2024-10-10-Html和CSS学习\u002Fch05-HTML表格列表与表单","5. HTML表格列表与表单",{},{"path":5392,"stem":5393,"title":5394,"description":4979,"meta":5395},"\u002Fwiki\u002F2024-10-10-htmlcss\u002Fch06-css","wiki\u002F2024-10-10-Html和CSS学习\u002Fch06-CSS语法与文本样式","6. CSS语法与文本样式",{},{"path":5397,"stem":5398,"title":5399,"description":4979,"meta":5400},"\u002Fwiki\u002F2024-10-10-htmlcss\u002Fch07-css","wiki\u002F2024-10-10-Html和CSS学习\u002Fch07-CSS引入方式与选择器进阶","7. CSS引入方式与选择器进阶",{},{"path":5402,"stem":5403,"title":5404,"description":4979,"meta":5405},"\u002Fwiki\u002F2024-10-10-htmlcss\u002Fch08-css","wiki\u002F2024-10-10-Html和CSS学习\u002Fch08-CSS显示模式与背景特性","8. CSS显示模式与背景特性",{},{"path":5407,"stem":5408,"title":5409,"description":4979,"meta":5410},"\u002Fwiki\u002F2024-10-10-htmlcss\u002Fch09-css","wiki\u002F2024-10-10-Html和CSS学习\u002Fch09-CSS盒模型浮动与切图","9. CSS盒模型浮动与切图",{},{"path":5412,"stem":5413,"title":5414,"description":4979,"meta":5415},"\u002Fwiki\u002F2024-10-10-htmlcss\u002Fch10-css","wiki\u002F2024-10-10-Html和CSS学习\u002Fch10-CSS规范与学成在线案例","10. CSS规范与学成在线案例",{},{"path":5417,"stem":5418,"title":5419,"description":4979,"meta":5420},"\u002Fwiki\u002F2024-10-10-htmlcss\u002Fch11","wiki\u002F2024-10-10-Html和CSS学习\u002Fch11-传统布局与定位体系","11. 传统布局与定位体系",{},{"path":5422,"stem":5423,"title":5424,"description":4979,"meta":5425},"\u002Fwiki\u002F2024-10-10-htmlcss\u002Fch12","wiki\u002F2024-10-10-Html和CSS学习\u002Fch12-显示隐藏与图形资源","12. 显示隐藏与图形资源",{},{"path":5427,"stem":5428,"title":5429,"description":4979,"meta":5430},"\u002Fwiki\u002F2024-10-10-htmlcss\u002Fch13","wiki\u002F2024-10-10-Html和CSS学习\u002Fch13-界面样式与布局技巧","13. 界面样式与布局技巧",{},{"path":5432,"stem":5433,"title":5434,"description":4979,"meta":5435},"\u002Fwiki\u002F2024-10-10-htmlcss\u002Fch14-html5css3","wiki\u002F2024-10-10-Html和CSS学习\u002Fch14-HTML5与CSS3新特性","14. HTML5与CSS3新特性",{},{"path":5437,"stem":5438,"title":5439,"description":4979,"meta":5440},"\u002Fwiki\u002F2024-10-10-htmlcss\u002Fch15","wiki\u002F2024-10-10-Html和CSS学习\u002Fch15-品优购项目上篇-搭建与公共模块","15. 品优购项目上篇-搭建与公共模块",{},{"path":5442,"stem":5443,"title":5444,"description":4979,"meta":5445},"\u002Fwiki\u002F2024-10-10-htmlcss\u002Fch16","wiki\u002F2024-10-10-Html和CSS学习\u002Fch16-品优购项目下篇-主体与页面开发","16. 品优购项目下篇-主体与页面开发",{},{"path":5447,"stem":5448,"title":5449,"description":4979,"meta":5450},"\u002Fwiki\u002F2024-10-10-htmlcss\u002Fch17-web","wiki\u002F2024-10-10-Html和CSS学习\u002Fch17-Web服务器与网站发布","17. Web服务器与网站发布",{},{"path":5452,"stem":5453,"title":5454,"description":4979,"meta":5455},"\u002Fwiki\u002F2024-10-10-htmlcss\u002Fch18-2d3d","wiki\u002F2024-10-10-Html和CSS学习\u002Fch18-2D动画与3D转换","18. 2D动画与3D转换",{},{"path":5457,"stem":5458,"title":5459,"description":4979,"meta":5460},"\u002Fwiki\u002F2024-10-10-htmlcss\u002Fch19","wiki\u002F2024-10-10-Html和CSS学习\u002Fch19-移动端基础-前缀现状与视口","19. 移动端基础-前缀现状与视口",{},{"path":5462,"stem":5463,"title":5464,"description":4979,"meta":5465},"\u002Fwiki\u002F2024-10-10-htmlcss\u002Fch20","wiki\u002F2024-10-10-Html和CSS学习\u002Fch20-移动端布局实战上篇","20. 移动端布局实战上篇",{},{"path":5467,"stem":5468,"title":5469,"description":4979,"meta":5470},"\u002Fwiki\u002F2024-10-10-htmlcss\u002Fch21","wiki\u002F2024-10-10-Html和CSS学习\u002Fch21-移动端布局实战下篇","21. 移动端布局实战下篇",{},{"path":5472,"stem":5473,"title":5474,"description":4979,"meta":5475},"\u002Fwiki\u002F2024-10-10-htmlcss\u002Fch22","wiki\u002F2024-10-10-Html和CSS学习\u002Fch22-代码提交与新型相对单位","22. 代码提交与新型相对单位",{},{"path":5477,"stem":5478,"title":5479,"description":5480,"meta":5481},"\u002Fwiki\u002F2024-10-10-htmlcss","wiki\u002F2024-10-10-Html和CSS学习\u002Findex","Html和CSS学习","自己正经开始学编程的第一门语言！",{"category":5168},{"path":5483,"stem":5484,"title":5485,"description":4979,"meta":5486},"\u002Fwiki\u002F2024-10-10-python\u002Fch1-python","wiki\u002F2024-10-10-python教程\u002Fch1-Python环境与第一个程序","1. Python环境与第一个程序",{},{"path":5488,"stem":5489,"title":5490,"description":4979,"meta":5491},"\u002Fwiki\u002F2024-10-10-python\u002Fch10-jsonpyecharts","wiki\u002F2024-10-10-python教程\u002Fch10-JSON与pyecharts折线图","10. JSON与pyecharts折线图",{},{"path":5493,"stem":5494,"title":5495,"description":4979,"meta":5496},"\u002Fwiki\u002F2024-10-10-python\u002Fch11","wiki\u002F2024-10-10-python教程\u002Fch11-面向对象基础","11. 面向对象基础",{},{"path":5498,"stem":5499,"title":5500,"description":4979,"meta":5501},"\u002Fwiki\u002F2024-10-10-python\u002Fch12","wiki\u002F2024-10-10-python教程\u002Fch12-综合案例与复习路线","12. 综合案例与复习路线",{},{"path":5503,"stem":5504,"title":5505,"description":4979,"meta":5506},"\u002Fwiki\u002F2024-10-10-python\u002Fch2","wiki\u002F2024-10-10-python教程\u002Fch2-基础语法变量与字符串","2. 基础语法、变量与字符串",{},{"path":5508,"stem":5509,"title":5510,"description":4979,"meta":5511},"\u002Fwiki\u002F2024-10-10-python\u002Fch3","wiki\u002F2024-10-10-python教程\u002Fch3-判断语句","3. 判断语句",{},{"path":5513,"stem":5514,"title":5515,"description":4979,"meta":5516},"\u002Fwiki\u002F2024-10-10-python\u002Fch4","wiki\u002F2024-10-10-python教程\u002Fch4-循环语句","4. 循环语句",{},{"path":5518,"stem":5519,"title":5520,"description":4979,"meta":5521},"\u002Fwiki\u002F2024-10-10-python\u002Fch5","wiki\u002F2024-10-10-python教程\u002Fch5-函数基础","5. 函数基础",{},{"path":5523,"stem":5524,"title":5525,"description":4979,"meta":5526},"\u002Fwiki\u002F2024-10-10-python\u002Fch6","wiki\u002F2024-10-10-python教程\u002Fch6-数据容器","6. 数据容器",{},{"path":5528,"stem":5529,"title":5530,"description":4979,"meta":5531},"\u002Fwiki\u002F2024-10-10-python\u002Fch7","wiki\u002F2024-10-10-python教程\u002Fch7-函数进阶","7. 函数进阶",{},{"path":5533,"stem":5534,"title":5535,"description":4979,"meta":5536},"\u002Fwiki\u002F2024-10-10-python\u002Fch8","wiki\u002F2024-10-10-python教程\u002Fch8-文件操作","8. 文件操作",{},{"path":5538,"stem":5539,"title":5540,"description":4979,"meta":5541},"\u002Fwiki\u002F2024-10-10-python\u002Fch9","wiki\u002F2024-10-10-python教程\u002Fch9-异常模块与包","9. 异常、模块与包",{},{"path":5543,"stem":5544,"title":5545,"description":5546,"meta":5547},"\u002Fwiki\u002F2024-10-10-python","wiki\u002F2024-10-10-python教程\u002Findex","Python教程","参考黑马程序员 Python 快速入门路线整理的零基础到综合案例笔记",{"category":4981},1791660993467]