Apple Silicon MacのPython環境を整備してみる (conda使わず)

アップデート

2022年3月現在、Python3.8系で問題なくなったので修正。

 

予備知識


現状手に入るApple Silicon MacのCPUはM1と呼ばれる。

$ sysctl -a machdep.cpu
machdep.cpu.brand_string: Apple M1
machdep.cpu.core_count: 8
machdep.cpu.cores_per_package: 8
machdep.cpu.logical_per_package: 8
machdep.cpu.thread_count: 8

 

CPUコアはARMであり、アーキテクチャ文字列はarm64である。

$ arch
arm64

 

Python2は2.7系、Python3は3.8系がインストールされている。

$ /usr/bin/python -V
Python 2.7.16
$ /usr/bin/python3 -V
Python 3.8.2

Python 3.8.9

 

Pythonの主要なパッケージのarm64対応は、Python3.9以降で行うとされている。

各種パッケージはPython3.8にも対応しているよう。

  • Scipy
  • Numpy

など。

 

Apple Silicon MacでのPython環境の整えかた


方針

以上の情報から、Python3.9以降を用いて環境構築を行うのが良さそうである。
システムのPython3を置き換えるのは困難なので、

  • pyenv等の仮想環境を用いる
  • HomebrewなどでPython3.9以降をインストールし、そちらを使うように環境変数等を整える。

などの対応が必要。ひとまずpyenvでPython3.9の仮想環境を作ってみた。venv好きの人はpyenvでPythonのバージョンだけ切り替えて、venvで仮想環境を作っても良い。

システムにプレインストールされているPython3.8を使えば問題ない。システムを汚したくなければvenvなどを使う。

 

手短に結論


ごく一部のパッケージだけ個別対処をすれば、実用上困らないレベルには達している。

 

素直にインストールできたもの


pip installで素直に入ったもの。ライブラリが必要とか、LDFLAGS, CFLAGSなどの設定が必要な場合もあるが、Apple Silicon特有の話ではないので省略する。

 

  • Jinja2
  • Keras-Preprocessing
  • Markdown
  • MarkupSafe
  • Pillow
  • PyQt5
  • PyQt5-sip
  • PyYAML
  • Pygments
  • Werkzeug
  • absl-py
  • ansible
  • appnope
  • astunparse
  • backcall
  • cached-property
  • cachetools
  • certifi
  • cffi
  • chardet
  • cmake
  • control
  • cryptography
  • cycler
  • cython
  • decorator
  • dill
  • easyesn
  • flask
  • flatbuffers
  • gast
  • google-auth
  • google-auth-oauthlib
  • google-pasta
  • graphviz
  • gsutil
  • h5py
  • haversine
  • hidapi
  • idna
  • imgaug
  • importlib-metadata
  • ipython
  • ipython-genutils
  • japanize_matplotlib
  • jedi
  • keras
  • kiwisolver
  • kociemba
  • labelimg
  • lxml
  • matplotlib
  • more-itertools
  • mpi4py
  • mxnet
  • mysql
  • mysqlclient
  • ntlm-auth
  • numpy
  • oauthlib
  • opencv-python
  • openpyxl
  • opt-einsum
  • optuna
  • packaging
  • paho-mqtt
  • pandas
  • parso
  • passlib
  • pexpect
  • pickleshare
  • plotly
  • poetry
  • prompt-toolkit
  • protobuf
  • ptyprocess
  • pyasn1
  • pyasn1-modules
  • pycodestyle
  • pycparser
  • pycwt
  • pydot
  • pyglet
  • pyknp
  • pyparsing
  • python-dateutil
  • pyusb
  • pywinrm
  • requests
  • requests-ntlm
  • requests-oauthlib
  • rsa
  • scikit-build
  • scikit-learn
  • scipy
  • selenium
  • setuptools
  • six
  • slidingwindow
  • sympy
  • tensorboard-plugin-wit
  • tensorflow-addons
  • tensorflow-estimator
  • tensorflow-metal
  • termcolor
  • torch
  • torchvision
  • tqdm
  • traitlets
  • typeguard
  • typing
  • typing-extensions
  • urllib3
  • wcwidth
  • wheel
  • wrapt
  • xlrd
  • xmltodict
  • yolov4
  • zipp

 

インストールに失敗したもの


