如何通过uWSGI在不同GPU上均匀启动深度学习模型服务多进程?
解决uWSGI多进程绑定不同GPU的问题
当然可以通过uWSGI配置实现多进程的GPU均匀分配,核心思路是给每个worker进程单独设置CUDA_VISIBLE_DEVICES环境变量,让不同worker绑定到不同GPU。下面是两种实用的配置方式:
方法一:用uWSGI内置变量动态分配
利用uWSGI的per-worker-env指令和内置的%(worker_id)变量,结合GPU数量做取模运算,实现均匀分配。
假设你有2个GPU,要启动4个worker(每个GPU跑2个进程),uwsgi.ini配置如下:
[uwsgi] # 基础配置 http = :5000 module = your_flask_or_django_app:app processes = 4 # 按worker ID取模GPU数量,分配对应GPU # 这里%2代表GPU总数为2,可根据实际数量修改 per-worker-env = CUDA_VISIBLE_DEVICES=%(worker_id)%2
这样worker 0、2会绑定0号GPU,worker 1、3会绑定1号GPU,自动实现均匀负载。
方法二:用post-fork钩子自定义分配
如果需要更灵活的分配规则(比如指定特定GPU给某些worker),可以用post-fork钩子执行shell命令设置环境变量:
[uwsgi] http = :5000 module = your_app:app processes = 4 # 每个worker启动后,根据自身ID设置对应的GPU # UWSGI_WORKER_ID是worker进程的内置环境变量 post-fork = exec:export CUDA_VISIBLE_DEVICES=$((UWSGI_WORKER_ID % 2))
如果要自定义GPU映射(比如worker 0用1号GPU,worker1用3号,worker2用1号,worker3用3号),可以改成:
post-fork = exec:export CUDA_VISIBLE_DEVICES=$(echo "1 3 1 3" | cut -d' ' -f$((UWSGI_WORKER_ID + 1)))
关键注意事项
- 确保你的深度学习框架(PyTorch/TensorFlow等)会自动读取
CUDA_VISIBLE_DEVICES,不要在代码里硬编码device_id,否则会覆盖环境变量的设置。 - 如果GPU性能差异大,可以调整分配比例(比如高性能GPU多分配几个worker),只需要修改取模规则或映射列表即可。
内容的提问来源于stack exchange,提问作者XiaXuehai
相关产品推荐
相关产品推荐

