如何在 Jetson Nano 上安裝 TensorFlow 以及 PyTorch?

一拿到熱騰騰的 Jetson Nano,當然第一步就是立刻裝系統,上環境。但是在裝 TensorFlow 和 PyTorch 可是栽了很多坑。因為 Jetson Nano 是 arm64 的 SoC,雖然 TensorFlow 和 PyTorch CPU only 有 for arm64 的 wheel 可以安裝,但 GPU support 的卻都沒有!都用上 Jetson Nano 怎麼可以不用 GPU 呢?

經過一段時間的試誤和 google 後,有以下結論

  1. 不要自己 build
    因為太麻煩了!要裝很多的依賴, CPU 不夠強要 build 超久,還有蠻大的機率 build 失敗!想玩個 AI 搞這麼痛苦幹嘛呢!
  2. 用 nvidia 官方 official build 好的來裝
    nvidia 真是太佛心了,該有的都 build 好,直接照他指令一個個下就好,只是不知為何官網都沒有寫,反而要搜尋到官方論壇才有。
  3. Python 要使用 3.6 版
    因為 JetPack 自帶的 python 是 3.6 ,所以官方 build 好的也都只有 for 3.6,如果自己安裝新版的 python 就不能使用
  4. 可以使用官方提供的 docker image 或是 Dockerfile
    這個蠻不錯的,如果開發好的應用要放進 docker 裡跑,直接使用官方的 image 當 base 下去做。另外如果需要在 docker 裡面安裝 openCV 或是 ROS (這兩個也是不好搞),官方也有對應的 Dockerfile 範例可以拿來改

好!總之我們要站在巨人的肩膀上,不要自己造輪子!首先讓我們看看如何使用 official build 的方式安裝

使用 nvidia official build 安裝

安裝 TensorFlow 2

詳細可參考 Official TensorFlow for Jetson Nano! 這邊簡單列出需要的指令

# 準備依賴
sudo apt-get install libhdf5-serial-dev hdf5-tools libhdf5-dev zlib1g-dev zip libjpeg8-dev liblapack-dev libblas-dev gfortran
sudo apt-get install python3-pip
sudo pip3 install -U pip testresources setuptools==49.6.0
sudo pip3 install -U numpy==1.16.1 future==0.18.2 mock==3.0.5 h5py==2.10.0 keras_preprocessing==1.1.1 keras_applications==1.0.8 gast==0.2.2 futures protobuf pybind11

# 開始安裝 TF-2.x
sudo pip3 install --pre --extra-index-url https://developer.download.nvidia.com/compute/redist/jp/v45 tensorflow

安裝完後,因為 2.x 有新增一些指令,要給定 cpu type 才不會發生 Illegal instruction (core dumped) 的錯誤

# 把這行加到 .bashrc
export OPENBLAS_CORETYPE=ARMV8

裝完後驗證一下是否有使用 GPU

import tensorflow as tf
if tf.test.gpu_device_name():
    print('Default GPU Device: {}'.format(tf.test.gpu_device_name()))
else:
    print("Please install GPU version of TF")

安裝 PyTorch

一樣詳細可參考 PyTorch for Jetson – version 1.8.0 now available,這邊簡單列出需要的指令

wget https://nvidia.box.com/shared/static/p57jwntv436lfrd78inwl7iml6p13fzh.whl -O torch-1.8.0-cp36-cp36m-linux_aarch64.whl
sudo apt-get install python3-pip libopenblas-base libopenmpi-dev 
pip3 install Cython
pip3 install numpy torch-1.8.0-cp36-cp36m-linux_aarch64.whl

順便也安裝一下 torchvision,但這個要 build 所以會花一段不算短的時間。這邊以 0.9.0 為例

sudo apt-get install libjpeg-dev zlib1g-dev libpython3-dev libavcodec-dev libavformat-dev libswscale-dev
git clone --branch v0.9.0 https://github.com/pytorch/vision torchvision
cd torchvision
export BUILD_VERSION=0.9.0
python3 setup.py install --user

此時如果跑 pytorch 可能會出現錯誤,給定 LD_PRELOAD 即可解

ImportError: /usr/lib/aarch64-linux-gnu/libgomp.so.1: cannot allocate memory in static TLS block

# 一樣把這行加到 .bashrc
export LD_PRELOAD=/usr/lib/aarch64-linux-gnu/libgomp.so.1

裝完後驗證一下是否有使用 GPU

import torch

# True 代表成功
torch.cuda.is_available()

# 以下只是取得 GPU 資訊
torch.cuda.current_device()
torch.cuda.device(0)
torch.cuda.device_count()
torch.cuda.get_device_name(0)

使用 Docker image or Dockerfile

官方在 github 有列出 image name 可以直接 pull,有需要還可以使用 git 裡的 Dockerfile 來修改

如何在 Jetson Nano 上安裝 TensorFlow 以及 PyTorch?
如何在 Jetson Nano 上安裝 TensorFlow 以及 PyTorch?

其中特別注意的是,要在 docker command 給定 runtime 或是直接到 /etc/docker/daemon.json 設定 default runtime ,這樣在 container 裡面才有 GPU 加速!

# 舉例,在 run 指令後面給定 runtime
docker run -it --runtime=nvidia nvcr.io/nvidia/l4t-pytorch:r32.5.0-pth1.7-py3 bash
// 更方便並防忘記的方法,就是直接修改 /etc/docker/daemon.json
{
    "runtimes": {
        "nvidia": {
            "path": "nvidia-container-runtime",
            "runtimeArgs": []
        }
    },

    "default-runtime": "nvidia" // 加這一行
}

That’s it! 希望可以讓大家少走點彎路,趕快開始玩 AI!

延伸閱讀:如何在 Jetson Nano 上安裝 OpenCV?

參考資料

Official TensorFlow for Jetson Nano!
PyTorch for Jetson – version 1.8.0 now available
https://github.com/dusty-nv/jetson-containers
How to check if pytorch is using the GPU?
Check whether Tensorflow is running on GPU
Illegal instruction(core dumped) error on Jetson Nano

Written by J
雖然大學唸的是生物,但持著興趣與熱情自學,畢業後轉戰硬體工程師,與宅宅工程師們一起過著沒日沒夜的生活,做著台灣最薄的 intel 筆電,要與 macbook air 比拼。 離開後,憑著一股傻勁與朋友創業,再度轉戰軟體工程師,一手扛起前後端、雙平台 app 開發,過程中雖跌跌撞撞,卻也累計不少經驗。 可惜不是那 1% 的成功人士,於是加入其他成功人士的新創公司,專職開發後端。沒想到卻在採前人坑的過程中,拓寬了眼界,得到了深層的領悟。