电脑配置
OS: Ubuntu 20.04
GPU: RTX 3090 x 2, 分别记为gpu0,gpu1。
Tensorflow: 2.4.0
遇到的问题
程序里面原本设置如下:
os.environ["CUDA_VISIBLE_DEVICES"] = "0, 1"
实际上如果不设置的话,也是默认使用两块GPU.
我遇到的问题是:启动一个程序的话,使用率, gpu0:90%, gpu1: 接近0。
然后我启动了3个程序,相当于三个程序同时在运行(速度相比于只运行一个慢多了),这样一来, 使用率, gpu0:100%, gpu1: 10%, 我发现这三个程序实际上都是在gpu0上运行的,如下:
看来,gpu1基本上没啥用,太浪费了。 怎么办?
尝试1
首先想到的是在运行程序的时候通过指定GPU的方式来把4个运行任务均摊到两个gpu上。具体讲:
通过命令行+ 参数的方式来指定gpu,
运行程序的命令如下:
:python3 start.py --gpuid '0'
其中start.py即为要运行的程序文件,通过参数gpuid来指定使用哪一块gpu。
start.py中,
parser.add_argument('--gpuid', type=str, default='0, 1', help="GPU-ID used for training in a multi-GPU environment (default: None)")
os.environ["CUDA_VISIBLE_DEVICES"] = args.gpuid # 指定GPU
# 接着就是启动实验的程序。
奇怪的是这种指定方式的方式并没有起到任何作用。
尝试2
直接在命令行进行指定并启动程序,具体命令如下:
CUDA_VISIBLE_DEVICES = 1 python3 start.py
注:当然也可以指定多个gpu, 如, CUDA_VISIBLE_DEVICES=0, 1。
通过这样的方式给每个GPU分配两个运行任务,与不指定GPU相比,发现:
1.GPU1的使用率提高了,实际上两块GPU的使用率相当;
2 程序运行速度提高了不少,因为之前4个运行任务都在gpu0上,不过带来的问题时噪音变大了。之前两个GPU fan都在75%左右, 现在两个gpu fan都很高,一个为100%。
如下:
其他技巧
多GPU环境,如果不指定GPU的话,系统以一种贪婪的方式把计算任务铺满所有的GPU资源,因此可以在程序中设置动态分配GPU资源。
如下:
gpus = tf.config.experimental.list_physiological_devices("GPU")
for gpu in gpus:
tf.config.experimental.set_memory_growth(gpu, True)
OK.