GCP Vertex AI自定义训练因matplotlib字体管理器冻结求助
解决GCP Vertex AI自定义训练中matplotlib fontManager冻结问题
以下是几个针对该问题的有效解决思路:
禁用matplotlib字体管理器初始化
在Vertex AI训练任务的环境变量中添加MATPLOTLIB_NO_FONTMANAGER=1,该环境变量会强制matplotlib跳过字体管理器的生成流程,从根源避免冻结。如果使用Vertex AI SDK提交任务,可在CustomJob的environment_variables参数中设置:from google.cloud import aiplatform aiplatform.init(project="your-project-id", region="your-region") job = aiplatform.CustomJob( display_name="custom-training-job", script_path="training_script.py", container_uri="us-docker.pkg.dev/vertex-ai/training/scikit-learn-cpu.0-23:latest", environment_variables={"MATPLOTLIB_NO_FONTMANAGER": "1"}, ) job.submit()排查并切断间接依赖
即使未直接导入matplotlib,训练环境中的其他依赖包(如pandas、seaborn等)可能会间接依赖并初始化matplotlib。可通过以下命令查看依赖树:pip show --requires matplotlib找到间接依赖matplotlib的包后,要么改用不依赖matplotlib的替代包,要么在安装该包时加上
--no-deps参数,手动安装其必要依赖(排除matplotlib):pip install [package-name] --no-deps pip install [package-name-required-deps]使用精简自定义镜像
Vertex AI的默认训练镜像可能预装了matplotlib等冗余包。可以构建自己的精简镜像,只安装训练所需的依赖。比如基于python:3.7-slim构建Dockerfile:FROM python:3.7-slim WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY training_script.py . CMD ["python", "training_script.py"]然后将镜像推送到GCR,在提交训练任务时指定该自定义镜像。
提前生成字体缓存(备选)
如果必须保留matplotlib,可以在构建自定义镜像时提前生成字体缓存,避免训练时重复生成:FROM us-docker.pkg.dev/vertex-ai/training/scikit-learn-cpu.0-23:latest RUN python -c "import matplotlib.pyplot as plt; plt.plot([1,2,3])"镜像构建时会完成fontManager的初始化,训练阶段不会再触发该流程。
内容的提问来源于stack exchange,提问作者Hyeonsoo Moon
相关产品推荐
相关产品推荐

