01 概述
02 准备OVF虚拟机镜像
03 导入Ubuntu22的初始化环境
04 使用VMWare拍摄快照进行备份
05 Docker环境的测试和使用
06 安装Nvidia容器工具包
07 GPU支持的TensorFlow的环境搭建和踩坑
08 拉取非GPU支持的TensorFlow镜像
09 启动TensorFlow环境并访问测试
10 优化TensorFlow环境
11 导出TensorFlow环境为OVF镜像
12 在Ubuntu22中安装Anaconda3
13 在Ubuntu22中安装Vscode
14 在Ubuntu22中使用pip安装tensorflow
15 在Ubuntu22中安装CUDA驱动
16 导出支持GPU的TensorFlow环境为OVF镜像
17 创建各种维度的张量
18 将张量转换为numpy
19 将两个张量相加
20 将两个张量进行元素相乘
21 将两个张量进行矩阵相乘
22 张量的一些简单的聚合运算
23 变量的基本用法
24 总结
官方地址:https://tensorflow.google.cn/install?hl=zh-cn
请从 PyPI 中选择以下某个 TensorFlow 软件包进行安装:
pip install tensorflow
参考地址:https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html
Configure the production repository:
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg && curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
Optionally, configure the repository to use experimental packages:
sudo sed -i -e '/experimental/ s/^#//g' /etc/apt/sources.list.d/nvidia-container-toolkit.list
Update the packages list from the repository:
sudo apt-get update
Install the NVIDIA Container Toolkit packages:
sudo apt-get install -y nvidia-container-toolkit
Docker 是在 GPU 上运行 TensorFlow 的最简单方法,因为主机只需安装 NVIDIA® 驱动程序,而不必安装 NVIDIA® CUDA® 工具包。
安装 Nvidia 容器工具包以向 Docker 添加 NVIDIA® GPU 支持。nvidia-container-runtime 仅适用于 Linux。
检查 GPU 是否可用:
lspci | grep -i nvidia
验证 nvidia-docker 安装效果:
docker run --gpus all --rm nvidia/cuda nvidia-smi
官方 TensorFlow Docker 映像位于 tensorflow/tensorflow Docker Hub 代码库中。映像版本按照以下格式进行标记:
标记 | 说明 |
---|---|
latest |
TensorFlow CPU 二进制映像的最新版本。(默认版本) |
nightly |
TensorFlow 映像的每夜版。(不稳定) |
version |
指定 TensorFlow 二进制映像的版本,例如:2.1.0 |
devel |
TensorFlow master 开发环境的每夜版。包含 TensorFlow 源代码。 |
custom-op |
用于开发 TF 自定义操作的特殊实验性映像。 |
每个基本标记都有会添加或更改功能的变体:
标记变体 | 说明 |
---|---|
tag -gpu |
支持 GPU 的指定标记版本。 |
tag -jupyter |
针对 Jupyter 的指定标记版本(包含 TensorFlow 教程笔记本) |
下载支持GPU的TensorFlow:
docker pull tensorflow/tensorflow:latest-gpu-jupyter
TensorFlow Docker 映像已经过配置,可运行 TensorFlow。Docker 容器可在虚拟环境中运行,是设置 GPU 支持的最简单方法。
docker run -it -p 8888:8888 tensorflow/tensorflow:latest-gpu-jupyter
浏览器访问:http://localhost:8888
使用非GPU支持的TensorFlow:
docker pull tensorflow/tensorflow:latest-jupyter
docker run -it -p 8888:8888 tensorflow/tensorflow:latest-jupyter
之前的命令有两个问题:
这两个问题怎么优化呢?
docker run --restart=always --name tensorflow -itd -p 8888:8888 tensorflow/tensorflow:latest-jupyter
这个时候有个新的问题,怎么获取token?
docker logs -f --tail=100 tensorflow
命令:
pip install tensorflow
在Ubuntu22中安装CUDA驱动:
# 第一步:安装gcc
sudo apt install gcc -y
# 第二步:下载CUDA
wget https://developer.download.nvidia.com/compute/cuda/11.7.1/local_installers/cuda_11.7.1_515.65.01_linux.run
# 第三步:安装
sudo sh cuda_11.7.1_515.65.01_linux.run
# 第四步:配置环境变量
export PATH=/usr/local/cuda-11.7/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-11.7/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
# 第五步:安装依赖
sudo apt install nvidia-cuda-toolkit
# 第六步:检查
nvcc -V
张量本质上是一种数组。
导入依赖:
import tensorflow as tf
import numpy as np
创建基础的张量:
# 创建int32类型的0维张量
rank_0_tensor = tf.constant(4)
print(rank_0_tensor)
# 创建float32类型的1维张量
t1 = tf.constant([2.0, 3, 4])
print(t1)
# 创建二维张量
t2 = tf.constant([[1,2],[3,4],[5,6]], dtype=tf.float32)
print(t2)
创建一个三维的张量:
t3 = tf.constant([[[1],[2]],[[3],[4]],[[5],[6]]])
print(t3)
张量是通过tf.constant()
创建,闯入的值是一个数组,这个数组是几维的,张量就是几维。比较特殊的是,如果传入的是一个常量,那么这个张量,就是0维的张量。
方法1:
np.array(t2)
方法2:
t2.numpy()
要求两个张量的形状是一样的。会让对应索引的元素分别相加。
举例:
a = [[1,2],[3,4]]
b = [[3,3],[4,4]]
a + b = 每个索引位置对应相加 [[1+3,2+3],[3+4,4+4]] = [[4,5],[7,8]]
示例代码:
a = tf.constant([[1,2],[3,4]])
b = tf.constant([[3,3],[4,4]])
tf.add(a, b)
指的是让每个对应索引的元素分别相乘。
距离:
a = [[1,2],[3,4]]
b = [[3,3],[4,4]]
a + b = 每个索引位置对应相乘 [[1x3,2x3],[3x4,4x4]] = [[3,6],[12,16]]
示例代码:
a = tf.constant([[1,2],[3,4]])
b = tf.constant([[3,3],[4,4]])
tf.multiply(a, b)
矩阵的乘法比较复杂,我们从简单到难度去记忆。
当一个矩阵和一个向量相乘的时候,要求矩阵行的元素个数等于向量的元素个数。结果是矩阵的每行和向量相乘,然后求和,这些和组成的新的一列,形成最后的结果。这个说起来比较复杂,举个简单的例子:
[[1,2],[3,4]] 乘 [3,3]
= [1, 2] 乘 [3, 3] = [1*3 + 2*3] = 9
= [3, 4] 乘 [3, 3] = [3*3 + 4*3] = 21
所以结果是:[9, 21]
当一个矩阵和另一个矩阵相乘的时候,要求矩阵和行数和列数是相同的。然后用矩阵的每一行与另一个矩阵的每一列相乘再相加,最终得到一个新的矩阵。还是举个简单的例子:
[[1,2],[3,4]] 乘 [[2,3],[2,1]]
= [1,2] 乘 [2,2] , [1,2] 乘 [3,1] = [6,5]
= [3,4] 乘 [2,2] , [3,4] 乘 [3,1] = [14,13]
所以结果是:[[6,5],[14,13]]
举例2:
a =
[
[1,2],
[3,4]
]
b = [
[3,3],
[4,4]
]
===
[
[1,2]x[3,4],[1,2]x[3,4],
[3,4]x[3,4],[3,4]x[3,4]
]
===
[
[1x3+2x4, 1x3+2x4],
[3x3+4x4, 3x3+4x4]
]
===
[
[11, 11],
[25, 25]
]
示例代码:
# 矩阵乘以矩阵
a = tf.constant([[1,2],[3,4]])
b = tf.constant([[2,3],[2,1]])
tf.matmul(a, b)
# 矩阵乘以矩阵
a = tf.constant([[1,2],[3,4]])
b = tf.constant([[3,3],[4,4]])
tf.matmul(a, b)
cst = tf.constant([[1,2,3],[3,33,333]])
tf.reduce_max(cst)
cst = tf.constant([[1,2,3],[3,33,333]])
tf.reduce_min(cst)
cst = tf.constant([[1,2,3],[3,33,333]])
tf.reduce_sum(cst)
cst = tf.constant([[1,2,3],[3,33,333]])
tf.reduce_mean(cst)
cst = tf.constant([[1,2,3],[3,33,333]])
tf.argmax(cst)
cst = tf.constant([[1,2,3],[3,33,333]])
tf.argmin(cst)
TensorFlow中的变量是一种特殊的张量,形状不可以改变,但是可以改变其中的参数值。定义的方法是:
tv = tf.Variable([[1,2],[3,4]])
tv
通过.shape
可以查看形状,通过.dtype
可以查看数据类型,通过.numpy
可以转换为numpy的数组类型。
print(tv.dtype)
print(tv.shape)
print(tv.numpy)
通过.assign(数组)
的方式,可以修改变量的内容。需要注意的是,新的数组必须和旧数组的形状是一样的。
tv.assign([[2,2],[3,4]])