[機械学習・進化計算による株式取引最適化] No.01-02 環境構築

個人での開発の環境を構築しますので,セキュリティ的には適当な箇所があります.くれぐれも複数人開発や社内・研究室内での環境構築の参考にはしないでください.

必要なもの

  • USBメモ
  • 計算用PC
  • 根気

参考に私がこの記事を書くにあたり,実験したPCのスペックを載せておきます.

  • GTX 2070
  • CPU i7-5960X
  • Memory : 32GB

以下、通常PCと計算用PCの2つでの作業になります。

Linuxのインストール

インストールメディアの作成

通常PCでの作業
Ubuntu ServerのISOファイルを公式サイトからダウンロードしてきます.

Ubuntu Server :

https://ubuntu.com/download/server

記事作成時点でのバージョンは22.04.1 LTSです.

USBインストールメディアの作成ソフトRufusをダウンロードしてきます.
Rufus :

Rufus - 起動可能なUSBドライブを簡単に作成できます
Rufus: Create bootable USB drives the easy way

Rufusを起動します.

選択ボタンからダウンロードしたUbuntu ServerのISOファイルを選択し,下部のスタートボタンを押す.
イメージの書き込みが終わったらインストールメディアの作成完了.

Ubuntu Serverのインストール

計算用PCでの作業
初めにBIOSを起動し,Secure Bootの項目が無効化されていることを確認します(未設定の場合ははEnabledもしくはWindowsとなっており有効化されていることが多いです).
設定を保存し,USBインストールメディアを刺して再起動します.![]
BootMenue(もしくはBootOption)からインストールメディアを選択して,インストール画面に入ります.

Try or Install Ubuntu Serverを選択してインストールを始めます.

初めに言語選択が表示されます.Englishを選択します.

インストーラをアップデートするかを聞かれます.without updatingを選択します()

キーボードレイアウトを聞かれます.好きなのを選んでください.SSHで接続するので,ほとんど関係ないです.

Ubuntuを最小構成にするかを聞かれます.どちらでもいいです.m


IPアドレスの設定を聞かれます.固定IPの人はここでIPを設定したほうが楽です.

プロキシを使っているかを聞かれます.使ってない人は空白で次へ.

Ubuntuのアーカイブミラーを聞かれます.特に思い入れがない人は次へ.

インストールするディスクを聞かれます.

インストールの構成の詳細が確認されます.

最終確認がでます.Continueを押してインストールを始めます.

名前,ホスト名,ユーザーネーム,パスワードが聞かれます.

SSHサーバーをインストールするか聞かれます.チェックを入れて次へ(Import SSH identityはNoでも大丈夫です).Nvidia driverも聞かれるかもしれませんが,Nvidia driverは後で入れます.

その他のソフトを追加でインストールするか聞かれます.何も選択せずに次へ.

インストールログが表示されます.インストールが終わるまで待ちます.

Reboot Nowが表示されたらそれを押して再起動します.

以降の作業はSSH接続にて行います.
作業用PCでの作業
Windows10以降のPCであれはSSH Clinetが入っています.
「設定 > アプリ > オプション機能」の一覧にOpenSSHクライアントがあれば大丈夫です.なければ,「オプション機能を追加する」からOpenSSHクライアントを入れてください.
PowerShellやコマンドプロンプト,Windows Terminalなどの端末から

ssh user name@ip address
#例 ユーザー名comlew,ipアドレス192.168.0.10
#ssh comlew@192.168.0.10

とすることで,計算用PCにログインできます.ユーザーのパスワードを聞かれるので入力するとログインできます.また,初回ログイン時にはsshの情報を保存するかを聞かれます.yesで問題ないです.
以降,このログインした状態で環境構築を続けます.

updateとnvidia driverのインストール

はじめにubuntuのaptのアップデートをします.

comlew@comlewpc:~$ sudo apt update
Hit:1 http://jp.archive.ubuntu.com/ubuntu jammy InRelease
Get:2 http://jp.archive.ubuntu.com/ubuntu jammy-updates InRelease [114 kB]
Get:3 http://jp.archive.ubuntu.com/ubuntu jammy-backports InRelease [99.8 kB]
Get:4 http://jp.archive.ubuntu.com/ubuntu jammy-security InRelease [110 kB]
Get:5 http://jp.archive.ubuntu.com/ubuntu jammy-updates/main amd64 Packages [818 kB]
Get:6 http://jp.archive.ubuntu.com/ubuntu jammy-updates/universe amd64 Packages [783 kB]
Fetched 1,925 kB in 2s (774 kB/s)
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
59 packages can be upgraded. Run 'apt list --upgradable' to see them.

