[{"data":1,"prerenderedAt":779},["ShallowReactive",2],{"tech-ai-deploy-linux":3},{"id":4,"title":5,"body":6,"description":770,"extension":771,"meta":772,"navigation":71,"path":775,"seo":776,"stem":777,"__hash__":778},"content\u002Ftech\u002Fai-deploy-linux.md","Linux 部署 AI 模型实践",{"type":7,"value":8,"toc":741},"minimark",[9,13,17,22,27,93,96,124,128,131,135,158,161,200,203,278,282,285,306,309,377,381,385,465,469,487,491,534,538,542,559,612,615,640,644,647,703,706,730,734,737],[10,11,5],"h1",{"id":12},"linux-部署-ai-模型实践",[14,15,16],"p",{},"随着大语言模型的普及，越来越多的开发者希望在本地 Linux 环境部署 AI 模型。本文将详细介绍如何在 Linux 系统上部署和运行 AI 模型。",[18,19,21],"h2",{"id":20},"一环境准备","一、环境准备",[23,24,26],"h3",{"id":25},"安装-python","安装 Python",[28,29,34],"pre",{"className":30,"code":31,"language":32,"meta":33,"style":33},"language-bash shiki shiki-themes github-light github-dark","# Ubuntu\u002FDebian\nsudo apt-get install python3 python3-pip\n\n# CentOS\u002FRHEL\nsudo yum install python3 python3-pip\n","bash","",[35,36,37,46,66,73,79],"code",{"__ignoreMap":33},[38,39,42],"span",{"class":40,"line":41},"line",1,[38,43,45],{"class":44},"sJ8bj","# Ubuntu\u002FDebian\n",[38,47,49,53,57,60,63],{"class":40,"line":48},2,[38,50,52],{"class":51},"sScJk","sudo",[38,54,56],{"class":55},"sZZnC"," apt-get",[38,58,59],{"class":55}," install",[38,61,62],{"class":55}," python3",[38,64,65],{"class":55}," python3-pip\n",[38,67,69],{"class":40,"line":68},3,[38,70,72],{"emptyLinePlaceholder":71},true,"\n",[38,74,76],{"class":40,"line":75},4,[38,77,78],{"class":44},"# CentOS\u002FRHEL\n",[38,80,82,84,87,89,91],{"class":40,"line":81},5,[38,83,52],{"class":51},[38,85,86],{"class":55}," yum",[38,88,59],{"class":55},[38,90,62],{"class":55},[38,92,65],{"class":55},[23,94,95],{"id":95},"创建虚拟环境",[28,97,99],{"className":30,"code":98,"language":32,"meta":33,"style":33},"python3 -m venv ai-env\nsource ai-env\u002Fbin\u002Factivate\n",[35,100,101,116],{"__ignoreMap":33},[38,102,103,106,110,113],{"class":40,"line":41},[38,104,105],{"class":51},"python3",[38,107,109],{"class":108},"sj4cs"," -m",[38,111,112],{"class":55}," venv",[38,114,115],{"class":55}," ai-env\n",[38,117,118,121],{"class":40,"line":48},[38,119,120],{"class":108},"source",[38,122,123],{"class":55}," ai-env\u002Fbin\u002Factivate\n",[18,125,127],{"id":126},"二使用-ollama-部署","二、使用 Ollama 部署",[14,129,130],{},"Ollama 是一个简单易用的 AI 模型部署工具。",[23,132,134],{"id":133},"安装-ollama","安装 Ollama",[28,136,138],{"className":30,"code":137,"language":32,"meta":33,"style":33},"curl -fsSL https:\u002F\u002Follama.com\u002Finstall.sh | sh\n",[35,139,140],{"__ignoreMap":33},[38,141,142,145,148,151,155],{"class":40,"line":41},[38,143,144],{"class":51},"curl",[38,146,147],{"class":108}," -fsSL",[38,149,150],{"class":55}," https:\u002F\u002Follama.com\u002Finstall.sh",[38,152,154],{"class":153},"szBVR"," |",[38,156,157],{"class":51}," sh\n",[23,159,160],{"id":160},"运行模型",[28,162,164],{"className":30,"code":163,"language":32,"meta":33,"style":33},"# 拉取模型\nollama pull llama3\n\n# 运行模型\nollama run llama3\n",[35,165,166,171,182,186,191],{"__ignoreMap":33},[38,167,168],{"class":40,"line":41},[38,169,170],{"class":44},"# 拉取模型\n",[38,172,173,176,179],{"class":40,"line":48},[38,174,175],{"class":51},"ollama",[38,177,178],{"class":55}," pull",[38,180,181],{"class":55}," llama3\n",[38,183,184],{"class":40,"line":68},[38,185,72],{"emptyLinePlaceholder":71},[38,187,188],{"class":40,"line":75},[38,189,190],{"class":44},"# 运行模型\n",[38,192,193,195,198],{"class":40,"line":81},[38,194,175],{"class":51},[38,196,197],{"class":55}," run",[38,199,181],{"class":55},[23,201,202],{"id":202},"创建自定义模型",[28,204,206],{"className":30,"code":205,"language":32,"meta":33,"style":33},"# 创建 Modelfile\nFROM llama3\nPARAMETER temperature 0.8\n\n# 构建模型\nollama create my-model -f Modelfile\n\n# 运行自定义模型\nollama run my-model\n",[35,207,208,213,220,231,235,240,257,262,268],{"__ignoreMap":33},[38,209,210],{"class":40,"line":41},[38,211,212],{"class":44},"# 创建 Modelfile\n",[38,214,215,218],{"class":40,"line":48},[38,216,217],{"class":51},"FROM",[38,219,181],{"class":55},[38,221,222,225,228],{"class":40,"line":68},[38,223,224],{"class":51},"PARAMETER",[38,226,227],{"class":55}," temperature",[38,229,230],{"class":108}," 0.8\n",[38,232,233],{"class":40,"line":75},[38,234,72],{"emptyLinePlaceholder":71},[38,236,237],{"class":40,"line":81},[38,238,239],{"class":44},"# 构建模型\n",[38,241,243,245,248,251,254],{"class":40,"line":242},6,[38,244,175],{"class":51},[38,246,247],{"class":55}," create",[38,249,250],{"class":55}," my-model",[38,252,253],{"class":108}," -f",[38,255,256],{"class":55}," Modelfile\n",[38,258,260],{"class":40,"line":259},7,[38,261,72],{"emptyLinePlaceholder":71},[38,263,265],{"class":40,"line":264},8,[38,266,267],{"class":44},"# 运行自定义模型\n",[38,269,271,273,275],{"class":40,"line":270},9,[38,272,175],{"class":51},[38,274,197],{"class":55},[38,276,277],{"class":55}," my-model\n",[18,279,281],{"id":280},"三使用-hugging-face-部署","三、使用 Hugging Face 部署",[23,283,284],{"id":284},"安装依赖",[28,286,288],{"className":30,"code":287,"language":32,"meta":33,"style":33},"pip install transformers torch accelerate\n",[35,289,290],{"__ignoreMap":33},[38,291,292,295,297,300,303],{"class":40,"line":41},[38,293,294],{"class":51},"pip",[38,296,59],{"class":55},[38,298,299],{"class":55}," transformers",[38,301,302],{"class":55}," torch",[38,304,305],{"class":55}," accelerate\n",[23,307,308],{"id":308},"加载模型",[28,310,314],{"className":311,"code":312,"language":313,"meta":33,"style":33},"language-python shiki shiki-themes github-light github-dark","from transformers import AutoTokenizer, AutoModelForCausalLM\n\n# 加载模型\nmodel_name = \"gpt2\"\ntokenizer = AutoTokenizer.from_pretrained(model_name)\nmodel = AutoModelForCausalLM.from_pretrained(model_name)\n\n# 生成文本\nprompt = \"Hello, how are you?\"\ninputs = tokenizer(prompt, return_tensors=\"pt\")\noutputs = model.generate(**inputs)\nprint(tokenizer.decode(outputs[0]))\n","python",[35,315,316,321,325,330,335,340,345,349,354,359,365,371],{"__ignoreMap":33},[38,317,318],{"class":40,"line":41},[38,319,320],{},"from transformers import AutoTokenizer, AutoModelForCausalLM\n",[38,322,323],{"class":40,"line":48},[38,324,72],{"emptyLinePlaceholder":71},[38,326,327],{"class":40,"line":68},[38,328,329],{},"# 加载模型\n",[38,331,332],{"class":40,"line":75},[38,333,334],{},"model_name = \"gpt2\"\n",[38,336,337],{"class":40,"line":81},[38,338,339],{},"tokenizer = AutoTokenizer.from_pretrained(model_name)\n",[38,341,342],{"class":40,"line":242},[38,343,344],{},"model = AutoModelForCausalLM.from_pretrained(model_name)\n",[38,346,347],{"class":40,"line":259},[38,348,72],{"emptyLinePlaceholder":71},[38,350,351],{"class":40,"line":264},[38,352,353],{},"# 生成文本\n",[38,355,356],{"class":40,"line":270},[38,357,358],{},"prompt = \"Hello, how are you?\"\n",[38,360,362],{"class":40,"line":361},10,[38,363,364],{},"inputs = tokenizer(prompt, return_tensors=\"pt\")\n",[38,366,368],{"class":40,"line":367},11,[38,369,370],{},"outputs = model.generate(**inputs)\n",[38,372,374],{"class":40,"line":373},12,[38,375,376],{},"print(tokenizer.decode(outputs[0]))\n",[18,378,380],{"id":379},"四gpu-加速配置","四、GPU 加速配置",[23,382,384],{"id":383},"安装-cuda","安装 CUDA",[28,386,388],{"className":30,"code":387,"language":32,"meta":33,"style":33},"# 查看系统架构\nuname -m && cat \u002Fetc\u002F*release\n\n# 安装 NVIDIA 驱动\nsudo apt-get install nvidia-driver-535\n\n# 安装 CUDA Toolkit\nwget https:\u002F\u002Fdeveloper.download.nvidia.com\u002Fcompute\u002Fcuda\u002F12.2.0\u002Flocal_installers\u002Fcuda_12.2.0_535.54.03_linux.run\nsudo sh cuda_12.2.0_535.54.03_linux.run\n",[35,389,390,395,418,422,427,438,442,447,455],{"__ignoreMap":33},[38,391,392],{"class":40,"line":41},[38,393,394],{"class":44},"# 查看系统架构\n",[38,396,397,400,402,406,409,412,415],{"class":40,"line":48},[38,398,399],{"class":51},"uname",[38,401,109],{"class":108},[38,403,405],{"class":404},"sVt8B"," && ",[38,407,408],{"class":51},"cat",[38,410,411],{"class":55}," \u002Fetc\u002F",[38,413,414],{"class":108},"*",[38,416,417],{"class":55},"release\n",[38,419,420],{"class":40,"line":68},[38,421,72],{"emptyLinePlaceholder":71},[38,423,424],{"class":40,"line":75},[38,425,426],{"class":44},"# 安装 NVIDIA 驱动\n",[38,428,429,431,433,435],{"class":40,"line":81},[38,430,52],{"class":51},[38,432,56],{"class":55},[38,434,59],{"class":55},[38,436,437],{"class":55}," nvidia-driver-535\n",[38,439,440],{"class":40,"line":242},[38,441,72],{"emptyLinePlaceholder":71},[38,443,444],{"class":40,"line":259},[38,445,446],{"class":44},"# 安装 CUDA Toolkit\n",[38,448,449,452],{"class":40,"line":264},[38,450,451],{"class":51},"wget",[38,453,454],{"class":55}," https:\u002F\u002Fdeveloper.download.nvidia.com\u002Fcompute\u002Fcuda\u002F12.2.0\u002Flocal_installers\u002Fcuda_12.2.0_535.54.03_linux.run\n",[38,456,457,459,462],{"class":40,"line":270},[38,458,52],{"class":51},[38,460,461],{"class":55}," sh",[38,463,464],{"class":55}," cuda_12.2.0_535.54.03_linux.run\n",[23,466,468],{"id":467},"验证-cuda","验证 CUDA",[28,470,472],{"className":30,"code":471,"language":32,"meta":33,"style":33},"nvidia-smi\nnvcc --version\n",[35,473,474,479],{"__ignoreMap":33},[38,475,476],{"class":40,"line":41},[38,477,478],{"class":51},"nvidia-smi\n",[38,480,481,484],{"class":40,"line":48},[38,482,483],{"class":51},"nvcc",[38,485,486],{"class":108}," --version\n",[23,488,490],{"id":489},"使用-gpu-运行模型","使用 GPU 运行模型",[28,492,494],{"className":311,"code":493,"language":313,"meta":33,"style":33},"import torch\n\n# 检查 GPU 是否可用\ndevice = \"cuda\" if torch.cuda.is_available() else \"cpu\"\nprint(f\"Using device: {device}\")\n\n# 将模型移到 GPU\nmodel = model.to(device)\n",[35,495,496,501,505,510,515,520,524,529],{"__ignoreMap":33},[38,497,498],{"class":40,"line":41},[38,499,500],{},"import torch\n",[38,502,503],{"class":40,"line":48},[38,504,72],{"emptyLinePlaceholder":71},[38,506,507],{"class":40,"line":68},[38,508,509],{},"# 检查 GPU 是否可用\n",[38,511,512],{"class":40,"line":75},[38,513,514],{},"device = \"cuda\" if torch.cuda.is_available() else \"cpu\"\n",[38,516,517],{"class":40,"line":81},[38,518,519],{},"print(f\"Using device: {device}\")\n",[38,521,522],{"class":40,"line":242},[38,523,72],{"emptyLinePlaceholder":71},[38,525,526],{"class":40,"line":259},[38,527,528],{},"# 将模型移到 GPU\n",[38,530,531],{"class":40,"line":264},[38,532,533],{},"model = model.to(device)\n",[18,535,537],{"id":536},"五部署为-api-服务","五、部署为 API 服务",[23,539,541],{"id":540},"使用-fastapi","使用 FastAPI",[28,543,545],{"className":30,"code":544,"language":32,"meta":33,"style":33},"pip install fastapi uvicorn\n",[35,546,547],{"__ignoreMap":33},[38,548,549,551,553,556],{"class":40,"line":41},[38,550,294],{"class":51},[38,552,59],{"class":55},[38,554,555],{"class":55}," fastapi",[38,557,558],{"class":55}," uvicorn\n",[28,560,562],{"className":311,"code":561,"language":313,"meta":33,"style":33},"from fastapi import FastAPI\nfrom transformers import pipeline\n\napp = FastAPI()\ngenerator = pipeline(\"text-generation\", model=\"gpt2\")\n\n@app.post(\"\u002Fgenerate\")\ndef generate_text(prompt: str):\n    result = generator(prompt, max_length=100)\n    return {\"text\": result[0][\"generated_text\"]}\n",[35,563,564,569,574,578,583,588,592,597,602,607],{"__ignoreMap":33},[38,565,566],{"class":40,"line":41},[38,567,568],{},"from fastapi import FastAPI\n",[38,570,571],{"class":40,"line":48},[38,572,573],{},"from transformers import pipeline\n",[38,575,576],{"class":40,"line":68},[38,577,72],{"emptyLinePlaceholder":71},[38,579,580],{"class":40,"line":75},[38,581,582],{},"app = FastAPI()\n",[38,584,585],{"class":40,"line":81},[38,586,587],{},"generator = pipeline(\"text-generation\", model=\"gpt2\")\n",[38,589,590],{"class":40,"line":242},[38,591,72],{"emptyLinePlaceholder":71},[38,593,594],{"class":40,"line":259},[38,595,596],{},"@app.post(\"\u002Fgenerate\")\n",[38,598,599],{"class":40,"line":264},[38,600,601],{},"def generate_text(prompt: str):\n",[38,603,604],{"class":40,"line":270},[38,605,606],{},"    result = generator(prompt, max_length=100)\n",[38,608,609],{"class":40,"line":361},[38,610,611],{},"    return {\"text\": result[0][\"generated_text\"]}\n",[23,613,614],{"id":614},"启动服务",[28,616,618],{"className":30,"code":617,"language":32,"meta":33,"style":33},"uvicorn main:app --host 0.0.0.0 --port 8000\n",[35,619,620],{"__ignoreMap":33},[38,621,622,625,628,631,634,637],{"class":40,"line":41},[38,623,624],{"class":51},"uvicorn",[38,626,627],{"class":55}," main:app",[38,629,630],{"class":108}," --host",[38,632,633],{"class":108}," 0.0.0.0",[38,635,636],{"class":108}," --port",[38,638,639],{"class":108}," 8000\n",[18,641,643],{"id":642},"六常见问题","六、常见问题",[23,645,646],{"id":646},"内存不足",[28,648,650],{"className":30,"code":649,"language":32,"meta":33,"style":33},"# 增加交换空间\nsudo fallocate -l 8G \u002Fswapfile\nsudo chmod 600 \u002Fswapfile\nsudo mkswap \u002Fswapfile\nsudo swapon \u002Fswapfile\n",[35,651,652,657,673,685,694],{"__ignoreMap":33},[38,653,654],{"class":40,"line":41},[38,655,656],{"class":44},"# 增加交换空间\n",[38,658,659,661,664,667,670],{"class":40,"line":48},[38,660,52],{"class":51},[38,662,663],{"class":55}," fallocate",[38,665,666],{"class":108}," -l",[38,668,669],{"class":55}," 8G",[38,671,672],{"class":55}," \u002Fswapfile\n",[38,674,675,677,680,683],{"class":40,"line":68},[38,676,52],{"class":51},[38,678,679],{"class":55}," chmod",[38,681,682],{"class":108}," 600",[38,684,672],{"class":55},[38,686,687,689,692],{"class":40,"line":75},[38,688,52],{"class":51},[38,690,691],{"class":55}," mkswap",[38,693,672],{"class":55},[38,695,696,698,701],{"class":40,"line":81},[38,697,52],{"class":51},[38,699,700],{"class":55}," swapon",[38,702,672],{"class":55},[23,704,705],{"id":705},"模型下载慢",[28,707,709],{"className":30,"code":708,"language":32,"meta":33,"style":33},"# 设置 Hugging Face 镜像\nexport HF_ENDPOINT=https:\u002F\u002Fhf-mirror.com\n",[35,710,711,716],{"__ignoreMap":33},[38,712,713],{"class":40,"line":41},[38,714,715],{"class":44},"# 设置 Hugging Face 镜像\n",[38,717,718,721,724,727],{"class":40,"line":48},[38,719,720],{"class":153},"export",[38,722,723],{"class":404}," HF_ENDPOINT",[38,725,726],{"class":153},"=",[38,728,729],{"class":404},"https:\u002F\u002Fhf-mirror.com\n",[18,731,733],{"id":732},"七总结","七、总结",[14,735,736],{},"在 Linux 环境下部署 AI 模型已经变得越来越简单。无论是使用 Ollama 这样的工具，还是直接使用 Hugging Face，都可以快速构建自己的 AI 应用。",[738,739,740],"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 .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}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}",{"title":33,"searchDepth":48,"depth":48,"links":742},[743,747,752,756,761,765,769],{"id":20,"depth":48,"text":21,"children":744},[745,746],{"id":25,"depth":68,"text":26},{"id":95,"depth":68,"text":95},{"id":126,"depth":48,"text":127,"children":748},[749,750,751],{"id":133,"depth":68,"text":134},{"id":160,"depth":68,"text":160},{"id":202,"depth":68,"text":202},{"id":280,"depth":48,"text":281,"children":753},[754,755],{"id":284,"depth":68,"text":284},{"id":308,"depth":68,"text":308},{"id":379,"depth":48,"text":380,"children":757},[758,759,760],{"id":383,"depth":68,"text":384},{"id":467,"depth":68,"text":468},{"id":489,"depth":68,"text":490},{"id":536,"depth":48,"text":537,"children":762},[763,764],{"id":540,"depth":68,"text":541},{"id":614,"depth":68,"text":614},{"id":642,"depth":48,"text":643,"children":766},[767,768],{"id":646,"depth":68,"text":646},{"id":705,"depth":68,"text":705},{"id":732,"depth":48,"text":733},"在 Linux 环境下部署大语言模型的完整指南","md",{"date":773,"category":774},"2024-01-03","AI应用","\u002Ftech\u002Fai-deploy-linux",{"title":5,"description":770},"tech\u002Fai-deploy-linux","TtEHtkVIj45gkGQUIwlwRSZ-FNpRlcV81BQnHJfefsg",1783471403153]