原文转载自「刘悦的技术博客」https://v3u.cn/a_id_189

笔者投入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-forg... 抉择mac arm64位架构:

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

cd ~/Downloas

执行命令进行装置:

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.91chifun.worke...://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/A...\_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

后果仍然秒杀Intel mac,达到了320 it/s,你敢信?

最初,有没有arm64架构的编辑器呢?答案是有的,vscode值得领有,下载地址:https://code.visualstudio.com... 肯定要抉择arm64版的:

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

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

原文转载自「刘悦的技术博客」 https://v3u.cn/a_id_189