そのあとにupgradeをします.yを入力してアップグレードを完了させます.

comlew@comlewpc:~$ sudo apt upgrade
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
Calculating upgrade... Done
The following packages were automatically installed and are no longer required:
  libflashrom1 libftdi1-2
Use 'sudo apt autoremove' to remove them.
The following NEW packages will be installed:
  python3-magic systemd-hwe-hwdb
The following packages will be upgraded:
  apport apt apt-utils cloud-init cryptsetup cryptsetup-bin cryptsetup-initramfs distro-info-data dmidecode fwupd gzip
  initramfs-tools initramfs-tools-bin initramfs-tools-core libapt-pkg6.0 libcryptsetup12 libfwupd2 libfwupdplugin5
  libglib2.0-0 libglib2.0-bin libglib2.0-data libldap-2.5-0 libldap-common libnetplan0 libnftables1 libnss-systemd
  libpam-systemd libpython3-stdlib libsasl2-2 libsasl2-modules libsasl2-modules-db libsystemd0 libudev1 netplan.io
  nftables open-vm-tools python3 python3-apport python3-distupgrade python3-distutils python3-gdbm python3-lib2to3
  python3-minimal python3-problem-report python3-software-properties python3-tz python3-update-manager rsync
  software-properties-common sosreport sudo systemd systemd-sysv systemd-timesyncd tmux ubuntu-advantage-tools
  ubuntu-release-upgrader-core udev update-manager-core
59 upgraded, 2 newly installed, 0 to remove and 0 not upgraded.
Need to get 19.7 MB of archives.
After this operation, 1,002 kB disk space will be freed.
Do you want to continue? [Y/n]

最後に起動中のサービスを再起動するか聞かれます.特に弄らないでいいので,OKを選択します.
Nvidia driverをインストールします.多くの場合では最新版で問題ありません.apt installの際に,「nvidia-driver-」と入力後Tabキーを押せば,インストールできる候補が表示されます.

comlew@comlewpc:~$ sudo apt install nvidia-driver-
nvidia-driver-390         nvidia-driver-450         nvidia-driver-470-server  nvidia-driver-520
nvidia-driver-418         nvidia-driver-450-server  nvidia-driver-495         nvidia-driver-520-open
nvidia-driver-418-server  nvidia-driver-455         nvidia-driver-510         nvidia-driver-525
nvidia-driver-430         nvidia-driver-460         nvidia-driver-510-server  nvidia-driver-525-open
nvidia-driver-435         nvidia-driver-460-server  nvidia-driver-515         nvidia-driver-525-server
nvidia-driver-440         nvidia-driver-465         nvidia-driver-515-open
nvidia-driver-440-server  nvidia-driver-470         nvidia-driver-515-server

今回はnvidia-driver-525にしました.

sudo apt install nvidia-driver-525

と入力し,yを入力して数分待てばインストールが終わります.
最後に起動中のサービスを再起動するか聞かれます.特に弄らないでいいので,OKを選択します.
nvidia-driverの有効化を反映させるために再起動します.

sudo reboot

再起動するとSSH接続が切れるので,数分まってから再度SSH接続をします.
再起動したらNvidia driverが有効化されていることを確認します.nvidia-smiと入力し,指しているグラボが表示されたら問題ないです.

comlew@comlewpc:~$ nvidia-smi
Sun Jan 15 08:27:04 2023
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 525.60.11    Driver Version: 525.60.11    CUDA Version: 12.0     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  NVIDIA GeForce ...  Off  | 00000000:01:00.0 Off |                  N/A |
|  0%   47C    P8    21W / 220W |      1MiB /  8192MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+

Sambaのインストール

共有ディレクトリを作って,作業用PCから直接プログラムを編集できるようにします.
まずはのshell-sessionインストールをします.

sudo apt install samba

次に共有ディレクトリを作り,権限を権限をフルアクセス状態にします.

