当前位置: 首页 > news >正文

python算法打包为docker镜像(边缘端api服务)

Python因其简单上手,在众编程语言中脱颖而出,但你有没有想过,你的python代码如何打包成一个api服务,能够快速地部署到其他机器,同时便捷地使用呢?


小姜教你如何一步一步将你的Python 算法打包为 Docker 镜像、部署、使用,最后成为一个基于docker的边缘端api服务

文章目录

    • 什么是docker?
    • 为什么要打包为Docker?
    • 打包前置准备
    • 使用Fastapi打包算法
        • 安装 Fastapi
        • 算法嵌入 Fastapi 框架
    • 将api服务打包为Docker Image
        • 编写依赖文件
        • 编写 Dockerfile
        • 执行打包命令
    • 本地部署测试
    • 边缘端部署
        • 镜像分发
        • 镜像加载
        • 镜像运行

什么是docker?

Docker 是一款开源的容器化技术,核心是通过 “容器” 将应用程序及其依赖(库、环境变量、配置文件等)打包成一个独立的可移植单元。容器基于宿主机操作系统内核运行,无需像虚拟机那样模拟完整操作系统,因此启动速度快、资源占用低,且具备 “一次构建、到处运行” 的特性,能让应用在任何支持 Docker 的设备上,都以相同的环境稳定运行。

为什么要打包为Docker?

  1. 解决环境依赖冲突:Python 算法常依赖特定版本的库(如 numpy、torch),Docker 可固化完整依赖环境,彻底避免此类问题。
  2. 适配边缘端资源约束:边缘设备(如网关、工业控制器)普遍存在 CPU / 内存有限的问题,Docker 容器比虚拟机更轻量化,镜像体积可灵活优化,不会过度占用边缘资源。
  3. 简化跨设备部署:边缘场景中可能涉及多种架构(x86、arm)、多种系统(Linux、mac ),Docker 镜像可跨架构、跨系统移植,无需针对不同设备重复适配。
  4. 保障服务隔离与稳定性:将算法 API 服务封装在容器中,可与边缘设备上的其他应用隔离,避免资源抢占或配置冲突,同时容器支持快速启停、自动重启,提升服务可用性。

打包前置准备

  1. python环境
  2. Docker Desktop
    (通过docker官网下载)

使用Fastapi打包算法

Fastapi是一个用于构建 API 的现代、快速的 web 框架,我们首先将我们的算法构建为接受输入,返回输出的api

安装 Fastapi
pip install fastapi

另外我们还需要一个 ASGI 服务器(uvicorn)

pip install "uvicorn[standard]"
算法嵌入 Fastapi 框架
from fastapi import FastAPI
import uvicornapp = FastAPI()@app.post("/algorithm1")  
async def calculate(data: dict):# 这里是要封装的算法#...#result = ...# 返回结果return {"code": 200, "result": result}if __name__ == "__main__":#使用ASGI 服务器运行uvicorn.run(app, host="0.0.0.0", port=8000)

代码中@app.post("/algorithm1") 表示这个api的url路径,在下方的函数中,补充你的算法,将算法的结果return,如果你的算法较为复杂,由多个单独文件组成,你可以采用引用的方式。如果要打包的服务有多个算法功能,那么可以使用多个@app.post() ,为不同的算法功能分配不同的请求路径。示例:

from fastapi import FastAPI
import uvicorn
# 导入自定义算法模块
from my_algorithm import a_func,b_funcapp = FastAPI()#添加一个根路径,作为算法是否运行的检查路劲
@app.get("/")
async def root():return {"message": "算法API服务正在运行", "status": "healthy"}@app.post("/algorithm/a")
async def predict(data: dict):# 调用算法result = a_func(input_data)# 返回结果return {"code": 200, "result": result}@app.post("/algorithm/b")
async def predict(data: dict):# 调用算法result = b_func(input_data)# 返回结果return {"code": 200, "result": result}if __name__ == "__main__":uvicorn.run(app, host="0.0.0.0", port=8000)

至此,你可以创建一个app目录,作为你的项目目录,然后将这个python文件命名为main.py并放到这个目录中,在你本地的python环境运行,你的api服务就已经打开了,你可以新建一个test.py脚本,使用request库进行请求测试:

import requests
import jsonhost = "8000"
# 测试服务
response = requests.get(f"http://localhost:{host}/health"
)
if response.status_code == 200:print("API服务状态正常")print(response.json())# 算法请求
request_data = {"p1":2,"p2":'h'
}response = requests.post(f"http://localhost:{host}/algorithm/a",headers={"Content-Type": "application/json"},data=json.dumps(request_data)
)#处理响应
if response.status_code == 200:result = response.json()if result["success"]:print(f"算法执行成功,结果:{result}")else:print(f"算法执行失败")
else:print(f"请求失败: {response}")

将api服务打包为Docker Image

