---
# System prepended metadata

title: Jetson Nano - 開發環境
tags: [' Yungger', ' 基礎', ' NVIDIA', Jetson Nano, ' 勇哥', ' 教學', ' 環境安裝', ' Basic', ' 設定', ' Mac']

---

---
tags: Jetson Nano, Basic, NVIDIA, 基礎, 教學, 環境安裝, 設定, Mac, 勇哥, Yungger
Refs:
- https://abhatikar.medium.com/make-your-nvidia-jetson-nano-deep-learning-ready-a8f5fcd7b25c

- https://www.jetsonhacks.com/2019/10/01/jetson-nano-visual-studio-code-python/

- https://medium.com/@kcchien/jetson-nano-%E5%AE%89%E8%A3%9D-visual-studio-code-a26a279293e6

- https://www.digikey.com/en/maker/projects/getting-started-with-the-nvidia-jetson-nano-part-1-setup/2f497bb88c6f4688b9774a81b80b8ec2

- https://www.rs-online.com/designspark/jetson-nano-1-cn
---

# Jetson Nano - 開發環境
![](https://i.imgur.com/qWoTXT3.jpg)

[TOC]

---

Python 3
---
Jetson Nano 已內建安裝 Python 2 與 Python 3, 但預設執行的版本為 Python 2。
:::info
### 將 Python 3 為預設的 Python 環境
直接在 .bashrc 設一個 Python 別名為 Python 3 來啟動
:::
- 修改 .bashrc
`$ sudo nano ~/.bashrc`
- 在文檔的最下面加上 
`alias python=python3`
- Ctrl+O 存檔 => Enter => Ctrl+X 離開
- 要記得, 讓環境變數即刻生效
`$ source ~/.bashrc`
輸入 python 後, 應該就可發現已是 3.x.x 版本了
`$ python 然後輸入 exit() 離開`
![](https://i.imgur.com/x4DK79S.jpg)
:::warning
### 安裝 pip3
:::
- 下載與安裝 python3-pip
`$ sudo apt-get install python3-pip`
- 升級至最新版本
`$ python -m pip install --upgrade pip`
- 查詢目前 pip3 版本
`$ pip3 -V`
- 後續要安裝其他套件在 Python 3 環境下時
`$ pip3 install 套件名稱`

---

Python 虛擬環境
---
建議使用 mkvirtualenv 來建構虛擬環境，相較於 virtualenv 易於管理。此外，進入虛擬環境使用 workon 指令可更簡單方便的切換至指定開發環境

:::warning
### 安裝 virtualenv 與 virtualenvwrapper
:::
- 下載與安裝
`$ sudo pip3 install virtualenv virtualenvwrapper`
- 修改執行環境設定
`$ nano ~/.bashrc`
- 在文檔的最後加入下列文字
```
# virtualenv and virtualenvwrapper
export WORKON_HOME=$HOME/.virtualenvs
export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3
source /usr/local/bin/virtualenvwrapper.sh
```
![](https://i.imgur.com/VI937hM.jpg)
- Ctrl+O 存檔 => Enter => Ctrl+X 離開
- 要記得, 讓環境變數即刻生效
`$ source ~/.bashrc`

:::warning
### 為新專案建立一個虛擬環境
例如專案名為 aicar, 解譯器是 python3
:::
- 新增虛擬環境 
`$ mkvirtualenv aicar -p python3 --system-site-packages`
- 查詢目前已建立虛擬環境的專案名
`$ workon`
- 進入專案 aicar 的虛擬環境
`$ workon aicar`
`$ pip3 list`
![](https://i.imgur.com/V2gysLv.jpg)
- 離開專案 aicar 的虛擬環境
`$ deactivate`
`$ pip3 list`
![](https://i.imgur.com/xVKMcoq.jpg)
    #### 有無發現 list 出來的底層環境與虛擬環境中所安裝的套件有何差別？
- 若要刪除虛擬環境
`$ rmvirtualenv 專案名`

---



Python 專案套件
---

:::warning
### OpenCV
Jetson Nano 時就預設已安裝 4.1.1 版本
:::
- 檢查目前已安裝的 OpenCV 版本
`$ opencv_version`
或從 Python 中檢查版本
    `$ python3`
    
    ```
    >>> import cv2
    >>> cv2.__version__
    '4.1.1'
    >>> exit()
    ```
    由上均可得知, OpenCV 已安裝, 且目前版本為 4.1.1
- 查 OpenCV 的安裝載入位置
`$ sudo find / -name "cv2*"`


---

:::warning
### CUDA
:::
- 檢查目前已安裝的 CUDA 版本 （在初始燒錄 Jetson Nano 時就預設已安裝）
    $ nvcc -V
    :::danger
    一開始若直接執行 nvcc -V 是不會成功的，因為在環境變數中尚未設定 CUDA 的路徑。所以, 須直接指名路徑來執行
    $ /usr/local/cuda/bin/nvcc -V
    :::
    得知我的 Jetson Nano 預設已裝的是 release 10.2, V10.2.89

- 將路徑加入環境變數中
    $ ls -al /usr/local
    可以得知目前的 cuda 所鏈結的目錄是 cuda-10.2
    $ sudo nano ~/.bashrc
    在最後面加入以下內容：
    ```
    export CUDA_HOME=/usr/local/cuda
    export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH
    export PATH=/usr/local/cuda/bin:$PATH
    ```
    編輯完成後，存檔離開, 下指令使其即刻生效
    $ source ~/.bashrc
    再下指令測試, 可發現已可取得版本資訊, 代表路徑變數設定已成功
    $ nvcc -V
    
    安装 PyCuda
    $ pip3 install 'pycuda>=2019.1.1'

---

:::warning
### cuDNN
:::
- 檢查目前已安裝的 cuDNN 版本 （在初始燒錄 Jetson Nano 時就預設已安裝）
    $ ls -al /usr/src
    可以看到檔案列表中有一個範例程式的目錄 (我的是 cudnn_sample_v8)
    $ cd /usr/src/cudnn_samples_v8/mnistCUDNN
    $ sudo make
    $ sudo chmod a+x mnistCUDNN
    $ ./mnistCUDNN
    執行後, 接著會看到一些運算的過程, 直到最後一句是 "Test passed!"  表示內建的 cuDNN 是運作正常的。
    
---


:::warning
### [PyTorch](https://forums.developer.nvidia.com/t/pytorch-for-jetson-version-1-6-0-now-available/72048)
:::
for python 3.6 版本：
$ wget https://nvidia.box.com/shared/static/9eptse6jyly1ggt9axbja2yrmj6pbarc.whl -O torch-1.6.0-cp36-cp36m-linux_aarch64.whl
$ sudo apt-get install libopenblas-base libopenmpi-dev 
$ pip3 install Cython
$ pip3 install numpy torch-1.6.0-cp36-cp36m-linux_aarch64.whl

---

:::warning
### TensorRT
:::
- 檢查目前已安裝的 TensorRT 版本 （在初始燒錄 Jetson Nano 時就預設已安裝）
    $ dpkg -l | grep TensorRT
    可得知 TensorRT 版本為 7.1.3

---

:::warning
### [TensorFlow GPU](https://docs.nvidia.com/deeplearning/frameworks/install-tf-jetson-platform/index.html#install)
:::
- 先檢查一下, 目前 JetPack 的版本
    $ jetson_release
    我的是 JetPack 4.4 [L4T 32.4.3]
- 在安裝 TensorFlow 前, 須先裝裝一些[前置套件](https://docs.nvidia.com/deeplearning/frameworks/install-tf-jetson-platform/index.html#prereqs)
    $ sudo apt-get update
    $ sudo apt-get install libhdf5-serial-dev hdf5-tools libhdf5-dev zlib1g-dev zip libjpeg8-dev liblapack-dev libblas-dev gfortran
- 更新 pip3
    $ sudo apt-get install python3-pip
    $ sudo pip3 install -U pip testresources setuptools
- 安裝一些相關的套件
    $ 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
- 安裝最新版的 [TensorFlow](https://docs.nvidia.com/deeplearning/frameworks/install-tf-jetson-platform/index.html#install), 相容於 JetPack 4.4 
    $ sudo pip3 install --pre --extra-index-url https://developer.download.nvidia.com/compute/redist/jp/v44 tensorflow
- 檢查目前已安裝的 TensorFlow 版本
    $ python3
    ```
    >>> import tensorflow
    顯示訊息如 .... I tensorflow/stream_executor/.... Successfully opened ...
    >>> exit()
    ```
    若無錯誤訊息出現, 表示已安裝成功
    :::success
    若要解除安裝 TensorFlow 相當容易, 只須下指令如下：
    $ sudo pip3 uninstall -y tensorflow
    :::

---

:::warning
### Keras
:::
- 既然裝了 TensorFlow，那就把 Keras 也安装上，它能讓 TensorFlow使用上變得更簡單些
$ pip3 install keras
- 檢查目前已安裝的 Keras 版本
$ python3
```
>>> import keras
顯示訊息如 .... I tensorflow/stream_executor/.... Successfully opened ...
>>> exit()
```
若無錯誤訊息出現, 出現剛剛 Tensorflow 一樣的訊息

:::success
一個簡單的線性代數測試程式
```python=
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
 
x_data = np.linspace(-0.5, 0.5, 200)[:, np.newaxis]
noise = np.random.normal(0, 0.02, x_data.shape)
y_data = np.square(x_data) + noise
 
x = tf.placeholder(tf.float32, [None, 1])
y = tf.placeholder(tf.float32, [None, 1])
 
# 输入层一个神经元，输出层一个神经元，中间10个
# 第一层
Weights_L1 = tf.Variable(tf.random.normal([1, 10]))
Biases_L1 = tf.Variable(tf.zeros([1, 10]))
Wx_plus_b_L1 = tf.matmul(x, Weights_L1) + Biases_L1
L1 = tf.nn.tanh(Wx_plus_b_L1)
 
# 第二层
Weights_L2 = tf.Variable(tf.random.normal([10, 1]))
Biases_L2 = tf.Variable(tf.zeros([1, 1]))
Wx_plus_b_L2 = tf.matmul(L1, Weights_L2) + Biases_L2
pred = tf.nn.tanh(Wx_plus_b_L2)
 
# 损失函数
loss = tf.reduce_mean(tf.square(y - pred))
 
# 训练
train = tf.train.GradientDescentOptimizer(0.1).minimize(loss)
 
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    for i in range(2000):
        sess.run(train, feed_dict={x: x_data, y: y_data})
        print("第{0}次，loss = {1}".format(i, sess.run(loss,feed_dict={x: x_data, y: y_data})))
    pred_vaule = sess.run(pred, feed_dict={x: x_data})
    plt.figure()
    plt.scatter(x_data, y_data)
    plt.plot(x_data, pred_vaule, 'r-', lw=5)
```
:::

:::warning
### [YOLO3-4 GPU](https://github.com/madhawav/YOLO3-4-Py) Accelerated Version
:::
$ pip3 install yolo34py-gpu


:::warning
### [Jetson.GPIO](https://docs.nvidia.com/jetson/l4t/index.html#page/Tegra%2520Linux%2520Driver%2520Package%2520Development%2520Guide%2Fhw_setup_jetson_io.html%23)
:::
參考 https://www.jianshu.com/p/f98a69b94deb
讓我們能透過 Python 操控 Jetson Nano 上的 40組 GPIO 接腳。
- 安裝 GPIO 函式庫 （預設已安裝）
    $ sudo pip install Jetson.GPIO
    $ sudo pip3 install Jetson.GPIO
- 給予權限 
    $ sudo groupadd -f -r gpio
    $ sudo usermod -a -G gpio 你的帳號
- 測試是否已安裝可被引用
    $ python3
    ```
    >>> import Jetson.GPIO as GPIO
    若無錯誤訊息出現, 代表 OK
    >>> exit()
    ```
![](https://i.imgur.com/79TA2EN.png)


---

[jetson-stats](https://github.com/rbonghi/jetson_stats) 系統監控工具集
---
`$ sudo -H pip3 install -U jetson-stats`
`sudo systemctl restart jetson_stats.service`
`$ sudo reboot`

🚀 That's it! 🚀
記得還要重開機後, jetson-stats 的相關工具集就會被啟用

:::warning
### Jtop 監控工具
可用來查看系統運作時 CPU、GPU、記憶體各硬體的情況
:::
`$ jtop`
按 q 離開監控畫面
![](https://i.imgur.com/8bZm9rm.gif)
#### 程式中可直接使用 jetson-stats 所提供的函式庫的範例說明
- https://github.com/rbonghi/jetson_stats/wiki/library
- https://github.com/rbonghi/jetson_stats/tree/master/examples
    
:::warning
### jetson_config
Check jetson-stats health, enable/disable desktop, enable/disable jetson_clocks, improve the performance of your wifi
:::
`$ jetson_config`

![](https://i.imgur.com/v4aaRUV.png)

:::warning
### jetson_release
顯示 NVIDIA Jetson 的狀態與所有資訊
:::
`$ jetson_release`

![](https://i.imgur.com/E00b2se.png)
    
:::warning
### jetson_swap
管理 Jetson Nano 上的 swapfile
:::
`$ sudo jetson_swap`

:::warning
### jetson variables
:::
`$ export | grep JETSON`

![](https://i.imgur.com/zxJ6Etx.png)

---

開發者 IDE 工具
---

:::info
### pyCharm
從開發者本機上存取遠端 Jetson Nano 主機上的程式碼
:::
- Tools -> Deployment -> Configuration
- 點選左上角 “+”，添加 SFTP 連線，server name 可設置為 Jetson-Nano
- Connection 中的一些參數設定：
    - Host: 填 Jetson-nano 的 IP
    - User name: 填 Jetson-nano 的登入用戶帳號
    - PassWord: 填 Jetson-nano 的登入用戶密碼 (勾選記住密碼)
    - Root path: 可以不用自己填，直接點選旁邊的 Autodetect 即可
- 完成後，點選旁邊的 Mappings
    - Mappings： 設定文件對應關係
    - Local path： 本地文件路徑
    - Deployment path： Jetson nano 上的文件路徑
- 到此為止，SFTP 連線設定大致已完成，可以點擊 Tools -> Deployment -> Brose Remote Host, 即可在 pyCharm的右側視窗看見 Jetson-nano 中的文件了。
    :::danger
    注意，修改完程式碼後，還需要點擊右上方的 upload 箭頭符號，程式碼才會同步部屬至 Jetson-nano。
    :::
#### 經過以上設定後，程式開發者就可以在本機的 pyCharm 上撰寫 Jetson-nano 上面的程式碼。

---

:::info
### Visual Studio Code
:::
{%youtube 3A5tvO9UbwY %}

:::warning
### 下載與安裝 [Visual Studio Code](https://code.visualstudio.com/#alt-downloads)
Jetson Nano 的 CPU 是 ARM 64位元, 作業系統為 Ubuntu 18.04 的 .deb 檔
:::
- 指定為最新版本
`VERSION=latest`
- 或指定版本 (例如 1.51.1)
`VERSION=1.51.1`
- 下載
`wget -N -O vscode-linux-deb.arm64.deb https://update.code.visualstudio.com/$VERSION/linux-deb-arm64/stable`
- 安裝
`sudo apt install ./vscode-linux-deb.arm64.deb`

:::warning
### 安裝相關 Python 套件
:::
- 安裝 Python linter
`$ pip3 install pylint`
- 安裝 Python formatter
`$ pip3 install black`
- 安裝 Python extension for Visual Studio Code
`$ code --install-extension ms-python.python --force`

:::warning
### 啟動 Visual Studio Code
:::
- 進入圖形化作業系統 (本地 or 遠端桌面連線)
- 由應用系統選單中啟動
- 或由終端機下指令啟動
`$ code`
![](https://i.imgur.com/j5smhYw.jpg)

---










