ubuntu16.04安裝Anaconda、Gym和 Universe
1.對於 Ubuntu 16.04,請先執行以下程式,以確保 apt 軟體包列表是最新的:
sudo apt-get update
2.接著我們來安裝一些軟體:
sudo apt-get install golang python3-dev python-dev libcupti-dev libjpeg-turbo8-dev make tmux htop chromium-browser git cmake zlib1g-dev libjpeg-dev xvfb libav-tools xorg-dev python-opengl libboost-all-dev libsdl2-dev swig
3.接下來,我們安裝 Anaconda,以便用 Anaconda 來建立與系統環境獨立開來的 Anaconda 虛擬環境。我們之後的開發環境都會在這個虛擬環境裡安裝配置。
目前,Anaconda 的 Python 3.5 版本與 Universe 專案配合最好。如果用 Anaconda 的最新版本,也許不能很好地安裝 Universe。
我們可以用 wget 命令(如果沒有安裝 wget,請使用 sudo apt install wget
來安裝。不過 Ubuntu 裡一般自帶了)來獲取 Anaconda 的 Python 3.5 版本:
wget https://repo.continuum.io/archive/Anaconda3-4.2.0-Linux-x86_64.sh
這個 Anaconda 安裝程式有 456 MB,因此下載時間視你的網速而定,需要等一會。你可以去泡杯咖啡,或者熱一隻烤雞。
下載完之後,我們來安裝 Anaconda,可以用 Bash 這個 Shell 軟體來安裝,當然如果你是 zsh 或其他 Shell 軟體也可以用其他命令來安裝 :
bash Anaconda3-4.2.0-Linux-x86_64.sh
提示資訊說「Please press ENTER to continue」,也就是「請按下 回車鍵 以繼續」,所以我們按下回車鍵。
接著安裝程式會顯示 Anaconda 的 License 就是一些證書和條款之類的資訊:
不用看,直接用 空格鍵 翻頁,然後翻到最後,看到顯示這樣一句話:
「Do you approve the license terms」,也就是「是否同意證書條款」 ,輸入「yes」,
然後 回車。回車之後,又出現了下面的提示:
就是告訴你:Anaconda 的程式將會預設安裝在你的家目錄下的 anaconda3 目錄中(我的情況是在 /home/mooc/anaconda3,因為我的使用者名稱是 mooc )。輸入 回車 表示確認安裝在預設目錄中,如果你在提示符 >>> 後面輸入其他路徑,則會安裝在你指定的其他路徑下。
我們按 回車(ENTER)選擇預設的路徑來安裝即可。
按下 回車 之後,就開始安裝 Anaconda 了(包含一些基礎軟體環境),會花一些時間:
稍等片時,安裝完成,顯示如下資訊:
確認是否將 Anaconda 的子目錄 bin 加入系統 PATH 環境變數
輸入「yes」的話,安裝程式就會做以下操作:
在你的 Shell 的配置檔案中,比如如果你的 Shell 是 Bash 的話,就會在 ~/.bashrc 檔案中加入下面這句命令:
export PATH="/home/zhiqianghe/anaconda3/bin:$PATH"
就是把 Anaconda 的安裝目錄下的 bin 目錄的路徑( /home/$USER/anaconda3/bin )新增到 PATH 環境變數的最前面。
然後會做
source ~/.bashrc
使改動立即生效。
如果輸入「no」的話,表示不需要安裝程式幫你自動新增,之後可以自己新增:
我比較喜歡自己新增,這樣我可以把 Anaconda 的 bin 目錄的路徑加入到 PATH 環境變數的最後,而不是最前。這樣可以避免在命令列中輸入 python 時呼叫的是 Anaconda 中的 python 程式。
如果你的預設 Shell 是 Bash 的話,就用文字編輯器在 ~/.bashrc 中新增下面這句命令:
export PATH="/home/zhiqianghe/anaconda3/bin:$PATH"
就是把 Anaconda 的安裝目錄下的 bin 目錄的路徑( /home/$USER/anaconda3/bin )新增到 PATH 環境變數的最後面。
儲存,退出編輯器,然後在命令列輸入:
source ~/.bashrc
使改動立即生效。
然後用
echo $PATH
來顯示 PATH 環境變數的值,可以看到 /home/$USER/anaconda3/bin($USER 就是你的當前使用者,比如我是 mooc )這個路徑已經新增在 PATH 變數的最後了:
/home/$USER/anaconda3/bin 已經新增在 PATH 變數的最後
如果你的 Shell 是 zsh,那麼請改動你的 ~/.zshrc 檔案。其他的 Shell 程式也類似。
這樣,我們的 Anaconda 就安裝配置好了。接下來,我們可以用 Anaconda 來建立一個虛擬環境,可以起名叫 universe(當然,你也可以取其他名字):
conda create --name universe python=3.5 anaconda
回車後,會讓我們確認是否要安裝列出的軟體到這個虛擬環境中:
預設是「y」,表示 yes,就是同意。我們按下 回車 即可。
它就開始下載安裝那些軟體到虛擬環境中了:
下載安裝會花一段時間,依網速而定。這時候你可以喝一喝咖啡,或者吃一下之前熱的烤雞。
經過一定時間的等待,虛擬環境建立完畢:
然後,我們可以隨時用以下命令來啟用並進入環境中:
source activate universe
activate 是英語「啟用」的意思。
用以下命令可以退出虛擬環境:
source deactivate universe
deactivate 是英語「滅活」的意思。
這裡的 universe 是我們建立的虛擬環境的名字,你的情況可能不是叫這個名字,那麼請根據你的虛擬環境的名字來更改命令。
你可以執行下面的命令來看看你有哪些虛擬環境:
conda env list
conda env list 命令顯示所有虛擬環境
可以看到預設 Anaconda 有個環境,名字叫 root,就是 Anaconda 安裝的所在。這個環境預設是不啟用的。
看到我們建立的 universe 那個環境了嗎?目前它沒有被啟用(相當於「選中並進入」),因此星號(*)表示的當前的虛擬環境還是在 root 上。
如果我們用
source activate universe
命令來進入 universe 這個虛擬環境,那麼命令列的提示符會變樣:
命令列提示符前面多了 (universe) 字樣,表示目前在此虛擬環境中
此時,我們再用
conda env list
來列出所有的虛擬環境:
星號指在 universe 的上面,表示 universe 是被啟用的虛擬環境
可以看到目前星號(*)由原先的 root 變到了 universe 上,說明 universe 是目前被啟用的虛擬環境。
如果你用
source deactivate universe
來退出 universe 這個虛擬環境,則命令列提示符又變回原來的樣子:
可以看到命令列提示符的 (universe) 字首消失,說明我們已經不在 universe 這個虛擬環境中了。
當然了,說是虛擬環境中,其實所在的真實目錄還是本系統的目錄,你可以用 cd 命令去切換到各個目錄,只不過你的 Python 的開發環境的所有軟體和引數什麼的都是用的此虛擬環境的了,而不是系統的了。
比如你如果再進入 universe 虛擬環境,並且輸入 python 命令,可以看到它顯示的 Python 的直譯器是 Anaconda 版本的:
虛擬環境中的 Python 直譯器和作業系統的不一樣
如果用
conda list
可以列出當前虛擬環境資訊:
conda list 命令會列出當前虛擬環境的資訊 1
conda list 命令會列出當前虛擬環境的資訊 2
如果要刪除虛擬環境,使用下面的命令:
conda remove --name <env name> --all
其中 <env name> 表示要刪除的虛擬環境的名字,比如我們建立的 universe。
要在虛擬環境中安裝軟體,用下面的命令:
conda install xxx
xxx 表示要安裝的軟體名稱。
好的,那麼,既然我們已經用 Anaconda 建立了我們的 虛擬環境,起名叫 universe,那麼現在我們繼續配置我們的開發環境,在 universe 這個虛擬環境中安裝我們所要用的軟體。
首先,我們要確保自己位於建立的虛擬環境中:
source activate universe
然後,安裝一些額外的軟體:
conda install pip six libgcc swig
按 回車,表示同意安裝或升級軟體。
然後我們再安裝 OpenCV :
conda install opencv
按 回車,表示同意安裝。
安裝 Docker
接著我們來安裝 Docker 這個軟體:
sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
如果是 Ubuntu 14.04,則還需要執行下面的一句命令:
sudo apt-get install linux-image-extra-$(uname -r) linux-image-extra-virtual
接著,我們執行如下命令:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
這裡如果出現什麼網路上的錯誤,我們可以將其換成手機熱點
再執行下面的命令:
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
再做一次 apt 列表的升級:
sudo apt-get update
接著,就可以安裝 Docker 了:
sudo apt-get install docker-ce
被詢問是否安裝時,輸入「y」,再按 回車。
安裝完 Docker,我們來測試一下安裝是否成功。
首先,我們啟動 Docker 服務:
sudo service docker start
執行以下命令來讓 Docker 給我們輸出一些資訊:
sudo docker run hello-world
Docker 輸出 "Hello from Docker !",表示安裝成功
可以看到上面我們都是以 root 的身份執行 Docker 的命令。為了讓我們之後每次執行 Docker 不需要用 root 身份而只需要用我們的普通使用者身份,我們可以這樣做:
sudo groupadd docker
上面的命令是為了建立一個使用者組,叫做 docker。
然後,我們再把我們當前所在的使用者新增到 docker 這個使用者組裡:
sudo usermod -aG docker $USER
接著,重啟一下電腦:
sudo reboot
重啟以後,加入你遇到 Docker 的連線問題,可以嘗試依次執行下面的幾句命令來解決:
sudo groupadd docker
sudo gpasswd -a ${USER} docker
sudo service docker restart
sudo reboot
至此,Docker 安裝完畢。
安裝 Gym
接著,我們安裝 OpenAI Gym。
首先,先確認你還在 universe 這個虛擬環境裡:
命令列提示符前面有 (universe) 字樣,表示目前在此虛擬環境中
然後我們用 git 來獲取 Gym 的程式碼,依次執行下面兩句命令:
cd ~
git clone https://github.com/openai/gym.git
進入 gym 目錄,然後安裝 Gym。依次執行下面兩句命令:
cd ~/gym
pip install -e '.[all]'
目前的最新版的 Gym 的那個 MuJoCo 的模組有些問題,似乎安裝不上,MuJoCo 本身也比較特殊,需要一些額外配置。
MuJoCo 是 Multi-Joint dynamics with Contact 的縮寫。表示「有接觸的多關節動力」是用於機器人、生物力學、動畫等需要快速精確模擬領域的物理引擎。
官網:http://mujoco.org
所以不出意外地話,上面的命令
pip install -e '.[all]'
會出錯:
比較簡單的規避錯誤的方法就是在 gym 目錄下的
setup.py 這個檔案裡去掉 MuJoCo 的安裝選項:
比如說用 vim 或 atom 文字編輯器(隨便你用什麼文字編輯器)來開啟 ~/gym/setup.py
這個檔案:
vim ~/gym/setup.py
註釋掉 setup.py 檔案中和 MuJoCo 有關的安裝選項
如上圖所示,我們可以暫時把和 MuJoCo 相關的安裝選項都註釋掉。把
'mujoco': ['mujoco_py>=1.50', 'imageio'],
'robotics': ['mujoco_py>=1.50', 'imageio'],
這兩句註釋掉,不讓它被安裝,將其改為:
#'mujoco': ['mujoco_py>=1.50', 'imageio'],
#'robotics': ['mujoco_py>=1.50', 'imageio'],
儲存,退出 setup.py 檔案的編輯。
然後,重新執行以下命令:
pip install -e '.[all]'
這次就可以安裝成功了,安裝的是 Gym 的最新版本。
Gym 官方的 Github 上說如果你之後還是需要安裝 MuJoCo 的話,可以嘗試執行:
pip install -e '.[mujoco]'
來單獨安裝。這裡我們不理會 MuJoCo,因為暫時用不到。
安裝 Universe
安裝完了 Gym,我們終於可以進入 Linux 中安裝 Gym 和 Universe 之旅的最後一站了:安裝 Universe。
和安裝 Gym 類似,我們首先用 git 來獲取 Universe 的程式碼(請確認你始終位於你用 Anaconda 建立的虛擬環境中),依次執行下面兩句命令:
cd ~
git clone https://github.com/openai/universe.git
然後進入 universe 目錄,安裝 Universe。依次執行下面兩句命令:
cd ~/universe
pip install -e .
安裝 Universe 成功。
寫程式測試 Gym 和 Universe
我們可以寫幾個 Python 的程式來測試一下 Gym 和 Universe。
比如我們可以建立一個檔案,叫 test_universe1.py。
然後在裡面寫入以下程式碼:
import gym
import universe # register the universe environments
from universe import wrappers
env = gym.make('gym-core.PongDeterministic-v0')
env = wrappers.experimental.SafeActionSpace(env)
env.configure(remotes=1)
observation_n = env.reset()
while True:
action_n = [env.action_space.sample() for ob in observation_n]
observation_n, reward_n, done_n, info = env.step(action_n)
env.render()
上面的程式會啟動 Pong(乒乓球)這個遊戲。
儲存這個檔案。然後在命令列裡執行以下命令:
python test_universe1.py
但是不出意外的話,會有一個錯誤(略坑...):
我看了 Universe 的 Github 上的 Issue 裡的問題彙報,發現是 Gym 的 0.9.6 版本里把 benchmarks 這個包給去了:https://github.com/openai/universe/issues/228 。我暈...
所以我們可以解除安裝 Gym,重新安裝,但是是指定安裝 0.9.5 版本。
cd ~/gym
pip uninstall gym
pip install gym==0.9.5
希望 OpenAI 之後能解決這個問題...
現在我們再執行:
python test_universe1.py
就可以啟動環境了(第一次啟動環境時 Docker 需要下載一些檔案,需要等一會):
剛才運行了 Pong 這個簡單的遊戲,我們也可以來演示一個複雜一些的遊戲,比如 Universe 的官方 Github 上的例子 DuskDrive 這個賽車遊戲 。
我們建立一個新的檔案,可以起名叫 test_universe2.py。在裡面寫入如下程式碼:
import gym
import universe # register the universe environments
env = gym.make('flashgames.DuskDrive-v0')
env.configure(remotes=1) # automatically creates a local docker container
observation_n = env.reset()
while True:
action_n = [[('KeyEvent', 'ArrowUp', True)] for ob in observation_n] # your agent here
observation_n, reward_n, done_n, info = env.step(action_n)
env.render()
執行它:
python test_universe2.py
執行 Universe 裡面的遊戲 DuskDrive
當然,我們還可以寫程式碼來測試其他各種各樣的環境,比如再測試一個 Neon Race(霓虹賽車)的環境,加入一些小小的程式碼修改,讓它略微聰明些:
我們建立一個新的檔案,可以起名叫 test_universe3.py。在裡面寫入如下程式碼:
# -*- coding: UTF-8 -*-
"""
測試 Gym 和 Universe 環境是否正確安裝
"""
import random
import gym
import universe
env = gym.make('flashgames.NeonRace-v0') # 建立 NeonRace 的環境
env.configure(remotes=1) # 自動建立一個本地的 Docker 容器
observation_n = env.reset() # 重置環境,並且返回初始的 Observation
# 左轉和右轉
goleft = [('KeyEvent', 'ArrowUp', True), ('KeyEvent', 'ArrowLeft', True),
('KeyEvent', 'ArrowRight', False)]
goright = [('KeyEvent', 'ArrowUp', True), ('KeyEvent', 'ArrowLeft', False),
('KeyEvent', 'ArrowRight', True)]
# 向前加速
boostforward = [('KeyEvent', 'ArrowUp', True), ('KeyEvent', 'ArrowRight', False),
('KeyEvent', 'ArrowLeft', False), ('KeyEvent', 'n', True)]
sum_reward = 0
turn = 0
rewards = []
buffer_size = 100
action = boostforward
while True:
turn -= 1
if turn <= 0:
action = boostforward
turn = 0
# 根據速度來選擇 action
action_n = [action for ob in observation_n]
# 實行 action,返回細分的多個引數
observation_n, reward_n, done_n, info = env.step(action_n)
sum_reward += reward_n[0]
rewards += [reward_n[0]]
# 如果卡住了,嘗試向某一個方向開一會
if len(rewards) >= buffer_size:
mean = sum(rewards) / len(rewards)
if mean == 0:
turn = 25
if random.random() < 0.5:
action = goleft
else:
action = goright
rewards = []
env.render()
執行它:
python test_universe3.py
執行 Universe 裡面的遊戲 NeonRace
當然了,你也可以寫一個小程式單獨測試一下 Gym。我們建立一個新的檔案,可以起名叫 test_gym.py。在裡面寫入如下程式碼:
# -*- coding: UTF-8 -*-
import gym
env = gym.make('CartPole-v0')
for i_episode in range(100):
observation = env.reset()
for t in range(100):
env.render() # 更新動畫
action = env.action_space.sample()
observation, reward, done, info = env.step(action) # 推進一步
if done:
env.reset()
continue
執行它:
python test_gym.py
很有趣吧,更多環境等待你去發現、去實驗。你也可以配合一些強化學習的演算法來訓練你的環境,然後讓代理(agent)有智慧,可以玩這些遊戲比人更厲害。