CentOS7系统下Docker容器基于TensorFlow测试GPU

news2025/1/10 21:39:37

前言

当基于nvidia gpu开发的docker镜像在实际部署时,需要先安装nvidia docker。安装nvidia docker前需要先安装原生docker compose

1. CentOS7安装docker详细教程


安装docker
1. Docker 要求 CentOS 系统的内核版本高于 3.10 ,查看本页面的前提条件来验证你的CentOS 版本是否支持 Docker 。

通过 uname -r 命令查看你当前的内核版本

uname -r

2. 使用 root 权限登录 Centos 确保 yum 包更新到最新

sudo yum update

3. 卸载旧版本(如果安装过旧版本的话)

yum remove docker 
docker-client 
docker-client-latest 
docker-common 
docker-latest 
docker-latest-logrotate 
docker-logrotate 
docker-selinux 
docker-engine-selinux 
docker-engine

4. 安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的

yum install -y yum-utils device-mapper-persistent-data lvm2

5. 设置yum源

yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo



6. 可以查看所有仓库中所有docker版本,并选择特定版本安装

yum list docker-ce --showduplicates | sort -r

7. 安装docker,版本号自选

yum install docker-ce-17.12.0.ce

8. 启动并加入开机启动

systemctl start docker
systemctl status docker
systemctl enable docker

9. 验证安装是否成功(有client和service两部分表示docker安装启动都成功了)

docker version

2. CentOS7安装Docker Compose

1. 卸载旧版本Docker Compose
如果之前安装过Docker Compose的旧版本,可以先卸载它们:

sudo rm /usr/local/bin/docker-compose

2. 下载Docker Compose最新版
从Docker官方网站下载Docker Compose最新版本的二进制文件:

sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

3. 授权Docker Compose二进制文
授予Docker Compose二进制文件执行权限

sudo chmod +x /usr/local/bin/docker-compose

4. 检查Docker Compose版本
docker-compose --version

安装版本为
Docker Compose version v2.20.2

3. CentOS7安装NVIDIA-Docker

nvidia-docker

依赖条件
如果使用的 Tensorflow 版本大于 1.4.0,要求 CUDA 9.0 以上版本

1. 下载nvidia-docker安装包

$ wget https://github.com/NVIDIA/nvidia-docker/releases/download/v1.0.1/nvidia-docker-1.0.1-1.x86_64.rpm

2. 安装nvidia-docker

$ rpm -ivh nvidia-docker-1.0.1-1.x86_64.rpm

3. 启动 nvidia-docker 服务
$ sudo systemctl restart nvidia-docker

4. 执行以下命令,若结果显示 active(running) 则说明启动成功

$ systemctl status nvidia-docker.service

Active: active (running) since Fri 2023-07-21 11:15:45 CST; 1min ago
5. 使用 nvidia-docker查看 GPU 信息

 $ nvidia-docker run --rm nvidia/cuda nvidia-smi

4. 启动NVIDIA-Docker的Tensorflow

4.1 查看下载的镜像

[root@gputest gpu]# docker image ls  

4.2 下载tensorflow v1.15.5版本的镜像

官网地址:TensorFlow | NVIDIA NGC

[root@gputest gpu]# docker pull nvcr.io/nvidia/tensorflow:23.03-tf1-py3

安装testflow1.0版本(向下兼容)

4.3 再次查看下载的镜像

[root@gputest gpu]# docker image ls

第一个为刚刚安装的tensorflow

4.4 进入tensorflow容器

nvidia-docker run --rm -it nvcr.io/nvidia/tensorflow:18.03-py3  (清除镜像)

[root@gputest ~]# nvidia-docker run -it nvcr.io/nvidia/tensorflow:23.03-tf1-py3

格式:nvidia-docker run -it {REPOSITORY容器名称:TAG号} 

测试脚本:

import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'

import tensorflow as tf
hello = tf.constant('--------Hello, TensorFlow!----------')
sess = tf.Session()
sess.run(hello)

输出日志太多,可以看到上面的图有I W 分别代表info warning

设置TF_CPP_MIN_LOG_LEVEL的日志级别

机器学习,每次运行代码都会出一堆Successfully opened dynamic library,还有显示各种提示,还有显卡计算信息,于是上网查了很多方法,都不行,最后发现是犯了个错。。如下,要写在import tensorflow前面

