生命不息,折騰不止:Jetson Nano填坑之軟體篇

雲水木石發表於2019-05-06

生命不息,折騰不止:Jetson Nano填坑之軟體篇

題圖:攝於武大凌波門

作為一名每天對著各種裸板的系統工程師,對Jetson Nano會踩到各種坑是做好了充分準備的,本著踩坑填坑的精神,在這裡記錄一下踩坑經歷,供大家一樂。如何避開這些坑?想多了,因為以後你們即使繞開了這些坑,也會有其它的坑等著你:) 重要的是要做到人擋殺人、佛擋殺佛,遇到坑直接趟過去。

安裝軟體遇到鎖

使用apt-get install命令安裝軟體包,遇到如下提示:

alex@alex-jetson-nano:~$ sudo apt-get install xrdp
[sudo] password for alex: 
E: Could not get lock /var/lib/dpkg/lock-frontend - open (11: Resource temporarily unavailable)
E: Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), is another process using it?

複製程式碼

重啟後什麼操作也不做,安裝軟體包,提示依舊。

填坑指南:

首先檢視一下是否有apt程式在工作:

alex@alex-jetson-nano:~$ ps aux | grep -i apt
root      6569  0.0  0.0   1912   496 ?        Ss   10:37   0:00 /bin/sh /usr/lib/apt/apt.systemd.daily update
root      6582  0.0  0.0   1912  1272 ?        S    10:37   0:00 /bin/sh /usr/lib/apt/apt.systemd.daily lock_is_held update
_apt      7736  5.4  0.1  19552  8036 ?        S    10:41   0:20 /usr/lib/apt/methods/http
alex      7883  0.0  0.0   7416   640 pts/0    R+   10:47   0:00 grep --color=auto -i apt
複製程式碼

可以看到系統在做每日檢查更新,解決的方法很簡單,關閉每日更新檢查:

System Settings | Software & Updates,在Updates頁,Automatically check for updates,選擇Never

遠端連線

沒有為Jetson Nano單獨配顯示器,和開發機共用,但兩者都是用的HDMI介面,這樣每次切換顯示都必須插拔HDMI線,很是麻煩,這個時候就需要遠端連線。

有兩種使用遠端登入Jetson Nano的方法,一種是通過SSH協議登入,這種方法時延小,佔用資源少,但只支援命令列。另一種就是通過RDP(Remote Desktop Protocol)協議,支援GUI,熟悉Windows的朋友可能知道Windows支援遠端登入,在Ubuntu系統上,也能達到同樣的效果。

Jetson Nano採用的是Ubuntu桌面系統,要支援遠端桌面協議很簡單:

sudo apt-get update
sudo apt-get install xrdp
複製程式碼

然而在我的開發機上使用Remmina Remote Desktop Client軟體,配置好各種引數進行連線,總是一閃而過,退出應用。開始懷疑是Remmina Remote Desktop Client相容性存在問題,後來換Windows下的遠端登入,依然如此。檢視$HOME/.xorgxrdp.10.log日誌,可以看到Server端主動退出。

填坑指南:

和普通Ubuntu桌面系統不同的是,Jetson Nano並不支援兩個客戶端同時登入。安裝時為了省事,選擇了自動登入系統,這樣每次Jetson Nano每次啟動,就會有一個使用者登入進去,這個時候我再遠端登入就會被拒絕。解決方法是,編輯 /etc/gdm3/custom.conf 檔案,找到AutomaticLoginEnableAutomatic Login行,註釋掉:

sudo vi /etc/gdm3/custom.conf

# AutomaticLoginEnable=true
# Automatic Login=[user1]
複製程式碼

無法匯入cv2模組

Jetson Nano系統預設python為2.7版本,然而安裝tensorflow-gpu卻需要Python3,在Python3下匯入opencv模組,出現如下錯誤:

