前言
许久没有写博客了,一方面毕业季忙于毕设以及一篇论文,另一个方面是开始工作了,事情就多了起来,最主要的还是自己变懒了。。。 导致九个月没有写过博客了,甚是惭愧。希望自己坚持分享自己遇到的问题,也希望能帮助到别人。
好了闲言少叙,切入正题,由于工作需要,使用mac办公,但是mac使用的是Arm架构的芯片,在不少方面都有着限制。近期就遇到了需要本地安装python环境以及GPU支持的问题。
1:问题背景
环境:
需求:
使用Anaconda安装python环境,安装TensorFlow- GPU库,跑通样例。
所需文件下载:(鼓励免费分享技术文件)
链接: https://pan.baidu.com/s/1XJ9AwuHvSpPJ3pLGCj7xVg?pwd=ru96
提取码: ru96
文件列表如下:
2: 解决方法
a: 下载并安装conda
首先需要知道的是,m1芯片使用的conda安装包和x86架构的芯片不一样,它使用的是miniforge3,可以在此处下载,也可以在我前面给出的百度网盘里下载。
进入到下载该文件的目录,然后运行下面的指令:
bash Miniforge3-MacOSX-arm64.sh
安装完成。然后是激活环境,可以先查看文件~/.zshrc
内容是否如下,如果没有该文件,或者不是这样的,则可以新建或者在该文件后面添加这段内容上去,注意路径要换成自己的安装路径。
# >>> conda initialize >>>
# !! Contents within this block are managed by 'conda init' !!
__conda_setup="$('/Users/XXXX/miniforge3/bin/conda' 'shell.zsh' 'hook' 2> /dev/null)"
if [ $? -eq 0 ]; then
eval "$__conda_setup"
else
if [ -f "/Users/XXXX/miniforge3/profile.d/conda.sh" ]; then
. "/Users/XXXX/miniforge3/etc/profile.d/conda.sh"
else
export PATH="/Users/XXXX/miniforge3/bin:$PATH"
fi
fi
unset __conda_setup
# <<< conda initialize <<<
注意:XXXX指的是你自己的路径名哈,不要搞错了。
然后再运行以下指令,激活环境:
source ~/.zshrc
或者运行另一个终端的配置文件:
~/.bash_profile文件如下:
# >>> conda initialize >>>
# !! Contents within this block are managed by 'conda init' !!
__conda_setup="$('/Users/XXXX/miniforge3/bin/conda' 'shell.bash' 'hook' 2> /dev/null)"
if [ $? -eq 0 ]; then
eval "$__conda_setup"
else
if [ -f "/Users/XXXX/miniforge3/etc/profile.d/conda.sh" ]; then
. "/Users/XXXX/miniforge3/etc/profile.d/conda.sh"
else
export PATH="/Users/XXXX/miniforge3/bin:$PATH"
fi
fi
unset __conda_setup
# <<< conda initialize <<<
注意:上一个是shell.zsh,这一个是shell.bash,激活的对象不一样。最终目的都是为了让终端可以找到conda的位置。
运行激活命令:
source ~/.bash_profile
好啦,这个时候你就可以打开终端,输入conda env list,查看安装的conda环境了。
b:安装TensorFlow-gpu
一般的安装方法是直接使用conda命令进行安装,但是安装的tensorflow不一定能用,这里采用的方法是直接使用一个配置文件,新建一个环境,环境中直接就包含了gpu版本的tensorflow,简单易行,方便可靠。
首先需要在百度网盘的链接中下载 tf39-gpu.yaml 文件,然后运行以下命令:
conda env create -f tf39-gpu.yaml
这个命令执行好,就大工告成了,简单吧。这个命令就是直接从配置文件中创建环境,需要的各种库文件都已经列好了,它就会直接安装好。
运行conda env list,就可以看到已经安装了tf39-gpu的环境了,然后conda activate tf39-gpu,激活该环境,conda list 就可以看到安装的各个库文件了。
c:测试
将下面这段代码复制到你的本地文件,然后运行该文件:
from tensorflow.keras import layers
from tensorflow.keras import models
import tensorflow as tf
import time
begin_time = time.time()
print(f"Running TensorFlow {tf.__version__} with {len(tf.config.list_physical_devices('GPU'))} GPUs recognized")
model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.Flatten())
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(10, activation='softmax'))
model.summary()
from tensorflow.keras.datasets import mnist
from tensorflow.keras.utils import to_categorical
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
train_images = train_images.reshape((60000, 28, 28, 1))
train_images = train_images.astype('float32') / 255
test_images = test_images.reshape((10000, 28, 28, 1))
test_images = test_images.astype('float32') / 255
train_labels = to_categorical(train_labels)
test_labels = to_categorical(test_labels)
model.compile(optimizer='rmsprop',
loss='categorical_crossentropy',
metrics=['accuracy'])
model.fit(train_images, train_labels, epochs=5, batch_size=64)
test_loss, test_acc = model.evaluate(test_images, test_labels)
test_acc
end_time = time.time()
print('Total time: {} s'.format(int(end_time-begin_time)))
可以看到,运行该代码时,GPU的使用率是上升的。
3: CPU版本
按理说,安装完成后就应该没啥事了,但是同样的代码我又运行了一下CPU的版本,发现CPU的更快。。。。简直离了大谱,有了GPU的加速,竟然更慢了,后来发现运行CPU时,CPU的占比要远高于GPU,如下图所示:
可能还是由于适配原因吧,对于GPU的加速和CPU之间的均衡没有做到完美。因此我也给大家提供了cpu的版本,可以在网盘上下载 tf39-cpu.yaml 文件,然后按照上述步骤安装就行。
注意
有时TensorFlow-GPU可能下载较慢导致安装失败,那么你可以找到安装时它的下载链接,直接下载那个whl文件,或者还在我分享的网盘链接中下载tensorflow_macos-2.6.0-cp39-cp39-macosx_11_0_arm64.whl 文件,然后手动安装。但是这样有可能导致安装后的Tensorflow无法使用GPU计算,这和 tensorflow-metal0.1.2 或tensorflow-estimator2.6.0 库的版本有关,你可以直接安装如上指定版本的库就行。
反正就是对照着tf39-gpu.yaml里的库文件版本进行对齐就行。
结语
许久没有写博客了,希望自己以后能坚持分享,创作出更多的优质内容。拜嘞个拜!
Reference
https://blog.csdn.net/hsywatchingu/article/details/118055508
https://github.com/conda-forge/miniforge/#download
https://makeoptim.com/deep-learning/tensorflow-metal