OFA模型Ubuntu 20.04部署教程:从系统配置到服务上线

📅 发布时间:2026/7/8 20:23:44 👁️ 浏览次数:
OFA模型Ubuntu 20.04部署教程:从系统配置到服务上线
OFA模型Ubuntu 20.04部署教程从系统配置到服务上线最近有不少朋友在问怎么在服务器上把那个挺火的OFA模型给跑起来。OFA这模型挺有意思它把看图、理解、生成这些任务都统一到了一个框架里用起来很方便。但真要在自己的Ubuntu服务器上从头搭一套还是得踩几个坑。今天我就把自己在Ubuntu 20.04上部署OFA模型服务的完整过程整理出来从系统环境准备到最终服务上线每一步都写清楚。你跟着做大概半小时到一小时就能搞定最后会得到一个可以通过HTTP访问的模型推理服务。1. 开始之前你需要准备什么在动手之前我们先看看需要哪些东西。这样你心里有数部署过程会更顺畅。首先你得有一台安装了Ubuntu 20.04的服务器。云服务器或者自己物理机都行。内存建议8GB以上因为模型本身不小。最关键的是显卡OFA模型推理最好有张NVIDIA的显卡显存至少4GB8GB或以上会更从容。如果你用CPU也能跑但速度会慢很多体验不太好。其次你需要有服务器的操作权限能执行sudo命令。网络也要通畅因为要下载不少东西包括系统更新包、CUDA驱动、Python包和模型文件。最后稍微了解一下Linux命令行操作会很有帮助不过不用担心我会把每条命令都解释清楚。2. 第一步打好地基——系统更新与驱动安装部署任何服务稳定的系统环境都是第一步。我们先确保系统是最新的并且显卡驱动装对了。打开你的终端连接到服务器。第一件事更新系统的软件包列表并升级已有的软件sudo apt update sudo apt upgrade -y这个-y参数是自动回答“yes”省得我们一直确认。更新过程可能需要几分钟取决于你的网络和服务器配置。更新完系统我们来安装NVIDIA显卡驱动。这是让GPU能干活的关键。Ubuntu 20.04自带的“附加驱动”工具其实挺方便的sudo ubuntu-drivers autoinstall这条命令会自动检测你的显卡型号并安装推荐的驱动版本。安装完成后一定要重启服务器让驱动生效sudo reboot重启后再次登录服务器用下面这个命令验证驱动是否安装成功nvidia-smi如果安装正确你会看到一个表格显示了你的GPU型号、驱动版本、CUDA版本以及GPU的使用情况。看到这个界面说明驱动这块就没问题了。3. 第二步安装CUDA和cuDNN驱动装好了GPU就能被系统认出来了。但要跑深度学习模型我们还需要CUDA工具包和cuDNN库。你可以把它们理解成GPU的“编程语言”和“加速库”。这里我们选择安装CUDA 11.3版本这个版本比较稳定和Ubuntu 20.04以及后续要安装的PyTorch兼容性很好。依次执行下面的命令wget https://developer.download.nvidia.com/compute/cuda/11.3.0/local_installers/cuda_11.3.0_465.19.01_linux.run sudo sh cuda_11.3.0_465.19.01_linux.run运行安装程序时会出现一个文字界面。这里有个小细节要注意当它问你是否要安装NVIDIA驱动时记得选“No”。因为我们上一步已经装好驱动了再装可能会冲突。其他的选项保持默认按回车继续就行。安装完成后我们需要告诉系统CUDA工具包在哪里。编辑你的用户配置文件比如用的是bash的话就是~/.bashrcecho export PATH/usr/local/cuda-11.3/bin:$PATH ~/.bashrc echo export LD_LIBRARY_PATH/usr/local/cuda-11.3/lib64:$LD_LIBRARY_PATH ~/.bashrc source ~/.bashrc接下来安装cuDNN。你需要先去NVIDIA官网注册并下载对应CUDA 11.3的cuDNN库文件通常是一个.tgz压缩包。假设你下载的文件叫cudnn-11.3-linux-x64-v8.2.1.32.tgz把它上传到服务器然后执行tar -xzvf cudnn-11.3-linux-x64-v8.2.1.32.tgz sudo cp cuda/include/cudnn*.h /usr/local/cuda-11.3/include sudo cp cuda/lib64/libcudnn* /usr/local/cuda-11.3/lib64 sudo chmod ar /usr/local/cuda-11.3/include/cudnn*.h /usr/local/cuda-11.3/lib64/libcudnn*最后验证一下CUDA是否安装成功nvcc --version这条命令会输出CUDA编译器的版本信息如果显示是11.3那就恭喜你最复杂的部分已经过去了。4. 第三步创建独立的Python环境我强烈建议为这个项目创建一个独立的Python虚拟环境。这就像给你的项目一个单独的“房间”里面所有的软件包都是项目专用的不会和系统里其他Python项目互相干扰以后管理起来也干净。Ubuntu 20.04默认可能没有安装创建虚拟环境的工具我们先装上sudo apt install python3-venv python3-pip -y然后在你喜欢的位置比如你的家目录~创建一个虚拟环境我给它起名叫ofa_envcd ~ python3 -m venv ofa_env创建好后激活这个环境source ~/ofa_env/bin/activate激活后你会发现命令行的提示符前面多了个(ofa_env)这表示你现在已经在这个虚拟环境里了。接下来所有pip install的操作都只会影响这个环境。在这个环境里我们先升级一下pip然后安装PyTorch。注意我们要安装支持CUDA 11.3的版本pip install --upgrade pip pip install torch1.12.1cu113 torchvision0.13.1cu113 torchaudio0.12.1 --extra-index-url https://download.pytorch.org/whl/cu113安装完成后可以在Python里简单测试一下GPU是否可用import torch print(torch.cuda.is_available()) # 应该输出 True print(torch.cuda.get_device_name(0)) # 输出你的GPU型号如果输出True和你的显卡型号那就完美了。5. 第四步下载OFA模型并准备Web服务环境齐备现在可以请出主角了。OFA模型可以通过Hugging Face的transformers库来使用。我们先安装必要的包pip install transformers pip install Pillow requestsPillow是用来处理图片的requests后面写Web服务时会用到。OFA模型有几个不同的尺寸比如OFA-tiny,OFA-base,OFA-large。模型越大能力一般越强但需要的显存也越多。为了演示我们先用OFA-base版本它在效果和资源消耗上比较平衡。我们写一个简单的Python脚本download_model.py来下载并保存模型from transformers import OFATokenizer, OFAModel import torch model_name OFA-Sys/ofa-base # 你也可以换成 ofa-large 如果你显存够大 tokenizer OFATokenizer.from_pretrained(model_name) model OFAModel.from_pretrained(model_name, use_cacheFalse) # 保存到本地目录 save_path ./ofa_model tokenizer.save_pretrained(save_path) model.save_pretrained(save_path) print(f模型已保存至: {save_path})运行这个脚本它就会从网上下载模型权重和分词器保存到本地的ofa_model文件夹。第一次运行需要下载大约1.4GB的数据耐心等待一下。模型准备好了我们还需要一个简单的Web服务来暴露它的能力。这里我们用Flask来快速搭建一个API用Gunicorn作为生产环境的服务器。安装它们pip install flask gunicorn6. 第五步编写并启动模型服务现在我们来创建一个Flask应用提供两个最常用的API一个给图片加标题图像描述一个看图回答问题视觉问答。创建一个文件叫app.py内容如下from flask import Flask, request, jsonify from transformers import OFATokenizer, OFAModel from PIL import Image import torch import io import logging app Flask(__name__) # 设置日志 logging.basicConfig(levellogging.INFO) # 加载本地模型 MODEL_PATH ./ofa_model tokenizer OFATokenizer.from_pretrained(MODEL_PATH) model OFAModel.from_pretrained(MODEL_PATH, use_cacheFalse) model.eval() device torch.device(cuda if torch.cuda.is_available() else cpu) model.to(device) logging.info(f模型已加载至设备: {device}) def generate_answer(prompt, imgNone): 核心生成函数 inputs tokenizer([prompt], return_tensorspt).input_ids if img: patch_img torch.tensor(img).unsqueeze(0) else: patch_img None with torch.no_grad(): outputs model.generate(inputs.to(device), patch_imagespatch_img, num_beams5, no_repeat_ngram_size3) answer tokenizer.batch_decode(outputs, skip_special_tokensTrue) return answer[0] app.route(/caption, methods[POST]) def image_caption(): 给图片生成描述 if image not in request.files: return jsonify({error: 未提供图片文件}), 400 file request.files[image] image Image.open(io.BytesIO(file.read())).convert(RGB) # 预处理图片为模型需要的格式 from torchvision import transforms transform transforms.Compose([ transforms.Resize((480, 480)), transforms.ToTensor(), transforms.Normalize(mean[0.5, 0.5, 0.5], std[0.5, 0.5, 0.5]) ]) img_tensor transform(image).unsqueeze(0) prompt 这是什么图片? caption generate_answer(prompt, img_tensor) return jsonify({caption: caption}) app.route(/vqa, methods[POST]) def visual_qa(): 视觉问答根据图片和问题生成答案 if image not in request.files: return jsonify({error: 未提供图片文件}), 400 file request.files[image] question request.form.get(question, ) if not question: return jsonify({error: 未提供问题}), 400 image Image.open(io.BytesIO(file.read())).convert(RGB) from torchvision import transforms transform transforms.Compose([ transforms.Resize((480, 480)), transforms.ToTensor(), transforms.Normalize(mean[0.5, 0.5, 0.5], std[0.5, 0.5, 0.5]) ]) img_tensor transform(image).unsqueeze(0) # 构建OFA格式的提示词 prompt f{question}? answer generate_answer(prompt, img_tensor) return jsonify({answer: answer}) app.route(/health, methods[GET]) def health_check(): 健康检查端点 return jsonify({status: healthy, device: str(device)}) if __name__ __main__: app.run(host0.0.0.0, port5000, debugFalse)这个服务提供了三个接口/caption POST请求上传一张图片返回对图片的文字描述。/vqa POST请求上传一张图片并附带一个文本问题返回模型根据图片给出的答案。/health GET请求用于检查服务是否正常运行。代码写好了我们可以先用Flask自带的服务器测试一下python app.py如果看到输出显示运行在http://0.0.0.0:5000就说明服务启动成功了。不过这个开发服务器性能不强我们接下来用Gunicorn来启动一个更适合生产环境的服务。先停掉刚才的Flask服务按CtrlC然后用Gunicorn启动gunicorn -w 2 -b 0.0.0.0:5000 app:app这里-w 2表示启动2个工作进程-b 0.0.0.0:5000指定绑定的地址和端口app:app告诉Gunicorn我们的Flask应用对象在哪。现在你的OFA模型服务就已经在5000端口上跑起来了。7. 第六步测试你的模型服务服务跑起来了我们得试试它是不是真的能干活。这里用curl命令来测试你也可以用Postman之类的工具。首先测试健康检查curl http://你的服务器IP:5000/health应该会返回类似{status:healthy,device:cuda}的JSON数据。然后测试图片描述功能。准备一张图片比如叫test.jpg然后执行curl -X POST -F image./test.jpg http://你的服务器IP:5000/caption如果一切正常你会收到一个JSON响应里面包含了模型为这张图片生成的描述文字比如{caption: 一只猫坐在沙发上}。再测试一下视觉问答curl -X POST -F image./test.jpg -F question这是什么动物 http://你的服务器IP:5000/vqa这个请求会询问图片中动物的种类模型可能会返回{answer: 猫}。看到这些返回结果就说明你的OFA模型服务已经部署成功可以正常工作了8. 可能会遇到的问题和解决办法部署过程很少一帆风顺这里我列几个自己遇到过或者别人常问的问题你可以对照着看看。问题一运行nvidia-smi提示命令未找到。这通常意味着NVIDIA驱动没装上或者没装对。回头检查第二步确保ubuntu-drivers autoinstall执行成功并且系统重启了。也可以尝试用sudo apt install nvidia-driver-510数字换成你的显卡推荐版本来手动指定安装。问题二运行PyTorch测试时torch.cuda.is_available()返回False。这说明PyTorch没能识别到CUDA。首先确认nvcc --version能正确输出。然后检查你安装PyTorch的命令是否指定了正确的CUDA版本我们用的是cu113。最保险的做法是在虚拟环境里用pip list看看torch的版本后面有没有cu113的后缀。问题三运行模型或启动服务时提示“显存不足Out of Memory”。OFA-base模型在推理时显存占用大概在3-4GB。如果你用的是4GB显存的卡可能会比较紧张。可以尝试两个方法一是在app.py的generate_answer函数里减少num_beams这个参数的值比如从5降到3这能降低一些显存消耗但可能会轻微影响生成质量。二是换用更小的模型比如OFA-tiny。问题四启动Gunicorn时提示“Address already in use”。这意味着5000端口被别的程序占用了。你可以用sudo lsof -i :5000查一下是哪个进程然后停掉它。或者在启动Gunicorn时换一个端口比如-b 0.0.0.0:8080。问题五从外部网络无法访问服务。如果服务器是云服务器请确保安全组或防火墙规则允许了5000端口的入站流量。如果是本地服务器检查一下本地防火墙设置。9. 总结走完这一遍你应该已经在Ubuntu 20.04上成功部署了一个OFA模型推理服务。整个过程从系统环境配置开始安装了GPU驱动和CUDA创建了独立的Python环境下载了模型最后用Flask和Gunicorn搭建了一个简单的Web API。这个服务虽然基础但已经具备了核心的图片理解和问答能力。你可以基于这个app.py继续扩展比如增加批量处理接口、集成任务队列、或者加上身份验证。部署方面也可以考虑用Nginx做反向代理用Supervisor来管理进程让服务更稳定。最关键的是我们是在一个独立的虚拟环境里完成所有操作的这保证了系统的整洁。以后如果你需要部署其他模型或者升级Python、PyTorch的版本都不会影响到这个OFA服务。遇到问题别着急多看看终端的错误信息大部分问题都能找到线索。希望这篇教程能帮你省点时间顺利把模型跑起来。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。