2025年3月25日 星期二 甲辰(龙)年 月廿四 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 软件应用 > 开发工具(IDE)

M1 Mac os(Apple Silicon)天生一对Python3开发环境搭建(集成深度学习框架Tensorflow/Pytorch)

时间:10-27来源:作者:点击数:87

笔者投入M1的怀抱已经有一段时间了,俗话说得好,但闻新人笑,不见旧人哭,Intel mac早已被束之高阁,而M1 mac已经不能用真香来形容了,简直就是“香透满堂金玉彩,扇遮半面桃花开!”,轻抚M1 mac那滑若柔荑的秒控键盘,别说996了,就是007,我们也能安之若素,也可以笑慰平生。好了,日常吹M1的环节结束,正所谓剑虽利,不厉不断,材虽美,不学不高。本次我们尝试在M1 Mac os 中搭建Python3的开发环境。

一般情况下,直接Python官网(python.org)下载最新的基于arm架构的python3.9即可,但是由于向下兼容等问题,我们尝试使用Python多版本管理软件conda,conda在业界有三大巨头分别是:Anaconda、Miniconda以及Condaforge,虽然都放出消息要适配M1芯片,但是目前最先放出稳定版的是Condaforge,进入下载页面:https://github.com/conda-forge/miniforge/#download  选择mac arm64位架构:

该文件并不是安装包,而是一个shell脚本,下载成功后,进入命令行目录:

  • cd ~/Downloads

执行命令进行安装:

  • sudo bash ./Miniforge3-MacOSX-arm64.sh

随后会有一些条款需要确认,这里按回车之后键入yes:

  • Welcome to Miniforge3 4.9.2-7
  • In order to continue the installation process, please review the license
  • agreement.
  • Please, press ENTER to continue
  • >>>
  • BSD 3-clause license
  • Copyright (c) 2019-2020, conda-forge
  • All rights reserved.
  • Redistribution and use in source and binary forms, with or without
  • modification, are permitted provided that the following conditions are met:
  • 1. Redistributions of source code must retain the above copyright notice, this
  • list of conditions and the following disclaimer.
  • 2. Redistributions in binary form must reproduce the above copyright notice,
  • this list of conditions and the following disclaimer in the documentation
  • and/or other materials provided with the distribution.
  • 3. Neither the name of the copyright holder nor the names of its contributors
  • may be used to endorse or promote products derived from this software without
  • specific prior written permission.
  • THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
  • ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
  • WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  • DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
  • FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  • DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
  • SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  • CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  • OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  • OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  • Do you accept the license terms? [yes|no]
  • [no] >>> yes

安装的默认版本还是3.9,会附带安装35个基础库,这样就不用我们自己手动安装了:

  • brotlipy 0.7.0 py39h46acfd9_1001 installed
  • bzip2 1.0.8 h27ca646_4 installed
  • ca-certificates 2020.12.5 h4653dfc_0 installed
  • certifi 2020.12.5 py39h2804cbe_1 installed
  • cffi 1.14.5 py39h702c04f_0 installed
  • chardet 4.0.0 py39h2804cbe_1 installed
  • conda 4.9.2 py39h2804cbe_0 installed
  • conda-package-handling 1.7.2 py39h51e6412_0 installed
  • cryptography 3.4.4 py39h6e07874_0 installed
  • idna 2.10 pyh9f0ad1d_0 installed
  • libcxx 11.0.1 h168391b_0 installed
  • libffi 3.3 h9f76cd9_2 installed
  • ncurses 6.2 h9aa5885_4 installed
  • openssl 1.1.1j h27ca646_0 installed
  • pip 21.0.1 pyhd8ed1ab_0 installed
  • pycosat 0.6.3 py39h46acfd9_1006 installed
  • pycparser 2.20 pyh9f0ad1d_2 installed
  • pyopenssl 20.0.1 pyhd8ed1ab_0 installed
  • pysocks 1.7.1 py39h2804cbe_3 installed
  • python 3.9.2 hcbd9b3a_0_cpython installed
  • python_abi 3.9 1_cp39 installed
  • readline 8.0 hc8eb9b7_2 installed
  • requests 2.25.1 pyhd3deb0d_0 installed
  • ruamel_yaml 0.15.80 py39h46acfd9_1004 installed
  • setuptools 49.6.0 py39h2804cbe_3 installed
  • six 1.15.0 pyh9f0ad1d_0 installed
  • sqlite 3.34.0 h6d56c25_0 installed
  • tk 8.6.10 hf7e6567_1 installed
  • tqdm 4.57.0 pyhd8ed1ab_0 installed
  • tzdata 2021a he74cb21_0 installed
  • urllib3 1.26.3 pyhd8ed1ab_0 installed
  • wheel 0.36.2 pyhd3deb0d_0 installed
  • xz 5.2.5 h642e427_1 installed
  • yaml 0.2.5 h642e427_0 installed
  • zlib 1.2.11 h31e879b_1009 installed

然后编辑配置文件vim  ~/.zshrc,加入如下内容(此处liuyue是笔者用户名,需改成你的Mac当前用户名):

  • path=('/Users/liuyue/miniforge3/bin' $path)
  • export PATH

存盘之后执行命令:

  • source ~/.zshrc

配置好环境变量之后,键入python3:

  • ➜ ~ python3
  • Python 3.9.2 | packaged by conda-forge | (default, Feb 21 2021, 05:00:30)
  • [Clang 11.0.1 ] on darwin
  • Type "help", "copyright", "credits" or "license" for more information.
  • >>>

可以看到已经使用conda安装的python版本了。

这里简单介绍一下conda命令:

conda info 可以查看当前conda的基本信息内核,平台,下载源以及目录位置:

  • ~ conda info
  • active environment : None
  • user config file : /Users/liuyue/.condarc
  • populated config files : /Users/liuyue/miniforge3/.condarc
  • conda version : 4.9.2
  • conda-build version : not installed
  • python version : 3.9.2.final.0
  • virtual packages : __osx=11.2.2=0
  • __unix=0=0
  • __archspec=1=arm64
  • base environment : /Users/liuyue/miniforge3 (read only)
  • channel URLs : https://conda.anaconda.org/conda-forge/osx-arm64
  • https://conda.anaconda.org/conda-forge/noarch
  • package cache : /Users/liuyue/miniforge3/pkgs
  • /Users/liuyue/.conda/pkgs
  • envs directories : /Users/liuyue/.conda/envs
  • /Users/liuyue/miniforge3/envs
  • platform : osx-arm64
  • user-agent : conda/4.9.2 requests/2.25.1 CPython/3.9.2 Darwin/20.3.0 OSX/11.2.2
  • UID:GID : 502:20
  • netrc file : None
  • offline mode : False

由于一些众所周知的学术问题,我们需要配置一下国内下载源:

  • conda config --add channels https://mirrors.ustc.edu.cn/anaconda/pkgs/main/
  • conda config --add channels https://mirrors.ustc.edu.cn/anaconda/pkgs/free/
  • conda config --add channels https://mirrors.ustc.edu.cn/anaconda/cloud/conda-forge/
  • conda config --add channels https://mirrors.ustc.edu.cn/anaconda/cloud/msys2/
  • conda config --add channels https://mirrors.ustc.edu.cn/anaconda/cloud/bioconda/
  • conda config --add channels https://mirrors.ustc.edu.cn/anaconda/cloud/menpo/
  • conda config --set show_channel_urls yes

随后查看当前下载源:

  • conda config --show

可以看到国内源已经被添加进去了:

  • channel_priority: flexible
  • channels:
  • - https://mirrors.ustc.edu.cn/anaconda/cloud/menpo/
  • - https://mirrors.ustc.edu.cn/anaconda/cloud/bioconda/
  • - https://mirrors.ustc.edu.cn/anaconda/cloud/msys2/
  • - https://mirrors.ustc.edu.cn/anaconda/cloud/conda-forge/
  • - https://mirrors.ustc.edu.cn/anaconda/pkgs/free/
  • - https://mirrors.ustc.edu.cn/anaconda/pkgs/main/
  • - defaults
  • - conda-forge
  • client_ssl_cert: None

其他的一些conda常用命令:

1. conda --version #查看conda版本,验证是否安装

2. conda update conda #更新至最新版本,也会更新其它相关包

3. conda update --all #更新所有包

4. conda update package_name #更新指定的包

5. conda create -n env_name package_name #创建名为env_name的新环境,并在该环境下安装名为package_name 的包,可以指定新环境的版本号,例如:conda create -n python2 python=python2.7 numpy pandas,创建了python2环境,python版本为2.7,同时还安装了numpy pandas包

6. source activate env_name #切换至env_name环境

7. source deactivate #退出环境

8. conda info -e #显示所有已经创建的环境

9. conda create --name new_env_name --clone old_env_name #复制old_env_name为new_env_name

10. conda remove --name env_name –all #删除环境

11. conda list #查看所有已经安装的包

12. conda install package_name #在当前环境中安装包

13. conda install --name env_name package_name #在指定环境中安装包

14. conda remove -- name env_name package #删除指定环境中的包

15. conda remove package #删除当前环境中的包

16. conda create -n tensorflow_env tensorflow

conda activate tensorflow_env #conda 安装tensorflow的CPU版本

17. conda create -n tensorflow_gpuenv tensorflow-gpu

conda activate tensorflow_gpuenv #conda安装tensorflow的GPU版本

18. conda env remove -n env_name #采用第10条的方法删除环境失败时,可采用这种方法

接着我们来尝试集成深度学习框架Tensorflow,由于目前默认是3.9,我们使用conda创建一个3.8的虚拟开发环境:

  • sudo conda create -n py38 python=3.8

安装成功后,输入命令:

  • conda info -e

就可以查看当前conda安装的所有版本:

  • ➜ ~ conda info -e
  • # conda environments:
  • #
  • base * /Users/liuyue/miniforge3
  • py38 /Users/liuyue/miniforge3/envs/py38

可以看到一个默认的3.9环境,和新装的3.8环境,星号代表当前所处的环境,这里我们切换到3.8:

  • conda activate py38

此时环境已经切换到3.8:

  • (py38) ➜ ~ conda activate py38
  • (py38) ➜ ~ conda info -e
  • # conda environments:
  • #
  • base /Users/liuyue/miniforge3
  • py38 * /Users/liuyue/miniforge3/envs/py38
  • (py38) ➜ ~

下面开启深度学习框架Tensorflow之旅,由于苹果对m1芯片单独做了适配,所以不能用以前的pip方式直接进行安装,需要单独下载文件:https://github.com/apple/tensorflow_macos/releases/download/v0.1alpha1/tensorflow_macos-0.1alpha1.tar.gz

解压文件:

  • tar -zxvf tensorflow_macos-0.1alpha1.tar.gz

解压后进入目录(一定要进入arm64的文件内):

  • cd tensorflow_macos/arm64

执行命令利用下载的arm64内核安装包进行安装:

  • pip install --force pip==20.2.4 wheel setuptools cached-property six
  • pip install --upgrade --no-dependencies --force numpy-1.18.5-cp38-cp38-macosx_11_0_arm64.whl grpcio-1.33.2-cp38-cp38-macosx_11_0_arm64.whl h5py-2.10.0-cp38-cp38-macosx_11_0_arm64.whl tensorflow_addons-0.11.2+mlcompute-cp38-cp38-macosx_11_0_arm64.whl
  • pip install absl-py astunparse flatbuffers gast google_pasta keras_preprocessing opt_einsum protobuf tensorflow_estimator termcolor typing_extensions wrapt wheel tensorboard typeguard
  • pip install --upgrade --force --no-dependencies tensorflow_macos-0.1a1-cp38-cp38-macosx_11_0_arm64.whl

