由于目前Anaconda没有支持arm架构的版本,在M1芯片Mac上安装的Anaconda是非常不稳定的,而且仅支持最高3.8版本的Python。而官网原生支持运行在arm架构上的Python版本为3.9.1,所以综合来讲我们只能寻找一种替代方案,那就是miniforge。
Anaconda vs Miniconda vs Miniforge
他们的核心都是包含conda这一工具,来实现 python 环境(environment) 和 包(package) 管理的,(其实不仅仅可以用来管理python,很多语言R, Java, C都支持);然后就可以通过。
Anaconda 和 Miniconda 是一个公司的产品,商用是付费的,个人暂时免费;而Miniforge是由社区主导,用GitHub托管,完全免费。Miniconda 和 Miniforge 是差不多的产物,代表着轻量化,而Anaconda是完整版,就略显臃肿。
(老手) Miniconda = Python + conda (with minimal dependencies, like openssl, ncurses…)
(新手) Anaconda = Python + conda + meta package (about 160 Python pkgs, like curl, numpy, pandas…)
简言之,Anaconda = Miniconda + more packages。Anaconda 一般还包括一个图形界面,主要是多了一些基本的包,很省事,不用再单独安装了,但也有一些可能一直用不到,白白占用了空间。Miniconda 可以按需求安装库,但也可以借助conda install anaconda手动实现anaconda一样的 pre-installed package。一个是安装初期花费更多时间下载,一个是后期花更多时间单独安装。我个人倾向于 Miniconda,一切从简。
Miniforge 使用conda-forge 作为默认 channel,而 Miniconda 使用anaconda.org 作为默认channel。conda channels (源) 是 packages 存储的位置,也即是你是从哪个来源下载这个包,对应到conda内部处理则是下载文件的链接。因为不同源会有相同名字的包,因此必须指定来源,同时安装conda的时候也会有一个默认的channel。目前主流的就是 conda-forge,齐全且更新快。
结论:
Miniforge 比 Anaconda\Miniconda 更早支持了Apple M1芯片。2022年5月6日Anaconda官方宣布原生支持了Apple M1版本。在苹果官方的Tensorflow加速训练教程中也是推荐的Miniforge。
conda package的来源在前面介绍过了,而pip的来源是 PyPI (Python Package Index)。pip是专门针对python打包而成的,属于wheels or source distributions,需要compiler来安装;而conda packages are binaries,因此包含例如C语言写的库,同时也不需要compilers。pip的没有严格的依赖冲突检查,而conda是会有严格的依赖冲突检查。
通常我们安装一个python包,直接用pip install 就行,但如果我们想要多个python环境,也就需要用到virtualenv;同时如果这个包没有不是 Python packages,是用C语言写的;这时候就需要Conda登场了,它同时解决了以上所有问题。
简言之,比较推荐的是用conda创建虚拟python环境,然后conda install pip后使用pip来安装需要的包,遇到不支持pip的,或者特殊编译的,可以根据开发者的说明使用conda进行安装。所以优先pip install,不行再conda install。
需要注意的是 pip 和 conda 安装包对象的名称可能是不一样的,例如conda - pytorch,pip - torch。
python -c "import tensorflow as tf; print(tf.config.list_physical_devices())"
正常会输出:
[PhysicalDevice(name='/physical_device:CPU:0', device_type='CPU')]
[PhysicalDevice(name='/physical_device:CPU:0', device_type='CPU'), PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')]
#! /usr/bin/env python3
import tensorflow as tf
import tensorflow_datasets as tfds
(ds_train, ds_test), ds_info = tfds.load(
'mnist',
split=['train', 'test'],
shuffle_files=True,
as_supervised=True,
with_info=True,
)
def normalize_img(image, label):
"""Normalizes images: `uint8` -> `float32`."""
return tf.cast(image, tf.float32) / 255., label
batch_size = 128
ds_train = ds_train.map(
normalize_img, num_parallel_calls=tf.data.experimental.AUTOTUNE)
ds_train = ds_train.cache()
ds_train = ds_train.shuffle(ds_info.splits['train'].num_examples)
ds_train = ds_train.batch(batch_size)
ds_train = ds_train.prefetch(tf.data.experimental.AUTOTUNE)
ds_test = ds_test.map(
normalize_img, num_parallel_calls=tf.data.experimental.AUTOTUNE)
ds_test = ds_test.batch(batch_size)
ds_test = ds_test.cache()
ds_test = ds_test.prefetch(tf.data.experimental.AUTOTUNE)
model = tf.keras.models.Sequential([
tf.keras.layers.Conv2D(32, kernel_size=(3, 3),
activation='relu'),
tf.keras.layers.Conv2D(64, kernel_size=(3, 3),
activation='relu'),
tf.keras.layers.MaxPooling2D(pool_size=(2, 2)),
# tf.keras.layers.Dropout(0.25),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(128, activation='relu'),
# tf.keras.layers.Dropout(0.5),
tf.keras.layers.Dense(10, activation='softmax')
])
model.compile(
loss='sparse_categorical_crossentropy',
optimizer=tf.keras.optimizers.Adam(0.001),
metrics=['accuracy'],
)
model.fit(
ds_train,
epochs=12,
validation_data=ds_test,
)
如果正常运行,就说明tensorflow环境已经搭建好了。
conda官网 https://docs.conda.io/projects/conda/en/latest/
下载安装Anaconda: https://www.anaconda.com/products/distribution#Downloads
下载安装Miniconda:https://docs.conda.io/en/latest/miniconda.html
下载安装Miniforge:https://conda-forge.org/miniforge