如何在同一Docker镜像上使用1080Ti/2080Ti等GPU且无需重跑python setup.py develop
问题原因分析
- CUDA扩展编译的算力匹配问题:CUDA核函数编译时需要指定目标GPU的算力版本,默认情况下PyTorch的扩展编译只会针对构建时可见的GPU算力生成对应核镜像。1080/1080Ti的算力为6.1,2080Ti的算力为7.5,你最初在1080环境下构建的镜像里的扩展仅包含6.1的核,无法在2080Ti上运行,反之亦然。
- 挂载目录带来的交叉污染:你启动容器时挂载了
$CODE_PATH/pcdet到容器内的/ST3D/pcdet路径,python setup.py develop模式会将编译生成的动态库(.so文件)写入当前工作目录的pcdet路径下,因此不管你用哪个容器运行构建,修改的都是宿主机同一个共享的pcdet目录下的库文件,才会出现一个镜像构建后另一个镜像失效的问题。
解决方案
步骤1:消除挂载交叉污染
两种可选方案:
- 方案A:为不同GPU准备独立的CODE_PATH,不同算力的GPU启动容器时挂载对应路径下的pcdet目录,避免共享目录的内容互相覆盖
- 方案B:如果需要共享代码目录做开发,启动容器时将pcdet目录设置为只读挂载(增加参数
:ro),让构建产物直接存在容器内部,或者排除所有build目录、.so后缀文件的挂载。
步骤2:编译多算力支持的CUDA扩展
修改Dockerfile,在执行setup.py前指定需要支持的所有算力版本,让编译阶段同时生成所有目标算力的核镜像:
将原Dockerfile中的RUN python setup.py develop替换为:
RUN TORCH_CUDA_ARCH_LIST="6.1;7.5+PTX" python setup.py develop
参数说明:
- 6.1对应1080/1080Ti的算力
- 7.5对应2080Ti的算力
- +PTX用于兼容后续更高算力的GPU,可按需添加
步骤3:重新构建镜像并验证
- 清空宿主机
$CODE_PATH/pcdet目录下所有编译生成的.o、.so文件和build目录等残留构建产物,避免旧文件干扰 - 用修改后的Dockerfile重新构建镜像
- 新镜像启动后,无论指定1080/1080Ti还是2080Ti GPU都可以直接运行,无需重新构建
内容的提问来源于stack exchange,提问作者darrenjkt
相关产品推荐
相关产品推荐