安装成功后,测试一下:

  • (py38) ➜ arm64 python
  • Python 3.8.8 | packaged by conda-forge | (default, Feb 20 2021, 15:50:57)
  • [Clang 11.0.1 ] on darwin
  • Type "help", "copyright", "credits" or "license" for more information.
  • >>> import tensorflow
  • >>>

没有任何问题。

下面我们来测试一下M1通过Tensorflow训练模型的效率,还记得衣香鬓影的“机械姬”吗:人工智能不过尔尔,基于Python3深度学习库Keras/TensorFlow打造属于自己的聊天机器人(ChatRobot)

编写my_chat.py:

  • import nltk
  • import ssl
  • from nltk.stem.lancaster import LancasterStemmer
  • stemmer = LancasterStemmer()
  • import numpy as np
  • from tensorflow.keras.models import Sequential
  • from tensorflow.keras.layers import Dense, Activation, Dropout
  • from tensorflow.keras.optimizers import SGD
  • import pandas as pd
  • import pickle
  • import random
  • words = []
  • classes = []
  • documents = []
  • ignore_words = ['?']
  • # loop through each sentence in our intents patterns
  • intents = {"intents": [
  • {"tag": "打招呼",
  • "patterns": ["你好", "您好", "请问", "有人吗", "师傅","不好意思","美女","帅哥","靓妹"],
  • "responses": ["您好", "又是您啊", "吃了么您内","您有事吗"],
  • "context": [""]
  • },
  • {"tag": "告别",
  • "patterns": ["再见", "拜拜", "88", "回见", "回头见"],
  • "responses": ["再见", "一路顺风", "下次见", "拜拜了您内"],
  • "context": [""]
  • },
  • ]
  • }
  • for intent in intents['intents']:
  • for pattern in intent['patterns']:
  • # tokenize each word in the sentence
  • w = nltk.word_tokenize(pattern)
  • # add to our words list
  • words.extend(w)
  • # add to documents in our corpus
  • documents.append((w, intent['tag']))
  • # add to our classes list
  • if intent['tag'] not in classes:
  • classes.append(intent['tag'])
  • # stem and lower each word and remove duplicates
  • words = [stemmer.stem(w.lower()) for w in words if w not in ignore_words]
  • words = sorted(list(set(words)))
  • # sort classes
  • classes = sorted(list(set(classes)))
  • # documents = combination between patterns and intents
  • # print (len(documents), "documents")
  • # # classes = intents
  • # print (len(classes), "语境", classes)
  • # # words = all words, vocabulary
  • # print (len(words), "词数", words)
  • # create our training data
  • training = []
  • # create an empty array for our output
  • output_empty = [0] * len(classes)
  • # training set, bag of words for each sentence
  • for doc in documents:
  • # initialize our bag of words
  • bag = []
  • pattern_words = doc[0]
  • pattern_words = [stemmer.stem(word.lower()) for word in pattern_words]
  • for w in words:
  • bag.append(1) if w in pattern_words else bag.append(0)
  • output_row = list(output_empty)
  • output_row[classes.index(doc[1])] = 1
  • training.append([bag, output_row])
  • random.shuffle(training)
  • training = np.array(training)
  • train_x = list(training[:,0])
  • train_y = list(training[:,1])
  • model = Sequential()
  • model.add(Dense(128, input_shape=(len(train_x[0]),), activation='relu'))
  • model.add(Dropout(0.5))
  • model.add(Dense(64, activation='relu'))
  • model.add(Dropout(0.5))
  • model.add(Dense(len(train_y[0]), activation='softmax'))
  • sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
  • model.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy'])
  • model.fit(np.array(train_x), np.array(train_y), epochs=200, batch_size=5, verbose=1)
  • def clean_up_sentence(sentence):
  • # tokenize the pattern - split words into array
  • sentence_words = nltk.word_tokenize(sentence)
  • # stem each word - create short form for word
  • sentence_words = [stemmer.stem(word.lower()) for word in sentence_words]
  • return sentence_words
  • # return bag of words array: 0 or 1 for each word in the bag that exists in the sentence
  • def bow(sentence, words, show_details=True):
  • # tokenize the pattern
  • sentence_words = clean_up_sentence(sentence)
  • # bag of words - matrix of N words, vocabulary matrix
  • bag = [0]*len(words)
  • for s in sentence_words:
  • for i,w in enumerate(words):
  • if w == s:
  • # assign 1 if current word is in the vocabulary position
  • bag[i] = 1
  • if show_details:
  • print ("found in bag: %s" % w)
  • return(np.array(bag))
  • def classify_local(sentence):
  • ERROR_THRESHOLD = 0.25
  • # generate probabilities from the model
  • input_data = pd.DataFrame([bow(sentence, words)], dtype=float, index=['input'])
  • results = model.predict([input_data])[0]
  • # filter out predictions below a threshold, and provide intent index
  • results = [[i,r] for i,r in enumerate(results) if r>ERROR_THRESHOLD]
  • # sort by strength of probability
  • results.sort(key=lambda x: x[1], reverse=True)
  • return_list = []
  • for r in results:
  • return_list.append((classes[r[0]], str(r[1])))
  • # return tuple of intent and probability
  • return return_list
  • p = bow("你好", words)
  • print (p)
  • print(classify_local('请问'))

