1. 程式人生 > >ubuntu16.04安裝Anaconda、Gym和 Universe

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)有智慧,可以玩這些遊戲比人更厲害。