编写依赖文件

依赖文件requirements.txt的目的是告诉docker打包时,需要安装哪些python的包,将你的python算法需要的包列入文件(==1.0.0表示固定版本号为1.0.0):

numpy==1.24.1
uvicorn
pydantic
python-multipart
matplotlib==3.7.2
scikit-learn==1.3.2
pillow
fastapi
编写 Dockerfile

Dockerfile 是docker镜像打包时的关键脚本,里面包含了打包时需要执行的内容和一些相关配置。如果你前面按照小姜的步骤进行,你可以参考下面的模板:

# 基础镜像:选用轻量化Python镜像(可以选择你需要的python版本)
FROM python:3.9-slim# 设置工作目录
WORKDIR /app# 安装系统依赖(这是因为部分包需要使用系统依赖)
# 如果你的算法设计的包非常基础,可以跳过这一部分
RUN apt-get update && apt-get install -y \gcc \&& rm -rf /var/lib/apt/lists/*# 复制依赖文件与代码
COPY requirements.txt .
COPY . .# 安装依赖(国内源加速,边缘端可提前下载依赖包离线安装)
RUN pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple# 暴露API端口(与代码中一致)
EXPOSE 8000# 启动命令
CMD ["python", "main.py"]
执行打包命令

在 Dockerfile 所在目录的命令行窗口执行

docker build -t edge-algorithm-api:v1 .

edge-algorithm-api为你要打包的镜像名,v1为镜像版本标签,这两个都可以由你自定义,版本号通常可以填写latest,表示最新版

等待打包完成,打开 docker desktop ,找到 images,你可以看到你打包的镜像出现在这里

本地部署测试

在本地运行你的 docker 镜像有两种方式:

  1. 命令行

本地运行

docker run -d -p 8000:8000 --name edge-api edge-algorithm-api:v1

8000:8000表示你定义的端口;edge-api表示你定义的服务名;edge-algorithm-api:v1表示你要运行的镜像

执行后,你的api调用地址为:http://localhost:8000/algorithm/a

  1. Docker Desktop

点击Iamge页面中的运行按钮

点开运行选项,设置你的服务名称,端口(填0随机生成)

完成后点击到container页面,此时镜像运行在一个container容器内,形成服务:

port下方的路径就是你的服务链接,点击,会自动在浏览器打开这个地址,模拟根路径的get请求:

能够看到你设定的返回值,说明算法部署成功了!

边缘端部署

镜像分发

分发镜像的前提是能够将你的docker镜像打包为一个实体的文件。这样才能传输给其他设备,我们使用以下命令将Image打包为一个.tar压缩包:

docker save -o edge-api.tar edge-algorithm-api:v1

得到edge-api.tar文件后,你可以通过多种方式发送给目标设备。

镜像加载

使用以下命令加载edge-api.tar文件:

docker load -i edge-api.tar
镜像运行

在边缘端设备,采用和前面本机部署相同的方式,运行image,即可将服务部署到边缘端机器上!


如有疑问,欢迎留言~

http://www.dtcms.com/a/566869.html

相关文章:

  • 网站建设和网络推广外包服务商中山精品网站建设公司
  • 五里店网站建设中国手机网站大全
  • php儿童摄影网站源码上海网页设计经验培训
  • 个人网站 组建苏州相城做网站哪家好
  • 做网站排名费用中医院网站模板
  • 知名的食品行业网站开发合肥房地产最新消息
  • 网站建设常用软件jas网站被黑了
  • 公司网站建设合同需要交印花税土巴兔全包装修怎么样
  • 05-异常处理-练习
  • 个人购物网站备案北极星招聘网
  • 微软与OpenAI联合研发“Orion“超大规模AI模型:100万亿参数开启“科学家AI“新纪元
  • 广州建筑集团网站装修网站怎么做的好
  • 网站建设公司58手机投资网站
  • 网站建设留言板的实现制作网站 公司简介
  • 门户网站建设招标文件欧亚专线快递查询
  • 毕设做系统好还是做网站好北京外包seo公司
  • wordpress网站被黑软件开发和网站开发区别
  • UART通讯协议,停止位、校验位
  • 42_AI智能体核心业务之工具选择Agent:智能对话系统的执行引擎
  • C++模板(2)
  • 做网站如何对接支付外贸营销网站建设公司排名
  • 设计师应该知道的网站logo在线设计生成
  • 地理空间数据库小测笔记----2
  • 呼伦贝尔旅游网站建设一个网络空间如何做两个网站
  • 建站平台哪个比较权威品牌建设存在的问题及对策
  • 常用网站建设技术是什么意思手机网站拒绝访问怎么解决
  • 做网站的策划需要做什么seo网站设计工具
  • 网站死链如何修改wordpress数组遍历
  • Java练习——正则表达式2
  • 查看企业信息的网站那里有帮做网站的