返回结果:

  • (py38) mytornado git:(master) python3 test_mychat.py
  • 2021-03-03 22:43:21.059383: I tensorflow/compiler/mlir/mlir_graph_optimization_pass.cc:116] None of the MLIR optimization passes are enabled (registered 2)
  • 2021-03-03 22:43:21.059529: W tensorflow/core/platform/profile_utils/cpu_utils.cc:126] Failed to get CPU frequency: 0 Hz
  • Epoch 1/200
  • 3/3 [==============================] - 0s 570us/step - loss: 0.6966 - accuracy: 0.5750
  • Epoch 2/200
  • 3/3 [==============================] - 0s 482us/step - loss: 0.6913 - accuracy: 0.4857
  • Epoch 3/200
  • 3/3 [==============================] - 0s 454us/step - loss: 0.6795 - accuracy: 0.4750
  • Epoch 4/200
  • 3/3 [==============================] - 0s 434us/step - loss: 0.6913 - accuracy: 0.4750
  • Epoch 5/200
  • 3/3 [==============================] - 0s 417us/step - loss: 0.6563 - accuracy: 0.5107
  • Epoch 6/200
  • 3/3 [==============================] - 0s 454us/step - loss: 0.6775 - accuracy: 0.5714
  • Epoch 7/200
  • 3/3 [==============================] - 0s 418us/step - loss: 0.6582 - accuracy: 0.6964
  • Epoch 8/200
  • 3/3 [==============================] - 0s 487us/step - loss: 0.6418 - accuracy: 0.8071
  • Epoch 9/200
  • 3/3 [==============================] - 0s 504us/step - loss: 0.6055 - accuracy: 0.6964
  • Epoch 10/200
  • 3/3 [==============================] - 0s 457us/step - loss: 0.5933 - accuracy: 0.6964
  • Epoch 11/200
  • 3/3 [==============================] - 0s 392us/step - loss: 0.6679 - accuracy: 0.5714
  • Epoch 12/200
  • 3/3 [==============================] - 0s 427us/step - loss: 0.6060 - accuracy: 0.7464
  • Epoch 13/200
  • 3/3 [==============================] - 0s 425us/step - loss: 0.6677 - accuracy: 0.5964
  • Epoch 14/200
  • 3/3 [==============================] - 0s 420us/step - loss: 0.6208 - accuracy: 0.6214
  • Epoch 15/200
  • 3/3 [==============================] - 0s 401us/step - loss: 0.6315 - accuracy: 0.6714
  • Epoch 16/200
  • 3/3 [==============================] - 0s 401us/step - loss: 0.6718 - accuracy: 0.6464
  • Epoch 17/200
  • 3/3 [==============================] - 0s 386us/step - loss: 0.6407 - accuracy: 0.6714
  • Epoch 18/200
  • 3/3 [==============================] - 0s 505us/step - loss: 0.6031 - accuracy: 0.6464
  • Epoch 19/200
  • 3/3 [==============================] - 0s 407us/step - loss: 0.6245 - accuracy: 0.6214
  • Epoch 20/200
  • 3/3 [==============================] - 0s 422us/step - loss: 0.5805 - accuracy: 0.6964
  • Epoch 21/200
  • 3/3 [==============================] - 0s 379us/step - loss: 0.6923 - accuracy: 0.5464
  • Epoch 22/200
  • 3/3 [==============================] - 0s 396us/step - loss: 0.6383 - accuracy: 0.5714
  • Epoch 23/200
  • 3/3 [==============================] - 0s 427us/step - loss: 0.6628 - accuracy: 0.5714
  • Epoch 24/200
  • 3/3 [==============================] - 0s 579us/step - loss: 0.6361 - accuracy: 0.5964
  • Epoch 25/200
  • 3/3 [==============================] - 0s 378us/step - loss: 0.5632 - accuracy: 0.7214
  • Epoch 26/200
  • 3/3 [==============================] - 0s 387us/step - loss: 0.6851 - accuracy: 0.5214
  • Epoch 27/200
  • 3/3 [==============================] - 0s 393us/step - loss: 0.6012 - accuracy: 0.6214
  • Epoch 28/200
  • 3/3 [==============================] - 0s 392us/step - loss: 0.6470 - accuracy: 0.5964
  • Epoch 29/200
  • 3/3 [==============================] - 0s 348us/step - loss: 0.6346 - accuracy: 0.6214
  • Epoch 30/200
  • 3/3 [==============================] - 0s 362us/step - loss: 0.6350 - accuracy: 0.4964
  • Epoch 31/200
  • 3/3 [==============================] - 0s 369us/step - loss: 0.5842 - accuracy: 0.5964
  • Epoch 32/200
  • 3/3 [==============================] - 0s 481us/step - loss: 0.5279 - accuracy: 0.7214
  • Epoch 33/200
  • 3/3 [==============================] - 0s 439us/step - loss: 0.5956 - accuracy: 0.7321
  • Epoch 34/200
  • 3/3 [==============================] - 0s 355us/step - loss: 0.5570 - accuracy: 0.6964
  • Epoch 35/200
  • 3/3 [==============================] - 0s 385us/step - loss: 0.5546 - accuracy: 0.8071
  • Epoch 36/200
  • 3/3 [==============================] - 0s 375us/step - loss: 0.5616 - accuracy: 0.6714
  • Epoch 37/200
  • 3/3 [==============================] - 0s 379us/step - loss: 0.6955 - accuracy: 0.6464
  • Epoch 38/200
  • 3/3 [==============================] - 0s 389us/step - loss: 0.6089 - accuracy: 0.7321
  • Epoch 39/200
  • 3/3 [==============================] - 0s 375us/step - loss: 0.5377 - accuracy: 0.6714
  • Epoch 40/200
  • 3/3 [==============================] - 0s 392us/step - loss: 0.6224 - accuracy: 0.7179
  • Epoch 41/200
  • 3/3 [==============================] - 0s 379us/step - loss: 0.6234 - accuracy: 0.5464
  • Epoch 42/200
  • 3/3 [==============================] - 0s 411us/step - loss: 0.5224 - accuracy: 0.8321
  • Epoch 43/200
  • 3/3 [==============================] - 0s 386us/step - loss: 0.5848 - accuracy: 0.5964
  • Epoch 44/200
  • 3/3 [==============================] - 0s 401us/step - loss: 0.4620 - accuracy: 0.8679
  • Epoch 45/200
  • 3/3 [==============================] - 0s 365us/step - loss: 0.4664 - accuracy: 0.8071
  • Epoch 46/200
  • 3/3 [==============================] - 0s 367us/step - loss: 0.5904 - accuracy: 0.7679
  • Epoch 47/200
  • 3/3 [==============================] - 0s 359us/step - loss: 0.5111 - accuracy: 0.7929
  • Epoch 48/200
  • 3/3 [==============================] - 0s 363us/step - loss: 0.4712 - accuracy: 0.8679
  • Epoch 49/200
  • 3/3 [==============================] - 0s 401us/step - loss: 0.5601 - accuracy: 0.8071
  • Epoch 50/200
  • 3/3 [==============================] - 0s 429us/step - loss: 0.4884 - accuracy: 0.7929
  • Epoch 51/200
  • 3/3 [==============================] - 0s 377us/step - loss: 0.5137 - accuracy: 0.8286
  • Epoch 52/200
  • 3/3 [==============================] - 0s 368us/step - loss: 0.5475 - accuracy: 0.8286
  • Epoch 53/200
  • 3/3 [==============================] - 0s 592us/step - loss: 0.4077 - accuracy: 0.8536
  • Epoch 54/200
  • 3/3 [==============================] - 0s 400us/step - loss: 0.5367 - accuracy: 0.8179
  • Epoch 55/200
  • 3/3 [==============================] - 0s 399us/step - loss: 0.5288 - accuracy: 0.8429
  • Epoch 56/200
  • 3/3 [==============================] - 0s 367us/step - loss: 0.5775 - accuracy: 0.6964
  • Epoch 57/200
  • 3/3 [==============================] - 0s 372us/step - loss: 0.5680 - accuracy: 0.6821
  • Epoch 58/200
  • 3/3 [==============================] - 0s 360us/step - loss: 0.5164 - accuracy: 0.7321
  • Epoch 59/200
  • 3/3 [==============================] - 0s 364us/step - loss: 0.5334 - accuracy: 0.6571
  • Epoch 60/200
  • 3/3 [==============================] - 0s 358us/step - loss: 0.3858 - accuracy: 0.9036
  • Epoch 61/200
  • 3/3 [==============================] - 0s 356us/step - loss: 0.4313 - accuracy: 0.8679
  • Epoch 62/200
  • 3/3 [==============================] - 0s 373us/step - loss: 0.5017 - accuracy: 0.8429
  • Epoch 63/200
  • 3/3 [==============================] - 0s 346us/step - loss: 0.4649 - accuracy: 0.8429
  • Epoch 64/200
  • 3/3 [==============================] - 0s 397us/step - loss: 0.3804 - accuracy: 0.8893
  • Epoch 65/200
  • 3/3 [==============================] - 0s 361us/step - loss: 0.5030 - accuracy: 0.7929
  • Epoch 66/200
  • 3/3 [==============================] - 0s 372us/step - loss: 0.3958 - accuracy: 0.9286
  • Epoch 67/200
  • 3/3 [==============================] - 0s 345us/step - loss: 0.4240 - accuracy: 0.8536
  • Epoch 68/200
  • 3/3 [==============================] - 0s 360us/step - loss: 0.4651 - accuracy: 0.7929
  • Epoch 69/200
  • 3/3 [==============================] - 0s 376us/step - loss: 0.4687 - accuracy: 0.7571
  • Epoch 70/200
  • 3/3 [==============================] - 0s 398us/step - loss: 0.4660 - accuracy: 0.8429
  • Epoch 71/200
  • 3/3 [==============================] - 0s 368us/step - loss: 0.3960 - accuracy: 0.9393
  • Epoch 72/200
  • 3/3 [==============================] - 0s 355us/step - loss: 0.5523 - accuracy: 0.6071
  • Epoch 73/200
  • 3/3 [==============================] - 0s 361us/step - loss: 0.5266 - accuracy: 0.7821
  • Epoch 74/200
  • 3/3 [==============================] - 0s 371us/step - loss: 0.4245 - accuracy: 0.9643
  • Epoch 75/200
  • 3/3 [==============================] - 0s 367us/step - loss: 0.5024 - accuracy: 0.7786
  • Epoch 76/200
  • 3/3 [==============================] - 0s 453us/step - loss: 0.3419 - accuracy: 0.9393
  • Epoch 77/200
  • 3/3 [==============================] - 0s 405us/step - loss: 0.4930 - accuracy: 0.7429
  • Epoch 78/200
  • 3/3 [==============================] - 0s 672us/step - loss: 0.3443 - accuracy: 0.9036
  • Epoch 79/200
  • 3/3 [==============================] - 0s 386us/step - loss: 0.3864 - accuracy: 0.8893
  • Epoch 80/200
  • 3/3 [==============================] - 0s 386us/step - loss: 0.3863 - accuracy: 0.9286
  • Epoch 81/200
  • 3/3 [==============================] - 0s 391us/step - loss: 0.2771 - accuracy: 0.8679
  • Epoch 82/200
  • 3/3 [==============================] - 0s 370us/step - loss: 0.6083 - accuracy: 0.5571
  • Epoch 83/200
  • 3/3 [==============================] - 0s 387us/step - loss: 0.2801 - accuracy: 0.9393
  • Epoch 84/200
  • 3/3 [==============================] - 0s 357us/step - loss: 0.2483 - accuracy: 0.9286
  • Epoch 85/200
  • 3/3 [==============================] - 0s 355us/step - loss: 0.2511 - accuracy: 0.9643
  • Epoch 86/200
  • 3/3 [==============================] - 0s 339us/step - loss: 0.3410 - accuracy: 0.8893
  • Epoch 87/200
  • 3/3 [==============================] - 0s 361us/step - loss: 0.3432 - accuracy: 0.9036
  • Epoch 88/200
  • 3/3 [==============================] - 0s 347us/step - loss: 0.3819 - accuracy: 0.8893
  • Epoch 89/200
  • 3/3 [==============================] - 0s 361us/step - loss: 0.5142 - accuracy: 0.7179
  • Epoch 90/200
  • 3/3 [==============================] - 0s 502us/step - loss: 0.3055 - accuracy: 0.9393
  • Epoch 91/200
  • 3/3 [==============================] - 0s 377us/step - loss: 0.3144 - accuracy: 0.8536
  • Epoch 92/200
  • 3/3 [==============================] - 0s 376us/step - loss: 0.3712 - accuracy: 0.9036
  • Epoch 93/200
  • 3/3 [==============================] - 0s 389us/step - loss: 0.1974 - accuracy: 0.9393
  • Epoch 94/200
  • 3/3 [==============================] - 0s 365us/step - loss: 0.3128 - accuracy: 0.9393
  • Epoch 95/200
  • 3/3 [==============================] - 0s 376us/step - loss: 0.2194 - accuracy: 1.0000
  • Epoch 96/200
  • 3/3 [==============================] - 0s 377us/step - loss: 0.1994 - accuracy: 1.0000
  • Epoch 97/200
  • 3/3 [==============================] - 0s 360us/step - loss: 0.1734 - accuracy: 0.9643
  • Epoch 98/200
  • 3/3 [==============================] - 0s 367us/step - loss: 0.1786 - accuracy: 1.0000
  • Epoch 99/200
  • 3/3 [==============================] - 0s 358us/step - loss: 0.4158 - accuracy: 0.8286
  • Epoch 100/200
  • 3/3 [==============================] - 0s 354us/step - loss: 0.3131 - accuracy: 0.7571
  • Epoch 101/200
  • 3/3 [==============================] - 0s 350us/step - loss: 0.1953 - accuracy: 0.8893
  • Epoch 102/200
  • 3/3 [==============================] - 0s 403us/step - loss: 0.2577 - accuracy: 0.8429
  • Epoch 103/200
  • 3/3 [==============================] - 0s 417us/step - loss: 0.2648 - accuracy: 0.8893
  • Epoch 104/200
  • 3/3 [==============================] - 0s 377us/step - loss: 0.2901 - accuracy: 0.8286
  • Epoch 105/200
  • 3/3 [==============================] - 0s 383us/step - loss: 0.2822 - accuracy: 0.9393
  • Epoch 106/200
  • 3/3 [==============================] - 0s 381us/step - loss: 0.2837 - accuracy: 0.9036
  • Epoch 107/200
  • 3/3 [==============================] - 0s 382us/step - loss: 0.3064 - accuracy: 0.8536
  • Epoch 108/200
  • 3/3 [==============================] - 0s 352us/step - loss: 0.3376 - accuracy: 0.9036
  • Epoch 109/200
  • 3/3 [==============================] - 0s 376us/step - loss: 0.3412 - accuracy: 0.8536
  • Epoch 110/200
  • 3/3 [==============================] - 0s 363us/step - loss: 0.1718 - accuracy: 1.0000
  • Epoch 111/200
  • 3/3 [==============================] - 0s 347us/step - loss: 0.1899 - accuracy: 0.8786
  • Epoch 112/200
  • 3/3 [==============================] - 0s 363us/step - loss: 0.2352 - accuracy: 0.8286
  • Epoch 113/200
  • 3/3 [==============================] - 0s 373us/step - loss: 0.1378 - accuracy: 1.0000
  • Epoch 114/200
  • 3/3 [==============================] - 0s 353us/step - loss: 0.4288 - accuracy: 0.7071
  • Epoch 115/200
  • 3/3 [==============================] - 0s 456us/step - loss: 0.4202 - accuracy: 0.6821
  • Epoch 116/200
  • 3/3 [==============================] - 0s 382us/step - loss: 0.2962 - accuracy: 0.8893
  • Epoch 117/200
  • 3/3 [==============================] - 0s 394us/step - loss: 0.2571 - accuracy: 0.8893
  • Epoch 118/200
  • 3/3 [==============================] - 0s 365us/step - loss: 0.2697 - accuracy: 1.0000
  • Epoch 119/200
  • 3/3 [==============================] - 0s 358us/step - loss: 0.3102 - accuracy: 0.9036
  • Epoch 120/200
  • 3/3 [==============================] - 0s 367us/step - loss: 0.2928 - accuracy: 0.8286
  • Epoch 121/200
  • 3/3 [==============================] - 0s 374us/step - loss: 0.3157 - accuracy: 0.8286
  • Epoch 122/200
  • 3/3 [==============================] - 0s 381us/step - loss: 0.3920 - accuracy: 0.7786
  • Epoch 123/200
  • 3/3 [==============================] - 0s 335us/step - loss: 0.2090 - accuracy: 0.9036
  • Epoch 124/200
  • 3/3 [==============================] - 0s 368us/step - loss: 0.5079 - accuracy: 0.7786
  • Epoch 125/200
  • 3/3 [==============================] - 0s 337us/step - loss: 0.1900 - accuracy: 0.9393
  • Epoch 126/200
  • 3/3 [==============================] - 0s 339us/step - loss: 0.2047 - accuracy: 0.9643
  • Epoch 127/200
  • 3/3 [==============================] - 0s 479us/step - loss: 0.3705 - accuracy: 0.7679
  • Epoch 128/200
  • 3/3 [==============================] - 0s 390us/step - loss: 0.1850 - accuracy: 0.9036
  • Epoch 129/200
  • 3/3 [==============================] - 0s 642us/step - loss: 0.1594 - accuracy: 0.9393
  • Epoch 130/200
  • 3/3 [==============================] - 0s 373us/step - loss: 0.2010 - accuracy: 0.8893
  • Epoch 131/200
  • 3/3 [==============================] - 0s 369us/step - loss: 0.0849 - accuracy: 1.0000
  • Epoch 132/200
  • 3/3 [==============================] - 0s 349us/step - loss: 0.1145 - accuracy: 1.0000
  • Epoch 133/200
  • 3/3 [==============================] - 0s 360us/step - loss: 0.1796 - accuracy: 1.0000
  • Epoch 134/200
  • 3/3 [==============================] - 0s 371us/step - loss: 0.2363 - accuracy: 0.8536
  • Epoch 135/200
  • 3/3 [==============================] - 0s 386us/step - loss: 0.1922 - accuracy: 0.9393
  • Epoch 136/200
  • 3/3 [==============================] - 0s 369us/step - loss: 0.3595 - accuracy: 0.7679
  • Epoch 137/200
  • 3/3 [==============================] - 0s 369us/step - loss: 0.1506 - accuracy: 0.8893
  • Epoch 138/200
  • 3/3 [==============================] - 0s 377us/step - loss: 0.2471 - accuracy: 0.8536
  • Epoch 139/200
  • 3/3 [==============================] - 0s 417us/step - loss: 0.1768 - accuracy: 0.8536
  • Epoch 140/200
  • 3/3 [==============================] - 0s 400us/step - loss: 0.2112 - accuracy: 0.9393
  • Epoch 141/200
  • 3/3 [==============================] - 0s 377us/step - loss: 0.3652 - accuracy: 0.7179
  • Epoch 142/200
  • 3/3 [==============================] - 0s 364us/step - loss: 0.3007 - accuracy: 0.8429
  • Epoch 143/200
  • 3/3 [==============================] - 0s 361us/step - loss: 0.0518 - accuracy: 1.0000
  • Epoch 144/200
  • 3/3 [==============================] - 0s 373us/step - loss: 0.2144 - accuracy: 0.8286
  • Epoch 145/200
  • 3/3 [==============================] - 0s 353us/step - loss: 0.0888 - accuracy: 1.0000
  • Epoch 146/200
  • 3/3 [==============================] - 0s 361us/step - loss: 0.1267 - accuracy: 1.0000
  • Epoch 147/200
  • 3/3 [==============================] - 0s 341us/step - loss: 0.0321 - accuracy: 1.0000
  • Epoch 148/200
  • 3/3 [==============================] - 0s 358us/step - loss: 0.0860 - accuracy: 1.0000
  • Epoch 149/200
  • 3/3 [==============================] - 0s 375us/step - loss: 0.2151 - accuracy: 0.8893
  • Epoch 150/200
  • 3/3 [==============================] - 0s 351us/step - loss: 0.1592 - accuracy: 1.0000
  • Epoch 151/200
  • 3/3 [==============================] - 0s 531us/step - loss: 0.1450 - accuracy: 0.8786
  • Epoch 152/200
  • 3/3 [==============================] - 0s 392us/step - loss: 0.1813 - accuracy: 0.9036
  • Epoch 153/200
  • 3/3 [==============================] - 0s 404us/step - loss: 0.1197 - accuracy: 1.0000
  • Epoch 154/200
  • 3/3 [==============================] - 0s 367us/step - loss: 0.0930 - accuracy: 1.0000
  • Epoch 155/200
  • 3/3 [==============================] - 0s 580us/step - loss: 0.2587 - accuracy: 0.8893
  • Epoch 156/200
  • 3/3 [==============================] - 0s 383us/step - loss: 0.0742 - accuracy: 1.0000
  • Epoch 157/200
  • 3/3 [==============================] - 0s 353us/step - loss: 0.1197 - accuracy: 0.9643
  • Epoch 158/200
  • 3/3 [==============================] - 0s 371us/step - loss: 0.1716 - accuracy: 0.8536
  • Epoch 159/200
  • 3/3 [==============================] - 0s 337us/step - loss: 0.1300 - accuracy: 0.9643
  • Epoch 160/200
  • 3/3 [==============================] - 0s 347us/step - loss: 0.1439 - accuracy: 0.9393
  • Epoch 161/200
  • 3/3 [==============================] - 0s 366us/step - loss: 0.2597 - accuracy: 0.9393
  • Epoch 162/200
  • 3/3 [==============================] - 0s 345us/step - loss: 0.1605 - accuracy: 0.8893
  • Epoch 163/200
  • 3/3 [==============================] - 0s 468us/step - loss: 0.0437 - accuracy: 1.0000
  • Epoch 164/200
  • 3/3 [==============================] - 0s 372us/step - loss: 0.0376 - accuracy: 1.0000
  • Epoch 165/200
  • 3/3 [==============================] - 0s 391us/step - loss: 0.0474 - accuracy: 1.0000
  • Epoch 166/200
  • 3/3 [==============================] - 0s 378us/step - loss: 0.3225 - accuracy: 0.7786
  • Epoch 167/200
  • 3/3 [==============================] - 0s 368us/step - loss: 0.0770 - accuracy: 1.0000
  • Epoch 168/200
  • 3/3 [==============================] - 0s 367us/step - loss: 0.5629 - accuracy: 0.7786
  • Epoch 169/200
  • 3/3 [==============================] - 0s 359us/step - loss: 0.0177 - accuracy: 1.0000
  • Epoch 170/200
  • 3/3 [==============================] - 0s 370us/step - loss: 0.1167 - accuracy: 1.0000
  • Epoch 171/200
  • 3/3 [==============================] - 0s 349us/step - loss: 0.1313 - accuracy: 1.0000
  • Epoch 172/200
  • 3/3 [==============================] - 0s 337us/step - loss: 0.0852 - accuracy: 0.9393
  • Epoch 173/200
  • 3/3 [==============================] - 0s 375us/step - loss: 0.0545 - accuracy: 1.0000
  • Epoch 174/200
  • 3/3 [==============================] - 0s 354us/step - loss: 0.0674 - accuracy: 0.9643
  • Epoch 175/200
  • 3/3 [==============================] - 0s 355us/step - loss: 0.0911 - accuracy: 1.0000
  • Epoch 176/200
  • 3/3 [==============================] - 0s 404us/step - loss: 0.0980 - accuracy: 0.9393
  • Epoch 177/200
  • 3/3 [==============================] - 0s 396us/step - loss: 0.0465 - accuracy: 1.0000
  • Epoch 178/200
  • 3/3 [==============================] - 0s 403us/step - loss: 0.1117 - accuracy: 0.9393
  • Epoch 179/200
  • 3/3 [==============================] - 0s 373us/step - loss: 0.0415 - accuracy: 1.0000
  • Epoch 180/200
  • 3/3 [==============================] - 0s 369us/step - loss: 0.0825 - accuracy: 1.0000
  • Epoch 181/200
  • 3/3 [==============================] - 0s 425us/step - loss: 0.0378 - accuracy: 1.0000
  • Epoch 182/200
  • 3/3 [==============================] - 0s 381us/step - loss: 0.1155 - accuracy: 0.9393
  • Epoch 183/200
  • 3/3 [==============================] - 0s 354us/step - loss: 0.0207 - accuracy: 1.0000
  • Epoch 184/200
  • 3/3 [==============================] - 0s 346us/step - loss: 0.0344 - accuracy: 1.0000
  • Epoch 185/200
  • 3/3 [==============================] - 0s 379us/step - loss: 0.0984 - accuracy: 0.9393
  • Epoch 186/200
  • 3/3 [==============================] - 0s 360us/step - loss: 0.1508 - accuracy: 0.8536
  • Epoch 187/200
  • 3/3 [==============================] - 0s 361us/step - loss: 0.0463 - accuracy: 1.0000
  • Epoch 188/200
  • 3/3 [==============================] - 0s 358us/step - loss: 0.0476 - accuracy: 0.9643
  • Epoch 189/200
  • 3/3 [==============================] - 0s 379us/step - loss: 0.1592 - accuracy: 1.0000
  • Epoch 190/200
  • 3/3 [==============================] - 0s 387us/step - loss: 0.0071 - accuracy: 1.0000
  • Epoch 191/200
  • 3/3 [==============================] - 0s 405us/step - loss: 0.0527 - accuracy: 1.0000
  • Epoch 192/200
  • 3/3 [==============================] - 0s 401us/step - loss: 0.0874 - accuracy: 0.9393
  • Epoch 193/200
  • 3/3 [==============================] - 0s 355us/step - loss: 0.0199 - accuracy: 1.0000
  • Epoch 194/200
  • 3/3 [==============================] - 0s 373us/step - loss: 0.1299 - accuracy: 0.9643
  • Epoch 195/200
  • 3/3 [==============================] - 0s 360us/step - loss: 0.0929 - accuracy: 1.0000
  • Epoch 196/200
  • 3/3 [==============================] - 0s 380us/step - loss: 0.0265 - accuracy: 1.0000
  • Epoch 197/200
  • 3/3 [==============================] - 0s 358us/step - loss: 0.0843 - accuracy: 1.0000
  • Epoch 198/200
  • 3/3 [==============================] - 0s 354us/step - loss: 0.0925 - accuracy: 1.0000
  • Epoch 199/200
  • 3/3 [==============================] - 0s 327us/step - loss: 0.0770 - accuracy: 1.0000
  • Epoch 200/200
  • 3/3 [==============================] - 0s 561us/step - loss: 0.0311 - accuracy: 1.0000
  • found in bag: 你好
  • [0 0 1 0 0 0 0 0 0 0 0 0 0 0]
  • found in bag: 请问
  • [('打招呼', '0.998965')]