import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
import tensorflow as tf

只要写在前面就行了。。。顺序不能错 不能在 import tensorflow as tf 后面

5. 配置git

1. 在本机生成公私钥ssh-keygen -t rsa -b 4096 -C "xx@xx.com"  默认生成的公私钥 ~/.ssh/

id_rsa.pub

id_rsa

去查了下4096是啥意思   参考博客ssh-keygen -t rsa -b 4096 -C "邮箱"_weixin_33775582的博客-CSDN博客

-b 4096:b是bit的缩写

-b 指定密钥长度。对于RSA密钥,最小要求768位,默认是2048位。命令中的4096指的是RSA密钥长度为4096位。

DSA密钥必须恰好是1024位(FIPS 186-2 标准的要求)

Generating public/private rsa key pair.
Enter file in which to save the key (/Users/qa/.ssh/id_rsa): yes
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in yes.
Your public key has been saved in yes.pub.
The key fingerprint is:
SHA256:MGbV/xx/xx lishan12@xx.com
The key's randomart image is:
+---[RSA 4096]----+
|        ...OBB=Eo|
|       . .O+oO=o=|
|      = .o*+B *o.|
|     o o o+B =.. |
|        S.+o .   |
|        .   o    |
|         .   .   |
|          . .    |
|           .     |
+----[SHA256]-----+

2. 配置登录git的username email。为公司给你分配的用户名 密码

第一步:

git config --global user.name 'username'
git config --global user.email 'username@xx.com'

第二步:设置永久保存
git config --global credential.helper store 复制代码
第三步:手动输入一次用户名和密码,GIT会自动保存密码,下次无须再次输入
git pull

3. 初始化仓库  git init

4. 拉取代码 git clone git@gitlab.xx.com:xx/xx.git
Cloning into 'xx-xx'...
git@gitlab.xx.com's password:
Permission denied, please try again.
git@gitlab.xx.com's password:

遇到的问题:没有出username  和 password成对的输入项 ,而是出了password输入项 

都不知道密码是啥,跟登录git库的密码不一样。

然后使用http的方式,报一个错误:

use:~/ecox # git clone https://vcs.in.ww-it.cn/ecox/ecox.git

正克隆到 'ecox'...

fatal: unable to access 'https://vcs.in.ww-it.cn/ecox/ecox.git/': SSL certificate problem: unable to get local issuer certificate

提示SSL证书错误。发现说这个错误并不重要是系统证书的问题,系统判断到这个行为会造成不良影响,所以进行了阻止,只要设置跳过SSL证书验证就可以了,那么用命令 :

git config --global http.sslVerify false

6. git同步远程分支到本地,拉取tensorflow对应版本的分支

git fetch origin 远程分支名xxx:本地分支名xxx
使用这种方式会在本地仓库新建分支xxx,但是并不会自动切换到新建的分支xxx,需要手动checkout,当然了远程分支xxx的代码也拉取到了本地分支xxx中。采用这种方法建立的本地分支不会和远程分支建立映射关系

root@818d19092cdc:/gpu/benchmarks# git checkout -b tf1.15 origin/cnn_tf_v1.15_compatible

 7. tensorflow v1.15脚本运行不同模型

root@818d19092cdc:/gpu/benchmarks/scripts/tf_cnn_benchmarks# pwd
/gpu/benchmarks/scripts/tf_cnn_benchmarks
root@818d19092cdc:/gpu/benchmarks/scripts/tf_cnn_benchmarks# python3 tf_cnn_benchmarks.py

真实操作:

场景一:

batch_size=2

python3 tf_cnn_benchmarks.py --num_gpus=1 --batch_size=2 --model=resnet50 --variable_update=parameter_server