以下のパッケージはpip installに失敗した(2021/9/7現在)。

 

  • PyQt5-Qt => No matching distribution found (まあ不要でしょう)
  • deeplabcut => intel-openmpが無い (Intel専用のよう)
  • grpcio => エラー
  • tensorboard => grpcioが必要
  • tensorflow-macos => grpcioが必要
  • tslearn => grpcioが必要
  • wxPython => エラー多数で諦めた
  • yolov5 => grpcioが必要

 

個別対処

 

grpcio


grpcioが入れられれば、他のいくつかも救える。

 

export GRPC_PYTHON_BUILD_SYSTEM_OPENSSL=1
export GRPC_PYTHON_BUILD_SYSTEM_ZLIB=1
pip install grpcio


または

 

GRPC_PYTHON_BUILD_SYSTEM_OPENSSL=1 GRPC_PYTHON_BUILD_SYSTEM_ZLIB=1 pip install grpcio

 

tensorflow-addons


pypi.orgでwheelが配布されていないので、ソースビルドをする。
ビルドスクリプトApple Silicon非対応だったので、修正し、pull requestを出したら採用された。作ったwheelも置いておく。

既に対処版が配布されている。

 

  • pull requestの顛末 (ビルドの仕方も書いた)

github.com

 

  • Python3.9用にビルドしたwheel (zipしてある)

https://yamada.jo.sus.ac.jp/data/tensorflow_addons-0.14.0.dev0-cp39-cp39-macosx_11_0_arm64.whl

 

TensorFlowについて


Apple Siliconに限らず、Mac用のTensorFlowは、tensorflow-macosと、そのアドオンであるtensorflow-metalになった。
どちらもpip installでインストールできる。
tensorflow-macosだけでも動き、tensorflow-metalを入れるとGPUアクセラレーションが使えるようになる。metalはハード依存性の低い共通仕様であるが、tensorflow-metalでのGPUアクセラレーションは現時点ではApple Silicon内蔵GPUAMD(RADEON)のみ対応している。そのうちIntelとかも対応してくれるかも知れない。その前にIntel Macが無くなるかも知れないが。
試したところ、tensorflow-metalを入れるとかえって遅くなることもあるので、アプリ次第でtensorflow-metalを入れるかどうか判断することになる。

 

まとめ


自分的には困らない程度に環境が整った。

Jetson TX2を適当なケースに入れてみる

Jetson TX2を手に入れたが、裸で置いておくのは心配だし、たまにファンに指を突っ込んで痛い目にあう。ちゃんとしたケースに入れたいので試してみた。

 

ケースの選定

Miini-ITXであれば大抵大丈夫そうだが、Jetson TX2は意外と厚みがあったりするので、ネットで大丈夫という評判の、

MITXPC MX500 Industrial Fanless Mini-ITX Case

を買ってみた。

日本Amazonであれば、

https://amzn.to/2GRY3kg 

アメリカAmazonであれば、

https://www.amazon.com/gp/product/B01B575EMA/ref=oh_aui_detailpage_o00_s00?ie=UTF8&psc=1

で買える。日数がかかっても良ければアメリカのほうが安い。

 

取り付け

蓋やらブラケットやらを外して、4本のネジでJetson TX2を留める。

ネジ穴がピッタリ合うので気持ち良い。

取り付けるとこんな感じ。残念ながら、内蔵カメラは役に立たなくなる。

http://f.hatena.ne.jp/linuzau/20180329132804

 

裏側のコネクタ部は広くガバッと開いたままだが、ここを塞ぐには自分で工作するしか無い。自分は開いたままにしている。

http://f.hatena.ne.jp/linuzau/20180329132753

 

配線

買ったケースには電源ボタンと電源ランプが付いていたので、働かせてみる。

 

電源ボタンを働かすには、電源ボタンからのケーブルをJ6という2ピンのコネクタに差し込む。

ピントが甘いけどこんな感じ。

http://f.hatena.ne.jp/linuzau/20180329132742

 

電源が入った時に電源ランプを光らすには、GPIOコネクタの4, 6番ピンに電源ランプからのケーブルを差し込む。2, 4番ピンが+5V、6番ピンがGNDなので、隣り合っているという条件であれば、4, 6番ピンを使うしかない。

写真でも分かりにくいが、一番ピンの多いコネクタを、GPIO EXPANDという文字が見える方向で横に見て、左の上側2, 3番目がそれである。LEDは極性があるので点灯しなかったらたぶん逆である。

http://f.hatena.ne.jp/linuzau/20180329132732

 

以上の配線により、電源ボタンを押せば電源がONになり、LEDが点灯する。

http://f.hatena.ne.jp/linuzau/20180329132842

 

