Mac M1运行TensorFlow时如何将GPU负载提升至100%
M1 Mac 运行TensorFlow GPU负载不足优化方案
你贴出的日志中NUMA节点识别失败、CPU频率获取失败均为tensorflow-metal插件的常规提示,不属于报错,不会影响GPU正常调度。
当前环境配置如下:
name: tensorflow dependencies: - python=3.8 - pip - jupyter - apple::tensorflow-deps - scikit-learn - scipy - pandas - pandas-datareader - matplotlib - pillow - tqdm - requests - h5py - pyyaml - flask - boto3 - openssl - pip: - tensorflow-macos - tensorflow-metal - bayesian-optimization - gym - kaggle
运行时输出日志:
I tensorflow/core/common_runtime/pluggable_device/pluggable_device_factory.cc:305] Could not identify NUMA node of platform GPU ID 0, defaulting to 0. Your kernel may not have been built with NUMA support. I tensorflow/core/common_runtime/pluggable_device/pluggable_device_factory.cc:271] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 0 MB memory) -> physical PluggableDevice (device: 0, name: METAL, pci bus id: <undefined>) W tensorflow/core/platform/profile_utils/cpu_utils.cc:128] Failed to get CPU frequency: 0 Hz I tensorflow/core/grappler/optimizers/custom_graph_optimizer_registry.cc:113] Plugin optimizer for device_type GPU is enabled.
可操作的优化手段
- 调大训练batch size:GPU负载上不去最核心的原因通常是计算任务量太小,喂不满M1 GPU的计算单元。可以在统一内存允许的范围内逐步增大batch size,直到内存占用接近设备上限且不触发交换,GPU利用率会有明显提升。注意batch size过大会触发内存交换,反而会拖慢整体训练速度。
- 打通数据供给瓶颈:GPU长期处于等数据的状态时,负载会卡在低位。可以做以下调整:
- 用
tf.data构建数据管道时,加上.prefetch(tf.data.AUTOTUNE),提前加载下一批待计算数据 - 尽可能把数据预处理逻辑(归一化、编码、裁剪等)封装为TensorFlow原生算子放到GPU侧执行,不要用numpy、pandas在CPU侧做逐批预处理
- 数据集规模不大时,在数据管道上加
.cache()方法,把全量数据缓存到内存,避免每轮训练重复读取磁盘
- 用
- 调整Metal插件调度参数:在导入TensorFlow之前,提前配置环境变量提升GPU任务调度优先级,示例代码:
import os os.environ['TF_METAL_WORKERS'] = '8' os.environ['TF_METAL_QUEUE_PRIORITY'] = 'high' import tensorflow as tf
- 升级依赖版本:当前使用的Python 3.8对应较早版本的tensorflow-metal,早期版本对M1系列GPU的算子适配不全,部分算子会自动回退到CPU执行,拉低整体GPU负载。建议升级到Python 3.10版本,安装最新版的tensorflow-macos与tensorflow-metal,新版本已经修复了大量算子调度效率问题。
- 解除系统功耗限制:训练时必须接通电源,在系统设置-电池选项中,把电源适配器模式调整为高功耗,避免系统为了续航限制GPU频率上限。
关于100%负载的说明
M1系列芯片的GPU利用率统计逻辑和英伟达独立显卡不同,活动监视器显示的利用率是GPU所有功能单元的综合占比,TensorFlow的训练任务以矩阵计算为主,无法调用GPU的纹理渲染、光栅化等专用单元,正常情况下矩阵计算场景GPU利用率稳定在70%-80%就已经达到最优调度状态,强行追求100%负载没有实际意义,不会带来训练速度的提升。
内容的提问来源于stack exchange,提问作者Fabio Magarelli
相关产品推荐
相关产品推荐