瞬间执行完毕,秒杀intel芯片的mac,怎一个香字了得!

接下来,尝试安装另外一个在业界名声煊赫的深度学习框架Pytorch!

由于当前arm64架构的只支持3.9版本,所以我们来创建一个虚拟空间:

  • sudo conda create -n pytorch numpy matplotlib pandas python=3.9

这里提前将需要的基础库都一一安装,因为如果不在创建虚拟空间时提前安装,之后使用pip是安装不上的,安装成功后,激活环境:

  • (pytorch) ➜ conda activate pytorch
  • (pytorch) ➜

随后下载arm64版本的pytorch安装包:https://github.com/wizyoung/AppleSiliconSelfBuilds/blob/main/builds/torch-1.8.0a0-cp39-cp39-macosx_11_0_arm64.whl

下载成功后,执行安装命令:

  • sudo pip install torch-1.8.0a0-cp39-cp39-macosx_11_0_arm64.whl

让我们来试试Pytorch在M1芯片加持后的性能,编写test_torch.py:

  • from tqdm import tqdm
  • import torch
  • @torch.jit.script
  • def foo():
  • x = torch.ones((1024 * 12, 1024 * 12), dtype=torch.float32)
  • y = torch.ones((1024 * 12, 1024 * 12), dtype=torch.float32)
  • z = x + y
  • return z
  • if __name__ == '__main__':
  • z0 = None
  • for _ in tqdm(range(10000000000)):
  • zz = foo()
  • if z0 is None:
  • z0 = zz
  • else:
  • z0 += zz

矩阵加法逻辑运算达到了45 it/s,torch短时间内适配M1芯片,如此性能已经非常惊艳了。

最后,有没有arm64架构的编辑器呢?答案是有的,vscode值得拥有,下载地址:https://code.visualstudio.com/insiders/#osx  一定要选择arm64版的:

解压后直接运行即可,可以在插件商店选择Python和Code Runner,即可开启M1的Python代码编写之旅。

结语:M1芯片的Mac和Python3,简直就是金风玉露,绝配天成。只要撩开M1和开发者们之间的那一层帷幔,等待我们的,就是纵享丝滑的开发感受,还等什么?犹豫只会败北,是时候燃烧灵魂,献出钱包了。

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门