(tensorflow-gpu) alex@alex-jetson-nano:~$ python3
Python 3.6.7 (default, Oct 22 2018, 11:32:17) 
[GCC 8.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'cv2'
>>>
複製程式碼

使用預設的2.7版本python,則無此問題。

填坑指南:

系統預設為python 2.7安裝了opencv模組,但python3沒有,需要自己安裝:

sudo apt-get install python3-opencv
複製程式碼

這樣安裝到系統python3的環境中,如果你使用了python虛擬環境,而建立虛擬環境時沒有新增 --system-site-package 引數,在虛擬環境中依然會有問題,解決方法,刪除掉虛擬環境中的no-global-site-packages.txt檔案。假如虛擬環境名為tensorflow-gpu,命令如下:

rm ~/.virtualenvs/tensorflow-gpu/lib/python3.6/no-global-site-packages.txt
複製程式碼

python虛擬環境

要說到python的版本問題,python程式設計師絕對一把鼻涕一把淚。python 2和python 3之間不相容的問題由來已久,到目前,python 3也沒有把python 2幹掉,兩者尷尬的共存著。除了python本身,python第三方軟體包的版本問題也是讓人頭大。好在我們可以藉助python虛擬環境來解決這一問題。python虛擬環境和虛擬機器不同,僅僅是做一個環境隔離,完全不存在效能損失,非常適用於python 程式。在開發機上,我使用的是anaconda包,然而,anaconda的linux版本只出了x86 32位和64位架構的包,並沒有arm64的包。無奈之下,我只能選擇python的virtualenv工具。

填坑指南:

virtualenv本身就已經夠用,不過為了方便管理,我還是使用了一個wrapper,這實際上就是用指令碼在virtualenv上封裝了一層,方便使用:

sudo apt-get install virtualenvwrapper
複製程式碼

為了方便使用這些指令碼,我在 $HOME/.profile 檔案中新增了一行:

source /usr/share/virtualenvwrapper/virtualenvwrapper.sh
複製程式碼

建立虛擬名為tensorflow-gpu的虛擬環境:

mkvirtualenv -p /usr/bin/python3 --system-site-package tensorflow-gpu
複製程式碼

啟用虛擬環境

workon tensorflow-gpu
複製程式碼

退出虛擬環境

deactivate
複製程式碼

安裝tensorflow

Jetson Nano出廠系統並沒有自帶TensorFlow環境,早先甚至連官方支援都沒有,所以網上有很多安裝Tensorflow的指南,及其複雜,好在Nvidia意識到了這個問題,給出了官方支援。

填坑指南:

安裝依賴包:

sudo apt-get install libhdf5-serial-dev hdf5-tools
sudo apt-get install python3-pip
pip3 install -U pip
sudo apt-get install zlib1g-dev zip libjpeg8-dev libhdf5-dev
sudo pip3 install -U numpy grpcio absl-py py-cpuinfo psutil portpicker grpcio six mock requests gast h5py astor termcolor
複製程式碼

注意有些步驟特別慢,以至於我以為安裝包被牆了,重試了幾次仍然這樣,後來才弄清楚有些包是需要即時編譯的,所以會比較慢,需要耐心等待。

然後安裝最新的tensorflow-gpu:

pip3 install --pre --extra-index-url https://developer.download.nvidia.com/compute/redist/jp/v42 tensorflow-gpu
複製程式碼

如果要安裝指定版本:

pip3 install --extra-index-url https://developer.download.nvidia.com/compute/redist/jp/v42 tensorflow-gpu==$TF_VERSION+nv$NV_VERSION
複製程式碼

其中,TF_VERSION是TensorFlow的釋出版本,比如1.12.0。NV_VERSION為Tensorflow的NVIDIA容器版本,比如19.01。

小結

在使用Jetson Nano中,還碰到很多稀奇古怪的問題,這裡沒法一一寫出,解決問題主要靠Google,當然Nvidia開發者論壇的Nano版塊也值得去看一看,其地址為:devtalk.nvidia.com/default/boa… 在上面我試著用蹩腳的英文向其他開發者提問,收到了不少回應。

生命不息,折騰不止,其實Jetson nano最大的樂趣就是折騰,可以預料以後還會踩各種坑,不過相比軟體的坑,硬體的坑更大,畢竟那還要投入真金白銀,下一篇我將寫寫硬體上的坑,敬請關注。

image

相關文章