Ray项目中使用自定义Docker镜像部署Serve应用指南
前言
在分布式计算框架Ray中部署Serve应用时,使用Docker镜像是一种高效且可靠的方式。本文将详细介绍如何基于Ray官方镜像构建自定义Docker镜像,并将Serve应用打包其中,最终在Kubernetes环境中通过KubeRay进行部署。
准备工作
在开始前,请确保已安装:
- Docker Desktop
- 拥有Dockerhub账号用于托管自定义镜像
示例应用介绍
我们以一个生成假邮箱地址的Serve应用为例,该应用依赖Faker包:
from ray import serve
from faker import Faker
@serve.deployment
class EmailDeployment:
def __init__(self):
self.fake = Faker()
async def __call__(self):
return self.fake.email()
app = EmailDeployment.bind()
本地测试时可安装Faker包并运行:
pip install Faker==18.13.0
serve run fake:app
构建自定义Docker镜像
1. 扩展官方Ray镜像
Ray官方提供了基础Docker镜像(rayproject/ray),我们可以基于此添加额外依赖:
FROM rayproject/ray:2.9.0
RUN pip install Faker==18.13.0
2. 添加Serve应用代码
将应用代码直接打包进镜像比使用runtime_env更稳定:
FROM rayproject/ray:2.9.0
RUN pip install Faker==18.13.0
WORKDIR /serve_app
COPY fake.py /serve_app/fake.py
关键点:
WORKDIR
设置容器工作目录COPY
将本地代码复制到镜像中
3. 构建并推送镜像
docker build . -t your_dockerhub_username/custom_image_name:latest
docker push your_dockerhub_username/custom_image_name:latest
在KubeRay中使用自定义镜像
在RayService配置中需做以下调整:
- 确保
rayVersion
与镜像中的Ray版本一致 - 设置head和worker节点的
image
字段为自定义镜像 - 移除
serveConfigV2
中已在镜像包含的runtime_env
依赖
示例配置:
apiVersion: ray.io/v1alpha1
kind: RayService
metadata:
name: fake-email-app
spec:
serveConfigV2: |
applications:
- name: app
route_prefix: /
import_path: fake:app
rayClusterConfig:
rayVersion: '2.9.0'
headGroupSpec:
template:
spec:
containers:
- name: ray-head
image: shrekrisanyscale/serve-fake-email-example
workerGroupSpecs:
- replicas: 1
template:
spec:
containers:
- name: ray-worker
image: shrekrisanyscale/serve-fake-email-example
最佳实践建议
- 版本控制:为镜像使用语义化版本号而非仅依赖latest标签
- 镜像优化:
- 使用多阶段构建减小镜像体积
- 合理安排Dockerfile指令顺序以利用缓存
- 安全考虑:
- 使用非root用户运行容器
- 定期更新基础镜像和安全补丁
- 生产环境建议:
- 使用私有镜像仓库存储业务镜像
- 实施镜像扫描和安全策略
总结
通过将Serve应用及其依赖打包到自定义Docker镜像中,可以获得更稳定可靠的部署体验。这种方法避免了运行时的依赖下载,提高了集群启动速度,特别适合生产环境使用。KubeRay与自定义Docker镜像的结合为Ray Serve应用提供了强大的部署能力。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考