一次配置Docker环境的完整记录

一次配置Docker环境的完整记录

  • Docker环境搭建
  • 报错与解决
    • 报错一
    • 报错二
    • 报错三

在这里插入图片描述

Docker环境搭建

本节介绍了一次配置docker环境的完整记录:

  1. 编写Dockerfile文件:

    FROM pytorch/pytorch:1.10.0-cuda11.3-cudnn8-develRUN rm /etc/apt/sources.list.d/cuda.list
    RUN rm /etc/apt/sources.list.d/nvidia-ml.list
    RUN apt-key del 7fa2af80
    RUN sed -i 's/security.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list 
    RUN apt update && apt install -y build-essential vim git wget
    RUN wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/cuda-keyring_1.0-1_all.deb
    RUN dpkg -i cuda-keyring_1.0-1_all.debcopy ./requirements.txt /root/
    
  2. 构建镜像:

    # IMAGE_NAME为镜像名称,TAG为标签,缺省默认为latest,网络network使用host宿主的
    docker build -t IMAGE_NAME:TAG . --network=host
    # eg:docker build -t demo:v1.0 . --network=host
    
  3. 启动容器,并进入容器配置环境:

    docker run -it --network=host --gpus all demo:v1.0 /bin/bash
    # 第一次启动运行run命令,若容器exit停止后可以输入一下命令重新进入:
    # docker ps -a
    # docker start -ia CONTAINER_ID
    

    配置pip国内镜像源:

    # 没有自行创建
    vim ~/.config/pip/pip.conf
    

    使用阿里镜像源:

    [global]
    index-url = https://mirrors.aliyun.com/pypi/simple[install]
    trusted-host = mirrors.aliyun.com
    

    环境配置可根据自身情况进行配置,在此省略。

  4. 环境配置好后将容器导出为镜像:

    # CONTAINER_ID为容器ID;IMAGE_NAME为镜像名称;TAG为标签,缺省默认为latest
    docker commit CONTAINER_ID IMAGE_NAME:TAG
    
  5. 将docker镜像推送至仓库:

    # 仓库地址登录,输入你的用户名和密码,登录到Docker Hub。
    docker login # 推送镜像(如果你是首次推送或你的仓库设定为私有的,你可能需要先在Docker Hub上创建仓库)
    docker push IMAGE_NAME:TAG
    

报错与解决

在配置环境时,需要编译cuda代码,遇到了一系列报错,本节将介绍相关报错与解决方法。

报错一

fatal error: cuda_runtime_api.h: No such file or directory

解决办法是修改bashrc文件,指定环境变量:

vim ~/.bashrc
# CUDA
export CUDA=11.3
export PATH=/usr/local/cuda-$CUDA/bin${PATH:+:${PATH}}
export CUDA_PATH=/usr/local/cuda-$CUDA
export CUDA_HOME=/usr/local/cuda-$CUDA
export LIBRARY_PATH=$CUDA_HOME/lib64:$LIBRARY_PATH
export LD_LIBRARY_PATH=/usr/local/cuda-$CUDA/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda/extras/CUPTI/lib64:$LD_LIBRARY_PATH
export NVCC=/usr/local/cuda-$CUDA/bin/nvcc
export CFLAGS="-I$CUDA_HOME/include $CFLAGS"

修改完保存后,更新一下环境变量:

source ~/.bashrc

报错二

File "/opt/conda/lib/python3.7/site-packages/torch/utils/cpp_extension.py", line 1606, in _get_cuda_arch_flagsarch_list[-1] += '+PTX'
IndexError: list index out of range

问题的根源在于当没有检测到CUDA硬件时,torch.cuda.device_count()返回0,导致不会向arch_list中添加任何架构,arch_list[-1] += '+PTX’也就无法索引。即arch_list=[],导致无法索引。解决办法是添加环境变量,根据你的GPU compatibility修改具体的值:

CUDA_VERSION=$(/usr/local/cuda/bin/nvcc --version | sed -n 's/^.*release \([0-9]\+\.[0-9]\+\).*$/\1/p')
if [[ ${CUDA_VERSION} == 9.0* ]]; thenexport TORCH_CUDA_ARCH_LIST="3.5;5.0;6.0;7.0+PTX"
elif [[ ${CUDA_VERSION} == 9.2* ]]; thenexport TORCH_CUDA_ARCH_LIST="3.5;5.0;6.0;6.1;7.0+PTX"
elif [[ ${CUDA_VERSION} == 10.* ]]; thenexport TORCH_CUDA_ARCH_LIST="3.5;5.0;6.0;6.1;7.0;7.5+PTX"
elif [[ ${CUDA_VERSION} == 11.0* ]]; thenexport TORCH_CUDA_ARCH_LIST="3.5;5.0;6.0;6.1;7.0;7.5;8.0+PTX"
elif [[ ${CUDA_VERSION} == 11.* ]]; thenexport TORCH_CUDA_ARCH_LIST="3.5;5.0;6.0;6.1;7.0;7.5;8.0;8.6+PTX"
elseecho "unsupported cuda version."exit 1
fi