Running warm up
2023-07-21 09:50:55.398126: I tensorflow/stream_executor/platform/default/dso_loader.cc:50] Successfully opened dynamic library libcublas.so.12
2023-07-21 09:50:55.533068: I tensorflow/stream_executor/platform/default/dso_loader.cc:50] Successfully opened dynamic library libcudnn.so.8
Done warm up
Step    Img/sec    total_loss
1    images/sec: 10.1 +/- 0.0 (jitter = 0.0)    7.695
10    images/sec: 10.7 +/- 0.1 (jitter = 0.1)    8.022
20    images/sec: 10.7 +/- 0.1 (jitter = 0.2)    7.269
30    images/sec: 10.7 +/- 0.1 (jitter = 0.2)    7.889
40    images/sec: 10.7 +/- 0.1 (jitter = 0.2)    8.842
50    images/sec: 10.6 +/- 0.1 (jitter = 0.2)    6.973
60    images/sec: 10.6 +/- 0.1 (jitter = 0.2)    8.124
70    images/sec: 10.6 +/- 0.0 (jitter = 0.2)    7.644
80    images/sec: 10.6 +/- 0.0 (jitter = 0.2)    7.866
90    images/sec: 10.6 +/- 0.0 (jitter = 0.3)    7.687
100    images/sec: 10.6 +/- 0.0 (jitter = 0.3)    8.779
----------------------------------------------------------------
total images/sec: 10.63

场景二:

batch_size=4

python3 tf_cnn_benchmarks.py --num_gpus=1 --batch_size=4 --model=resnet50 --variable_update=parameter_server

 Running warm up
2023-07-21 09:57:12.491542: I tensorflow/stream_executor/platform/default/dso_loader.cc:50] Successfully opened dynamic library libcublas.so.12
2023-07-21 09:57:12.628008: I tensorflow/stream_executor/platform/default/dso_loader.cc:50] Successfully opened dynamic library libcudnn.so.8
Done warm up
Step    Img/sec    total_loss
1    images/sec: 16.0 +/- 0.0 (jitter = 0.0)    8.122
10    images/sec: 16.0 +/- 0.0 (jitter = 0.1)    7.534
20    images/sec: 16.0 +/- 0.0 (jitter = 0.1)    7.281
30    images/sec: 16.1 +/- 0.0 (jitter = 0.1)    7.757
40    images/sec: 16.1 +/- 0.0 (jitter = 0.1)    8.225
50    images/sec: 16.1 +/- 0.0 (jitter = 0.1)    8.124
60    images/sec: 16.1 +/- 0.0 (jitter = 0.1)    8.332
70    images/sec: 16.0 +/- 0.0 (jitter = 0.1)    8.802
80    images/sec: 16.0 +/- 0.0 (jitter = 0.1)    7.374
90    images/sec: 16.0 +/- 0.0 (jitter = 0.1)    8.243
100    images/sec: 16.0 +/- 0.0 (jitter = 0.1)    8.416
----------------------------------------------------------------
total images/sec: 16.04

结论:由于阿里云服务器申请的是2个G显存,所以只能跑size=2 和 4 ,超出会吐核

已放弃(吐核)--linux 已放弃(吐核) (core dumped) 问题分析

出现这种问题一般是下面这几种情况:

1.内存越界

2.使用了非线程安全的函数

3.全局数据未加锁保护

4.非法指针

5.堆栈溢出

也就是需要检查访问的内存、资源。

可以使用 strace 命令来进行分析

在程序的运行命令前加上 strace,在程序出现:已放弃(吐核),终止运行后,就可以通过 strace 打印在控制台的跟踪信息进行分析和定位问题

方法2:docker启动普通镜像的Tensorflow

$ docker pull tensorflow/tensorflow:1.8.0-gpu-py3
$ docker tag tensorflow/tensorflow:1.8.0-gpu-py3 tensorflow:1.8.0-gpu

# nvidia-docker run -it -p 8888:8888 tensorflow:1.8.0-gpu
$ nvidia-docker run -it -p 8033:8033 tensorflow:1.8.0-gpu

浏览器进入指定 URL(见启动终端回显) 就可以利用 IPython Notebook 使用 tensorflow

8. 保存镜像的修改

执行以下命令,保存TensorFlow镜像的修改

docker commit   -m "commit docker" CONTAINER_ID  nvcr.io/nvidia/tensorflow:18.03-py3
# CONTAINER_ID可通过docker ps命令查看。

[root@gputest ~]# docker commit -m "commit docker" 818d19092cdc nvcr.io/nvidia/tensorflow:23.03-tf1-py3
sha256:fc14c7fdf361308817161d5d0cc018832575e7f2def99fe49876d2a41391c52c

 查看docker进程

[root@gputest ~]# docker ps

进入CONTAINER ID  containerid

[root@gputest ~]# nvidia-docker exec -it 818d19092cdc /bin/bash

