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.2Python 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の顛末 (ビルドの仕方も書いた)
- 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内蔵GPUとAMD(RADEON)のみ対応している。そのうちIntelとかも対応してくれるかも知れない。その前にIntel Macが無くなるかも知れないが。
試したところ、tensorflow-metalを入れるとかえって遅くなることもあるので、アプリ次第でtensorflow-metalを入れるかどうか判断することになる。
まとめ
自分的には困らない程度に環境が整った。
Jetson TX2を適当なケースに入れてみる
Jetson TX2を手に入れたが、裸で置いておくのは心配だし、たまにファンに指を突っ込んで痛い目にあう。ちゃんとしたケースに入れたいので試してみた。
ケースの選定
Miini-ITXであれば大抵大丈夫そうだが、Jetson TX2は意外と厚みがあったりするので、ネットで大丈夫という評判の、
MITXPC MX500 Industrial Fanless Mini-ITX Case
を買ってみた。
日本Amazonであれば、
アメリカ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の設定が必要。
詳しくは書かないが、
という感じ。
感想
これで指を巻き込まれずにすむ。
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-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
iMacのディスク名でハマったが復旧してみる
誕生祝いにiMacを買いました。xcodeでemacsをコンパイルしようとしたらディスク名に空白が入っていてエラーになるので、ディスク名から空白を除いたところ、大いにハマったのでその記録です。
ご存知とは思いますが
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_
のように付けています。
権利
利用、配布、再配布などはご自由にどうぞ。
出来れば山田のデータを使った旨のクレジットタイトルがあるとうれしいけど、マナーの範囲なので無くても文句は言いません。
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とかを動かした方が早いかもしれない。