报错三

运行算法显示缺少相关依赖包:

# ImportError: libGL.so.1: cannot open shared object file: No such file or directory
apt-get install libgl1
# ImportError: libgthread-2.0.so.0: cannot open shared object file: No such file or directory
apt-get install -y libglib2.0-0 libsm6 libxrender1 libxext6
# ImportError:XXX.cpython-37m-x86_64-linux-gnu.so: undefined symbol
# 问题是编译cuda源码有问题,解决办法为启动容器时使用--gpus all,再进行源码的编译。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/625712.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue3中单框双时间选择模式

在单框双时间选择下&#xff0c;给当前时间框赋值&#xff0c;可以使用vue中的v-model双向绑定方式 如前端元素代码&#xff1a; <el-form-item label"创建时间" style"width: 308px;"><el-date-pickerv-model"dateRange"value-forma…

浏览器工作原理与实践--HTTPS:让数据传输更安全

浏览器安全主要划分为三大块内容&#xff1a;页面安全、系统安全和网络安全。前面我们用四篇文章介绍了页面安全和系统安全&#xff0c;也聊了浏览器和Web开发者是如何应对各种类型的攻击&#xff0c;本文是我们专栏的最后一篇&#xff0c;我们就接着来聊聊网络安全协议HTTPS。…

数据结构速成--栈

由于是速成专题&#xff0c;因此内容不会十分全面&#xff0c;只会涵盖考试重点&#xff0c;各学校课程要求不同 &#xff0c;大家可以按照考纲复习&#xff0c;不全面的内容&#xff0c;可以看一下小编主页数据结构初阶的内容&#xff0c;找到对应专题详细学习一下。 目录 一…

nuxt3项目使用swiper11插件实现点击‘’返回顶部按钮‘’返回到第一屏

该案例主要实现点击返回顶部按钮返回至swiper第一个slide。 版本&#xff1a; "nuxt": "^3.10.3", "pinia": "^2.1.7", "swiper": "^11.0.7", 官方说明 swiper.slideTo(index, speed, runCallbacks) Run transit…

MyBatisPlus自定义SQL

✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉🍎个人主页:Leo的博客💞当前专栏: 循序渐进学SpringBoot ✨特色专栏: MySQL学习 🥭本文内容:MyBatisPlus自定义SQL 📚个人知识库: Leo知识库,欢迎大家访问 目录 1.前言☕…

(BERT蒸馏)TinyBERT: Distilling BERT for Natural Language Understanding

文章链接&#xff1a;https://arxiv.org/abs/1909.10351 背景 在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;预训练语言模型&#xff08;如BERT&#xff09;通过大规模的数据训练&#xff0c;已在多种NLP任务中取得了卓越的性能。尽管BERT模型在语言理解和生成…

SQL-DML数据操纵语言(Oracle)

文章目录 DML数据操纵语言常见的字段属性字符型字段属性char(n)varchar2(n)/varchar(n) 数值型字段属性number([p],[s]int 日期型字段属性DATEtimestamp 如何查看字段属性增加数据INSERT快捷插入 删除数据DELETE修改数据UPDATE DML数据操纵语言 定义 是针对数据做处理&#xf…

探索数据结构:BF与KMP的灵活应用

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;数据结构与算法 贝蒂的主页&#xff1a;Betty’s blog 1. 什么是字符串匹配算法 字符串匹配是计算机科学中的一个基础概念&…

MBR30100PT-ASEMI肖特基二极管MBR30100PT

编辑&#xff1a;ll MBR30100PT-ASEMI肖特基二极管MBR30100PT 型号&#xff1a;MBR30100PT 品牌&#xff1a;ASEMI 封装&#xff1a;TO-247 最大平均正向电流&#xff08;IF&#xff09;&#xff1a;30A 最大循环峰值反向电压&#xff08;VRRM&#xff09;&#xff1a;10…

办公网数据防泄密解决方案丨深度解析

企业数据已成为其最宝贵的资产之一。 然而&#xff0c;办公自动化的推进和网络技术的普及&#xff0c;导致数据泄露的风险也日益加剧。 为了有效应对这一挑战&#xff0c;越来越多的企业开始寻求专业的数据防泄密解决方案。 其中&#xff0c;域智盾软件以其卓越的性能和全面的…

保护C#代码的艺术:深入浅出代码混淆技术

摘要 在C#开发中&#xff0c;代码的保护是一个不可忽视的问题。本文深入探讨了几种常用的C#代码混淆工具&#xff0c;帮助开发者理解如何有效地保护代码不被反编译。同时&#xff0c;本文也对混淆技术的优缺点进行了分析&#xff0c;并提供了一些实际使用的建议。 引言 C#是…

Python简化远程部署和系统管理的工具库之fabric使用详解

概要 Python Fabric库是一个用于简化远程部署和系统管理的工具库。它提供了一组简洁而强大的函数和工具,可以帮助开发者轻松地在多台远程主机上执行命令、上传文件、下载文件等操作,从而实现自动化部署和管理。 安装 要使用Python Fabric库,首先需要安装Fabric模块。可以通…