100. 参考资料

如何在GPU实例上部署NGC环境?_GPU云服务器-阿里云帮助中心

TensorFlow | NVIDIA NGC

搭建深度学习docker容器(2)- CentOS7安装NVIDIA-Docker | Luck_zy

Docker安装Docker-Compose - 哔哩哔哩

CentOS7安装nvidia-docker - CodeAntenna

os.environ['TF_CPP_MIN_LOG_LEVEL']无效_os.environ['tf_cpp_min_log_level'] = '2'无效_yulanf的博客-CSDN博客

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

辅助笔记-linux新增硬盘

linux新增硬盘 文章目录 linux新增硬盘步骤1:添加硬盘步骤2:对硬盘进行分区步骤3:对硬盘分区进行格式化步骤4:将硬盘分区挂载到目录上步骤5:设置“永久挂载” 本文主要参考B站视频“P59_韩顺平Linux_增加磁盘应用实例”…

IDEA: 将第三方依赖打入jar包

文章目录 一、添加自定义的jar包到lib目录下二、将自定义依赖包打入jar包方式1、使用springboot自带的插件 一、添加自定义的jar包到lib目录下 参考往期文章:IDEA中Java项目创建lib目录(添加依赖jar包代替maven依赖) 二、将自定义依赖包打入jar包 方式1、使用spr…

centos7下载mysql5.7,jdk1.8

前言:最近公司服务器从阿里云换到腾讯云了(为了省钱啧啧),所以这个相关环境的配置工作,由我来负责了。 1.Mysql 1.下载 第一步: rpm -ivh https://dev.mysql.com/get/mysql57-community-release-el7-11…

【算法基础:数学知识】4.4 快速幂

文章目录 快速幂例题列表875. 快速幂⭐⭐⭐⭐⭐(重要!)代码写法1——递归代码写法2——迭代递归写法 与 迭代写法的 对比 876. 快速幂求逆元🚹(需要理解逆元的概念)TODO乘法逆元介绍解法代码 快速幂 https…

python机器学习(三)特征预处理、鸢尾花案例--分类、线性回归、代价函数、梯度下降法、使用numpy、sklearn实现一元线性回归

K-近邻算法(K-Nearest Neighboor) 特征预处理 数据预处理的过程。数据存在不同的量纲、数据中存在离群值,需要稳定的转换数据,处理好的数据才能更好的去训练模型,减少误差的出现。 标准化 数据集的标准化对scikit-learn中实现的大多数机器…

WPF实战项目十(API篇):引入工作单元UnitOfWork

1、通过github地址:https://github.com/arch/UnitOfWork,下载UnitOfWork的代码,将工作单元部分的代码引用到自己的项目,新增UnitOfWork文件夹。 2、在UnitOfWork文件夹下引用UnitOfWork下的IPagedList.cs、PagedList.cs类&#xf…

探索物联网HMI的端口转发和NAT功能

前言 端口转发和NAT功能常用于内网穿透,实现内部网络和外部网络之间的数据传输,工作人员通过外部网络便可安全访问到内网设备,实现设备的状态监测。接下来小编将为大家介绍支持端口转发和NAT功能的虹科物联网HMI是如何帮助用户实现内网穿透。…

(css)自定义登录弹窗页面

(css)自定义登录弹窗页面 效果&#xff1a; 代码&#xff1a; <!-- 登录弹窗 --> <el-dialog:visible.sync"dialogVisible"title"用户登录"width"25%"centerclass"custom-dialog":show-close"false":close-on-cli…

uniapp 条件编译

// #ifdef %PLATFORM%仅在某平台存在&#xff1b;%PLATFORM%为平台名称// #ifndef %PLATFORM%除了某平台均存在&#xff1b;// #endifendif 一定要搭配使用%PLATFORM%&#xff1a; VUE3 HBuilderX 3.2.0 详情 APP-PLUS App APP-PLUS-NVUE或APP-NVUE App nvue 页面 APP-ANDRO…

Redis八股学习记录1Redis面试常问问题from小林coding

Redis八股学习记录1Redis简介与数据结构from小林coding Redis简介Redis数据结构String底层实现List底层实现Hash底层实现Set底层实现Zset Redis线程模型Redis持久化AOF日志的实现AOF日志重写机制 RDB快照实现混合持久化Redis集群主从复制哨兵模式切片集群模式Redis的集群脑裂问…

