步骤 1:使用 Cog 生成 Dockerfile
首先,确保您已安装 Cog。如果没有,请按照 Cog GitHub 页面 上的说明进行操作。
导航到您的项目目录并运行:
cog debug > Dockerfile
此命令将在项目的根目录中生成一个 Dockerfile
。
第 2 步:调整 Dockerfile 以适应 fal
生成 Dockerfile
后,您可能需要进行一些修改以确保与 fal 兼容。
首先,我们需要提取 Python 依赖项并将其安装在 Docker 映像中。我们可以通过将依赖项从 Cog 文件复制到 Docker 映像来执行此操作。以下是执行此操作的示例:
以下命令假定您已安装yq
。如果没有,您可以使用pip install yq
进行安装。或者按照 yq GitHub 页面 上的说明进行操作。
如果您尚未安装jq
,可能还需要安装它。例如,如果您使用的是基于 Debian 的系统,您可以使用sudo apt-get install jq
进行安装。或者,查看 jq GitHub 页面。
yq -e '.build.python_packages | map(select(. != null and . != "")) | map("'"'"'" + . + "'"'"'") | join(" ")' cog.yaml
这将为您提供可以在 Docker 映像中安装的 Python 包列表。在 Dockerfile 中使用 RUN pip install ...
。
例如
'torch' 'torchvision' 'torchaudio' 'torchsde' 'einops' 'transformers>=4.25.1' ...
或者,您可以将 python_packages
的内容写入 requirements.txt
文件,并将其安装在 Dockerfile 中。请参阅 容器化应用程序页面 中的示例。
以下是您的 Dockerfile
可能是什么样子的基本示例:
示例 Cog 项目是 https://github.com/fofr/cog-comfyui。
#syntax=docker/dockerfile:1.4
FROM python:3.10.6 as deps
- COPY .cog/tmp/build4143857248/cog-0.0.1.dev-py3-none-any.whl /tmp/cog-0.0.1.dev-py3-none-any.whl
- RUN --mount=type=cache,target=/root/.cache/pip pip install -t /dep /tmp/cog-0.0.1.dev-py3-none-any.whl
- COPY .cog/tmp/build4143857248/requirements.txt /tmp/requirements.txt
- RUN --mount=type=cache,target=/root/.cache/pip pip install -t /dep -r /tmp/requirements.txt
+ RUN --mount=type=cache,target=/root/.cache/pip pip install -t /dep 'torch' 'torchvision' 'torchaudio' 'torchsde' 'einops' 'transformers>=4.25.1' 'safetensors>=0.3.0' 'aiohttp' 'accelerate' 'pyyaml' 'Pillow' 'scipy' 'tqdm' 'psutil' 'spandrel' 'kornia>=0.7.1' 'websocket-client==1.6.3' 'diffusers>=0.25.0' 'albumentations==1.4.3' 'cmake' 'imageio' 'joblib' 'matplotlib' 'pilgram' 'scikit-learn' 'rembg' 'numba' 'pandas' 'numexpr' 'insightface' 'onnx' 'segment-anything' 'piexif' 'ultralytics!=8.0.177' 'timm' 'importlib_metadata' 'opencv-python-headless>=4.0.1.24' 'filelock' 'numpy' 'einops' 'pyyaml' 'scikit-image' 'python-dateutil' 'mediapipe' 'svglib' 'fvcore' 'yapf' 'omegaconf' 'ftfy' 'addict' 'yacs' 'trimesh[easy]' 'librosa' 'color-matcher' 'facexlib'
FROM nvidia/cuda:12.1.1-cudnn8-devel-ubuntu22.04
ENV DEBIAN_FRONTEND=noninteractive
ENV PYTHONUNBUFFERED=1
ENV LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib/x86_64-linux-gnu:/usr/local/nvidia/lib64:/usr/local/nvidia/bin
ENV NVIDIA_DRIVER_CAPABILITIES=all
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked set -eux; \
apt-get update -qq && \
apt-get install -qqy --no-install-recommends curl; \
rm -rf /var/lib/apt/lists/*; \
TINI_VERSION=v0.19.0; \
TINI_ARCH="$(dpkg --print-architecture)"; \
curl -sSL -o /sbin/tini "https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini-${TINI_ARCH}"; \
chmod +x /sbin/tini
ENTRYPOINT ["/sbin/tini", "--"]
ENV PATH="/root/.pyenv/shims:/root/.pyenv/bin:$PATH"
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked apt-get update -qq && apt-get install -qqy --no-install-recommends \
make \
build-essential \
libssl-dev \
zlib1g-dev \
libbz2-dev \
libreadline-dev \
libsqlite3-dev \
wget \
curl \
llvm \
libncurses5-dev \
libncursesw5-dev \
xz-utils \
tk-dev \
libffi-dev \
liblzma-dev \
git \
ca-certificates \
&& rm -rf /var/lib/apt/lists/*
RUN curl -s -S -L https://raw.githubusercontent.com/pyenv/pyenv-installer/master/bin/pyenv-installer | bash && \
git clone https://github.com/momo-lab/pyenv-install-latest.git "$(pyenv root)"/plugins/pyenv-install-latest && \
pyenv install-latest "3.10.6" && \
pyenv global $(pyenv install-latest --print "3.10.6") && \
pip install "wheel<1"
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked apt-get update -qq && apt-get install -qqy ffmpeg && rm -rf /var/lib/apt/lists/*
RUN --mount=type=bind,from=deps,source=/dep,target=/dep \
cp -rf /dep/* $(pyenv prefix)/lib/python*/site-packages; \
cp -rf /dep/bin/* $(pyenv prefix)/bin; \
pyenv rehash
RUN curl -o /usr/local/bin/pget -L "https://github.com/replicate/pget/releases/download/v0.8.1/pget_linux_x86_64" && chmod +x /usr/local/bin/pget
RUN pip install onnxruntime-gpu --extra-index-url https://aiinfra.pkgs.visualstudio.com/PublicPackages/_packaging/onnxruntime-cuda-12/pypi/simple/
+ # fal platform will inject the necessary mechanisms to run your application.
- WORKDIR /src
- EXPOSE 5000
- CMD ["python", "-m", "cog.server.http"]
- COPY . /src
就是这样!🎉
确保所有依赖项和路径都符合项目的要求。
步骤 3:在 fal 上部署
fal 支持轻松部署基于 Docker 的应用程序。请按照以下步骤在 fal 上部署 Docker 容器:
- 在 fal 上创建一个帐户:如果您还没有,请在 fal 注册。
- 创建一个新项目:在您最喜欢的目录中,创建一个新项目并将
Dockerfile
移入其中。创建一个包含以下内容的新 Python 文件:
import fal
from fal.container import ContainerImage
from pathlib import Path
PWD = Path(__file__).resolve().parent
@fal.function(
kind="container",
image=ContainerImage.from_dockerfile(f"{PWD}/Dockerfile"),
)
def test_container():
# Rest is your imagination.
严肃地说,您需要进行一些转换才能运行您的应用程序。但不要害怕,这只是几行代码。cog 服务器和 fal 应用程序的结构相似,因此您可以轻松地调整您的应用程序以在 fal 上运行。
您可以在 此处 查看有关如何使用 fal SDK 的详细文档。
有关如何部署容器化应用程序的更多信息,请参见此处。
步骤 4:测试您的部署
部署后,通过 fal 提供的 URL 访问您的应用程序,确保一切正常。监控日志和性能以确保迁移成功。
故障排除
如果您在迁移过程中遇到任何问题,请检查以下内容:
- 依赖项:确保所有必需的依赖项都列在您的
requirements.txt
或等效文件中。 - 环境变量和构建参数:仔细检查 Dockerfile 中所有必要的环境变量和构建参数是否设置正确。
- 日志:使用 fal 中的日志记录功能来诊断任何构建或运行时问题。
如需进一步帮助,请参阅 fal 文档 或联系 fal 支持团队。
结论
通过适当的准备和测试,从 Replicate 迁移到 fal 会很顺利。本指南提供了一条简单的路径,但每个项目可能都有独特的要求。根据需要调整这些步骤以适合您的特定用例。
如需更多帮助,请加入我们在 Discord 上的社区或联系我们的支持团队。
最后更新于 2024 年 6 月 26 日