電源ボタンを押せばシャットダウンされ、LEDが消灯する。ただし、Ubuntuの標準状態ではアクションを問われるので、有無を言わさずシャットダウンされるようにするにはUbuntuの設定が必要。

詳しくは書かないが、

  • dconf-editor をインストールする。
  • org.gnome.settings-daemon.plugins.power を探して、button-power を shutdownにする。

という感じ。

 

感想

これで指を巻き込まれずにすむ。

TensorFlowなどを入れて遊んでます。

http://f.hatena.ne.jp/linuzau/20180329135454

 

Ubuntu 14.04 LTSでGoogleドライブを使ってみる


Ubuntu 14.04 LTSでGoogleドライブを動かす必要に迫られた。

どうせだったらWindowsとかMacとかのように、どこかのディレクトリにファイルを置いただけで自動的に同期されるのが良い。

すぐにできると思ったが、ちょっとだけ苦労したのでメモとして残しておく。

 

インストールの仕方

苦労した経緯を書いてもしかたがないので結論だけ書くことにします。

 
インストールするプログラムは、griveとgrive-toolsの2つ。

  • griveはドライブ同期を行うコア部分。
  • grive-toolsはGUIおよび自動同期のツール


grive-toolsはよそのリポジトリからインストールする。

残念ながら、Ubuntu 14.04 LTSのgriveが古いため、grive-toolsのインストールに失敗するので、griveも新しいもののリポジトリを追加する。

# griveの新しいのをリポジトリに追加
$ sudo add-apt-repository ppa:nilarimogard/webupd8

# grive-toolsをリポジトリに追加
$ sudo add-apt-repository ppa:thefanclub/grive-tools

# リポジトリデータベースをアップデートして
$ sudo apt-get update

# インストール
$ sudo apt-get install grive grive-tools

感想

あとはGUI自動起動や同期のON/OFFができます。
分かってしまえば簡単なものだ。

iMacのディスク名でハマったが復旧してみる

誕生祝いにiMacを買いました。xcodeemacsをコンパイルしようとしたらディスク名に空白が入っていてエラーになるので、ディスク名から空白を除いたところ、大いにハマったのでその記録です。

ご存知とは思いますが

Macでは、伝統的に、ハードディスクに"Macintosh HD", "Macintosh HD 2"の様な名前がデフォルトで付けられます。空白が問題を起こしそうな香りがプンプンします。インストール時に変えてやれば良かったのでしょうが、面倒でそのまま使ってました。

xcodeでのエラー

xcodeというかビルド時のスクリプトの問題ですが、ファイルのパスに空白があるとエラーになってしまいます。
例えば、emacs-23.3をソースからビルドしようとして、
"/Volumes/Macintosh HD 2/Users/tetsu/work/emacs-23.3"
にソースをおいてconfigureすると、

$ ./configure --with-ns --without-x
...
grep: /Volumes/Macintosh: No such file or directory


のように、Macintoshの後ろの空白のせいでスクリプトが勘違いを起こします。

やっちゃったこと

"Macintosh HD 2"の空白が悪いので、"MacintoshData"のような空白の含まれない名前にすればいいじゃないかという発想。"Macintosh HD 2"には自分のホームディレクトリが置いてあるので、下手をするとマズイことになるかと思い、下調べした。

  • ディスク名はファインダーから普通に変えて良い
  • ホームディレクトリを見失っても後で復旧できる

というような情報があったので、トライして見ることにした。

ファインダーでディスク名を変更。するとすぐにDropBoxが同期対象のディレクトリが見つからないとエラーを出すが、あとで直せばいいと、無視して再起動する。

起動したのでログインしようとしたら、できない。

試したこと

  • シングルユーザモードでディスク名を"MacintoshData"から"Macintosh HD 2"に変更 → 変わらず
  • Time Machineでシステムディスクを復元 → 変わらず

結局こうやって復旧

  • command-Rでリカバリモードで起動
  • resetpasswordでパスワードをリセット
  • rootユーザにパスワードを設定

こうすると、自分のアカウントではログインできないのは相変わらずだが、rootでログインできた。
rootでログインして、ディスクの名前を"MacintoshData"から"Macintosh HD 2"に変更してログアウトしたら、自分のアカウントでログインできるようになった。
セキュリティ的にまずいかもしれないが、rootアカウントは有効にしておいたほうが良いかも。あるいはrootアカウントの有効化手段を覚えておくか。

まだわからないこと

ホームディレクトリが置いてあるディスクの名前を安全に変えるにはどうしたら良いのでしょうか。

ベンチマークデータを公開してみる