mkdir work_share
chmod 777 work_share

sambaの設定ファイルを開いて編集します.

sudo nano /etc/samba/smb.comf

設定ファイルの一番下に追記します.

[work_share]
  path = /home/comlew/work_share
  read only = no
  browsable = yes
  writable = yes
  guest ok = no
  create mode = 0777
  directory mode = 0777

nanoの閉じ方は[Ctrl+X]の後に保存するか聞かれるので[y]を押し,保存ファイル名を変更せずに[Enter]でOKです.
共有ディレクトリにアクセスできるユーザーを登録します.Linuxのユーザー名と同じものにします.

sudo pdbedit -a [ユーザー名]

設定が終わったらSambaを再起動します.

sudo systemctl restart smbd

計算機のIPアドレスを調べます.わからない場合(SSH接続しているのでそんなことありませんが)はifconfigによって調べます.まずはnet-toolsを入れます.

sudo apt install net-tools

そのあとにifconfigを打って,返ってきた結果からIPアドレスを確認します.

comlew@comlewpc:~$ ifconfig
eno1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.0.18  netmask 255.255.255.0  broadcast 192.168.0.255
        inet6 fe80::a62:66ff:fe81:b673  prefixlen 64  scopeid 0x20<link>
        ether 08:62:66:81:b6:73  txqueuelen 1000  (Ethernet)
        RX packets 83606  bytes 14405820 (14.4 MB)
        RX errors 0  dropped 125  overruns 0  frame 0
        TX packets 4485  bytes 523077 (523.0 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
        device interrupt 20  memory 0xfb300000-fb320000

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 760  bytes 54320 (54.3 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 760  bytes 54320 (54.3 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

上記の例だと127.0.0.1は自分を指す特殊IPなので,192.168.0.18がこのPCのIPアドレスになります.

Windowsのエクスプローラーの検索欄から[¥¥IPアドレス¥共有名]と打ち共有ディレクトリを検索します.

「ネットワーク資格情報の入力」が表示されます.pdbeditで登録した内容を入力します.画像中だとパスワードを一度ミスり,アクセスが拒否されてしまいました.

この本のプロジェクトファイルはこの共有ディレクトリに置きます.

Docker(Nvidia Docker)のインストール

Dockerのインストール

初めにDockerをインストールします.
Docker.comのhttps://docs.docker.com/engine/install/ubuntu/を参考にしました.
まずは関連・必要ソフトを入れます.

sudo apt install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

次にGPGキーを追加します.

sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

そして,レポジトリを追加します.

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

アップデートします.

sudo apt update

最後にDockerおよびDocker Composeを入れます.

sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin

以下のテストコードでエラーが表示されなければDockerのインストールは成功です.

comlew@comlewpc:~$  sudo docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
2db29710123e: Pull complete
Digest: sha256:aa0cc8055b82dc2509bed2e19b275c8f463506616377219d9642221ab53cf9fe
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

Docker Composeもversionが表示されれま問題ないです.

comlew@comlewpc:~$ docker compose version
Docker Compose version v2.14.1

Nvidia Dockerのインストール

通常のDockerだけだと,GPUを認識できず,利用できません.なのでNvidia Dockerという追加ソフトを入れて,DockerからGPUを利用できるようにします.
参考はdocs.nvidia.comのhttps://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.htmlです.
初めにGPGキーとレポジトリを追加します.

distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
      && curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
      && curl -s -L https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.list | \
            sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
            sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list

アップデートします

sudo apt update

nvidia-docker2をインストールします.

sudo apt install nvidia-docker2

dockerのサービスを再起動します.

sudo systemctl restart docker

docker上のコンテナでnvidia-smiコマンドが使えるかテストします.

sudo docker run --rm --gpus all nvidia/cuda:11.6.2-base-ubuntu20.04 nvidia-smi

無事GPUがコンテナ上から認識できていればOKです.

comlew@comlewpc:~$ sudo docker run --rm --gpus all nvidia/cuda:11.6.2-base-ubuntu20.04 nvidia-smi
Unable to find image 'nvidia/cuda:11.6.2-base-ubuntu20.04' locally
11.6.2-base-ubuntu20.04: Pulling from nvidia/cuda
846c0b181fff: Pull complete
b787be75b30b: Pull complete
40a5337e592b: Pull complete
8055c4cd4ab2: Pull complete
a0c882e23131: Pull complete
Digest: sha256:9928940c6e88ed3cdee08e0ea451c082a0ebf058f258f6fbc7f6c116aeb02143
Status: Downloaded newer image for nvidia/cuda:11.6.2-base-ubuntu20.04
Tue Jan 17 13:42:33 2023
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 525.60.11    Driver Version: 525.60.11    CUDA Version: 12.0     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  NVIDIA GeForce ...  Off  | 00000000:01:00.0 Off |                  N/A |
|  0%   36C    P8    18W / 220W |      1MiB /  8192MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+

その他設定・ソフト追加

Dockerをsudoなしで実行

デフォルトだとDockerコマンドは多くの場合sudoが必要です.ここでは面倒なのでsudoは取ります.
ユーザをdockerグループに追加します.

sudo gpasswd -a $USER docker

dockerを再起動して,端末(ユーザー)からログアウトします.

sudo systemctl restart docker
exit

再度SSH接続し,計算機用PCにログインします(通常PCでの操作).

ssh [username]@[ip address]

ログイン後,psコマンド等でdockerコマンドがsudoなしで利用できることを確認します.

comlew@comlewpc:~$ docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

Screenコマンドのインストール

SSH接続で作業もしくはプログラムを実行している最中に,ネットワークエラーやタイムアウトなどの理由で接続が強制的に切られることがあります.長期的なプログラムを実行中に途中でSSHを切られると,プログラムは強制終了されるのでこれは困ります.
これの対策方法はいくつかあるのですが,ここでは仮想端末ソフトであるscreenコマンドによって解決します.
screenコマンドは内部的(仮想的)に端末(ターミナル)を作成し,実際の端末と切り替えられるコマンドです.この仮想端末は生成元である端末が終了しても,強制的に終了しない限り残り続けます.
インストールは簡単でaptで入れるだけです.

sudo apt install screen

screenのコマンドはとりあえず5種類ほど覚えておけばよいです.

  1. screen(仮想端末の生成と仮想端末へのログイン)の生成
screen
  1. 仮想端末からのデタッチ(脱出).脱出は終了と異なり,実行中のプログラム・プロセスは保持されます.
[Ctrl + a] → [Ctrl + d]
  1. 現在実行中の仮想端末一覧の表示.この一覧の最初の数字が仮想端末のPIDです.
comlew@comlewpc:~$ screen -ls
There is a screen on:
        7141.pts-0.comlewpc     (01/17/2023 02:04:50 PM)        (Detached)
1 Socket in /run/screen/S-comlew.
comlew@comlewpc:~$
  1. 仮想端末へのアタッチ(入出)
screen -r [PID]

また,SSHの接続終了などが原因で仮想端末をデタッチできずに抜けてしまうと,[-r]オプション単体では再度アタッチできません.その場合は[-d]オプションを追加します.

screen -d -r [PID]
  1. 仮想端末の終了.SSH(端末)の終了コマンド[exit]と同じですが,仮想端末内でexitを押してもSSH(端末)は終了しません.
exit

ファイル・ディレクトリ・プログラム編集

プログラムの編集やファイル操作は何を利用してもらっても構いません.
筆者はVisual Studio Codeを利用しています.
Visual Studio Codeはazure.microsoft.comからダウンロード・インストールできます.

Visual Studio Code – コード エディター | Microsoft Azure
ほぼすべての言語で動作し、任意の OS で実行される強力なコード エディターである Visual Studio Code を使用して、Azure 上で編集、デバッグ、デプロイを行います。

インストール出来たら,フォルダを開く(Open)からSambaの共有ディレクトリのパスを入力します.

プログラム編集やファイル作成等は,ここで行うとよいでしょう.

また,Linux上で生成したファイルもしくはディレクトリが,Windows上のエクスプローラーからは削除できない場合があります.
そんなときは,Linux上から削除しましょう.
ファイルを削除したいときは「rm」コマンドです.

rm ファイル名

ディレクトリ(中のファイルも)を削除したいときは「-rf」オプションを付けます.

rm -rf ディレクトリ名
タイトルとURLをコピーしました