【C++初阶】仿函数和priority_queue的模拟实现(附源码)

一.仿函数 仿函数&#xff0c;顾名思义就是模仿函数&#xff0c;它其实是一个类&#xff0c;类里面重载了运算符&#xff08;&#xff09;&#xff0c;在调用这个重载的运算符时&#xff0c;让我们感觉是调用函数一样&#xff0c;可以说相当于C语言里的函数指针一样&#xff0c…

Jenkins环境配置篇-邮件发送

作为持续集成的利器Jenkins已经得到了广泛地应用&#xff0c;仅仅作为一个工具&#xff0c;Jenkins已然有了自己的生态圈&#xff0c;支持其的plugin更是超过1300。在实际中如何使用以及如何更好地使用jenkins&#xff0c;一直是大家在实践并讨论的。本系列文章将会从如何使用j…

视频拼接得AI三维生成方案-开端(一)

想使用二维得图像生成三维得空间图像&#xff0c;英伟达有完整得方案&#xff0c;开源&#xff0c;但是三维拼接不一样&#xff0c;只需要二维&#xff0c;并且要实时&#xff0c;如何生成是我每天都在思考得东西。 cnn 提取特征器和自编码 在训练细胞神经网络时&#xff0c;问…

【C++】多态案例— —计算器类

author&#xff1a;&Calton tag&#xff1a;C topic&#xff1a;【C】多态案例— —计算器类 website&#xff1a;黑马程序员C date&#xff1a;2023年7月23日 目录 多态概要 案例实现 原理剖析 多态概要 多态是C三大特性之一&#xff08;封装、继承、多态&#xff…

FreeRTOS源码分析-5 系统延时详解

目录 1 系统延时API详解 2 相对延时与绝对延时的区别 3 相对延时与绝对延时的应用 4 系统延时函数实现原理 4.1 vTaskDelay业务流程 4.2 vTaskDelayUntil业务流程 5 任务挂起/任务恢复详解 1 系统延时API详解 TickType_t 实际上是uint32_t类型 2 相对延时与绝对延时的区…

MATLAB | 绘制scatter散点图时如何自动标注超范围散点?

本文来讲一下如何自动标注超出坐标区域范围的点&#xff0c;例如这样&#xff1a; 如图右侧的红叉代表横坐标超过范围的点的纵坐标 &#xff0c;当然下方的红叉代表纵坐标超过范围点的横坐标。 本文使用的自己编写的工具函数scatterOOR将被放在文末&#xff0c;先讲讲咋用哈&a…

【算法基础:搜索与图论】3.3 拓扑排序

文章目录 拓扑排序介绍如何构造拓扑排序&#xff08;⭐重要&#xff01;&#xff09; 例题&#xff1a;848. 有向图的拓扑序列BFS 写法构造拓扑排序 相关题目练习207. 课程表&#xff08;判断是否存在拓扑序列&#xff09;bfs 写法dfs 写法 210. 课程表 II&#xff08;找到一个…

Packet Tracer – 实施静态 NAT 和动态 NAT

Packet Tracer – 实施静态 NAT 和动态 NAT 拓扑图 目标 第 1 部分&#xff1a;利用 PAT 配置动态 NAT 第 2 部分&#xff1a;配置静态 NAT 第 3 部分&#xff1a;验证 NAT 实施 第 1 部分&#xff1a; 利用 PAT 配置动态 NAT 步骤 1&#xff1a; 配置允许用于 NAT …

transformer 笔记

目录 目前在NLP领域当中&#xff0c;主要存在三种特征处理器——CNN、RNN 以及 Transformer&#xff0c;当前Transformer的流行程度已经大过CNN和RNN&#xff0c;它抛弃了传统CNN和RNN神经网络&#xff0c;整个网络结构完全由Attention机制以及前馈神经网络组成。 Transformer…

K8s Service网络详解(二)

Kube Proxy Kubernetes 在设计之初就充分考虑了针对容器的服务发现与负载均衡机制。 Service 资源&#xff0c;可以通过 kube-proxy 配合 cloud provider 来适应不同的应用场景。 Service相关的事情都由Node节点上的 kube-proxy处理。在Service创建时Kubernetes会分配IP给Ser…