Dockerfile builds AIGC application
Dockerfile构建AIGC应用
概述
FaceChain是一个可以用来生成个人写真的深度学习模型工具。可实现兼具可控性与ID保持能力的无限风格写真与固定模板写真功能,同时对ControlNet和LoRA具有优秀的兼容能力。FaceChain支持在gradio的界面中使用模型训练和推理能力、支持资深开发者使用python脚本进行训练推理
本篇使用是facechain:v3.0.0版本,为什么会选择这个镜像呢??因为笔者在构建时包括构建完成后都会发现该项目出现各种无厘头的原因,真烧心!!想刀人!! 深呼吸…吸气…呼气,好!!
开始
Dockerfile:通过定义一系列命令和参数, 指导 Docker 构建一个自定义的镜像。
示例:
FROM swr.cn-north-4.myhuaweicloud.com/shilq/python3.8.18-pytorch-2.0.0-cuda:11.8
#项目构建的基础镜像包括:系统、miniconda3、python、pytorch、cuda版本、ENTRYPOINT ["/root/entrypoint.sh"]
ENV PATH=/root/miniconda3/bin:$PATH
#在容器内部设置环境变量。
RUN conda create -n facechain python==3.10
#构建虚拟环境
SHELL ["conda", "run", "-n", "facechain", "/bin/bash", "-c"]
#激活特定环境
RUN GIT_LFS_SKIP_SMUDGE=1 git clone https://github.com/modelscope/facechain.git -b v3.0.0 --depth 1
RUN pip install tb-nightly -i https://pypi.python.org/simple
RUN cd facechain/;pip install -r requirements.txt
RUN pip install tqdm~=4.65.0;pip3 install -U openmim
RUN pip install torch==2.0.1 torchvision==0.15.2;mim install mmcv-full==1.7.2
RUN pip install SentencePiece
RUN pip install opencv-python-headless
RUN apt install -y libgl1-mesa-glx;pip install gradio==3.50.2
RUN rm -rf /root/miniconda3/envs/facechain/lib/python3.10/site-packages/diffusers/utils/deprecation_utils.py
ADD ./deprecation_utils.py /root/miniconda3/envs/facechain/lib/python3.10/site-packages/diffusers/utils/
#将文件复制到镜像中
EXPOSE 7860
#声明容器运行时监听的特定网络端口。
RUN echo "source activate facechain" >> ~/.bashrc
#source activate facechain这行添加到你的.bashrc文件中,这样每次启动shell时都会自动激活facechain环境。
WORKDIR /root/facechain/
#设置后续指令的工作目录。
RUN apt-get update;apt install ffmpeg -y
RUN pip install kornia -U;pip install yacs
RUN pip install librosa;pip install face_alignment
RUN pip install numpy==1.23.5;pip install imageio==2.19.3 imageio-ffmpeg==0.4.7
在特定情况下,我们为了增强容器启动的灵活性外挂一个entrypoint.sh。它允许你在容器启动时执行自定义脚本,以进行必要的配置或初始化工作。这种方式可以避免频繁地重建Docker镜像,因为你只需修改脚本内容即可。这样大大提高了部署效率和维护灵活性。
示例:
#!/bin/bash
source activate facechain
export WELCOME_TITLE="Welcome to My SerVice"
grep "$WELCOME_TITLE" /root/.bashrc &> /dev/null || echo 'echo -e "\033[1;32m'${WELCOME_TITLE}'\033[0m"' >> /root/.bashrc
cat << EOF > /root/miniconda3/share/jupyter/kernels/python3/kernel.json
{
"argv": [
"python",
"-m",
"ipykernel_launcher",
"-f",
"{connection_file}"
],
"display_name": "Python 3 (ipykernel)",
"language": "python",
"metadata": {
"debugger": true
},
"env": {
"PATH": "/root/miniconda3/bin:/root/miniconda3/condabin:/usr/local/nvidia/bin:/usr/local/cuda/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"SHELL": "/bin/bash"
}
}
EOF
/usr/sbin/sshd -D $SSHD_OPTS &
/root/miniconda3/bin/jupyter lab &
/usr/bin/code-server --auth none --bind-addr 0.0.0.0:8080 --locale="zh-cn"&
/root/miniconda3/envs/facechain/bin/python3 /root/facechain/app.py
在dockerfile文件的路径下
#构建镜像
docker build -t swr.cn-north-4.myhuaweicloud.com/shilq/facechain:v3.0.0 .
#运行(单卡推理)
docker run -d -P -v /root/slq/Dockerfile/entrypoint.sh:/root/entrypoint.sh --gpus "1" swr.cn-north-4.myhuaweicloud.com/shilq/facechain:v3.0.0
灵魂发问
当然,如果后期不需要的情况下,我们也可以启动容器时通过 —entrypoint参数覆盖掉。例如:
#docker run -d -P --entrypoint bash --gpus "1" swr.cn-north-4.myhuaweicloud.com/shilq/facechain:v3.0.0 -c "/root/miniconda3/envs/facechain/bin/python3 /root/facechain/app.py"
# docker run -d -P -e CUDA_VISIBLE_DEVICES=0 --entrypoint bash swr.cn-north-4.myhuaweicloud.com/shilq/facechain:v3.0.0 -c "/root/miniconda3/envs/facechain/bin/python3 /root/facechain/app.py"
这里也是让笔者深感疑惑的地方,针对该项目,本人使用上述命令启动时会出现训练失败的情况。尝试sleep容器后,手动进入,按/root/miniconda3/envs/facechain/bin/python3 /root/facechain/app.py启动训练无异常。这不是活见鬼嘛!!笔者尝试无数次后深感绝望,望有侠义之士答疑解惑,在此叩谢。