ベンチマークデータの更新が辛くなってきたので、過去のデータを公開することにしました。csv形式なのでDBに綺麗に入れ直せばいろいろいじれると思います。

データ形式

ファイルは、http://tetsu.homelinux.org/android/benchmark/data/ に置きました。

ファイル名は、概ね、
Benchmark__<バージョン>[+<オプション>][-<通番>].csv
のように付けています。

権利

利用、配布、再配布などはご自由にどうぞ。
出来れば山田のデータを使った旨のクレジットタイトルがあるとうれしいけど、マナーの範囲なので無くても文句は言いません。

CyanogenMod-5.0.7-DS-test2のcompcacheを有効にしてみる

CyanogenMod-5.0.7-DSは、なかなか軽快で、HT-03AでEclairが常用できるぐらいの出来だと思う。
しかし、test1では有効にできたcompcacheがtest2では有効にならないようなので何とかしてみることにした。

解析

CyanogenMod-5.0.7-DS-test2をインストールする。

compcacheが有効になっているか確認する。

C:\> adb shell free
              total         used         free       shared      buffers
  Mem:        97764        88740         9024            0         1636
 Swap:            0            0            0
Total:        97764        88740         9024

あー、ダメだねー。

原因を探す。

# adb shell
# cd /system/lib/modules/2.6.33.3-cyanogenmod
# ls
kernel               modules.dep          modules.order
modules.alias        modules.dep.bin      modules.pcimap
modules.alias.bin    modules.ieee1394map  modules.seriomap
modules.builtin      modules.inputmap     modules.symbols
modules.builtin.bin  modules.isapnpmap    modules.symbols.bin
modules.ccwmap       modules.ofmap        modules.usbmap

compcacheモジュールが無い。

対策

update-cm-5.0.7-DS-test1-signed.zipを解凍する。
system/lib/modules/2.6.33.3-cyanogenmodの下にあるcompcacheフォルダを見つけ出す。

compcacheフォルダごと書き込む。

C:\> adb remount
C:\> adb push compcache /system/lib/modules/2.6.33.3-cyanogenmod/compcache
C:\> adb reboot

SparePartsでcompcacheをONにして、有効になっているか確認。

C:\> adb shell free
              total         used         free       shared      buffers
  Mem:        97764        92884         4880            0          324
 Swap:        24432         9740        14692
Total:       122196       102624        19572

うまくいった。

感想

Cyanogenはcompcacheが嫌いなのかしら。

Androidの時計をNTPで合わせてみる

Android端末をWifiで運用していると時計が自動的に合わないのでいろいろいじってみた。

(追記) 2010/5/15にNTPクライアントアプリ (http://amip.tools-for.net/android/ClockSync) が出てたので、今ならこれを使うのが良いと思う。

背景

Nexus One(Android携帯)の時刻同期のしくみ http://blog.takuo.jp/2010/03/nexus-oneandroid-phones-time-sync.html にある通り、Android端末は適切なSIM(日本ではドコモのみ)を使っている場合は自動で時刻同期をするが、他のSIMやSIM無しで運用している場合には時刻同期がなされない。

SIMを挿しているメイン機はともかく、ヒトバシラーの人たちはたくさんのAndroid端末を持っているものなので、何とかしてみたいと思った。

SNTPクライアント

まずはNTPクライアントを探してみた。

AndroLib.comにSNTP CLIENT http://jp.androlib.com/android.application.net-larko-android-sntpclient-xxwj.aspx があったので入れてみた。

SNTP CLIENTはNTPサーバからの時刻情報を表示するものの、機器の時計を合わせる機能がまだ実装されていない。

adjust_clock

SNTP CLIENTの作者のページにて、adjust_clock http://www.larko.net/adjust_clock を用いた時刻設定の仕方が紹介されている。

$ adb push adjust_clock /data/local/
$ adb shell chmod 755 /data/local/adjust_clock

ここでSNTP CLIENTの画面を見て、Local Offsetの値を1000倍した数値を覚えておく。

$ adb shell "/data/local/adjust_clock -67990 ; echo $?"
0

0が表示されたら成功。SNTP CLIENTの画面でも時刻が正しくなる。

なお、数m〜数十msecぐらいの誤差は残るので、あまり神経質にならない方が良いと思う。

感想

adjust_clockの処理が自動で行われなければあまり意味が無いと思う。
SNTP CLIENTがLocal Offsetをテキストで返してくれれば連動できそうなのだけれど。

ntpdateとかを動かした方が早いかもしれない。