File size: 7,704 Bytes
05c9ac2 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 |
๏ปฟ# ML-Agents ์ฉ ๋์ปค ์ฌ์ฉ๋ฒ
๋์ปค๋ฅผ ์ฌ์ฉํด ์ถ๋ก ๊ณผ ํ์ต์ ํ๊ณ ์ํ๋ Windows์ Mac ์ฌ์ฉ์๋ฅผ ์ํ ์๋ฃจ์
์ ์ ๊ณตํฉ๋๋ค.
์ด๊ฒ์ Python๊ณผ TensorFlow ์ค์น๋ฅผ ํผํ๊ณ ์ ํ๋ ๋ถ์๊ฒ ๋งค๋ ฅ์ ์ธ ์ต์
์ด ๋ ๊ฒ์
๋๋ค. ํ์ฌ ์ค์ ์ TensorFlow์ Unity๊ฐ _CPU๋ฅผ ํตํด์๋ง_
๊ณ์ฐํ๋๋ก ํฉ๋๋ค. ๋ฐ๋ผ์ ๋์ปค ์๋ฎฌ๋ ์ด์
์ GPU๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ์๊ฐ์ ๋ ๋๋ง์ ์ํด [`Xvfb`](https://en.wikipedia.org/wiki/Xvfb)๋ฅผ ์ฌ์ฉํฉ๋๋ค.
`Xvfb`๋ `ML-Agents`(๋๋ ๋ค๋ฅธ ์์ฉ ํ๋ก๊ทธ๋จ)๊ฐ ๊ฐ์์ผ๋ก ๋ ๋๋ง์ ํ ์ ์๊ฒํ๋ ์ ํธ๋ฆฌํฐ ์
๋๋ค. ์ฆ, `ML-Agents`๋ฅผ ์คํํ๋ ๊ธฐ๊ณ๊ฐ GPU๋ฅผ ๊ฐ์ง๊ณ ์๊ฑฐ๋
๋์คํ๋ ์ด๋ฅผ ๊ฐ์ง๊ณ ์๋ค๊ณ ๊ฐ์ ํ์ง ์์ต๋๋ค. ์ด๊ฒ์ ์นด๋ฉ๋ผ ๊ธฐ๋ฐ์ ์๊ฐ์ ๊ด์ฐฐ ์์๊ฐ ํฌํจ๋ ํ๊ฒฝ์ ๋์ฑ ๋๋ ค์ง ์๋ ์์์ ์๋ฏธํฉ๋๋ค.
## ์๊ตฌ์ฌํญ
- ์ ๋ํฐ _Linux Build Support_ ์ปดํฌ๋ํธ
- [๋์ปค](https://www.docker.com)
## ์ค์น
- ์ ๋ํฐ ์ธ์คํจ๋ฌ๋ฅผ [๋ค์ด๋ก๋](https://unity3d.com/kr/get-unity/download)ํ๊ณ _Linux Build Support_ ์ปดํฌ๋ํธ๋ฅผ ์ถ๊ฐํ์ญ์์ค.
- ๋์ปค๊ฐ ์ค์น๋์ด ์์ง ์๋ค๋ฉด [๋ค์ด๋ก๋](https://www.docker.com/community-edition#/download)ํ๊ณ ์ค์น ํ์ญ์์ค.
- ํธ์คํธ ๋จธ์ ๊ณผ ๋ถ๋ฆฌ๋ ํ๊ฒฝ์์ ๋์ปค๋ฅผ ์คํํ๊ธฐ ๋๋ฌธ์, ํธ์คํธ ๋จธ์ ์์ ๋ง์ดํธ๋ ๋๋ ํ ๋ฆฌ๋ ํธ๋ ์ด๋ ํ๊ฒฝ ์ค์ ํ์ผ,
์ ๋ํฐ ์คํ ํ์ผ, ์ปค๋ฆฌํ๋ผ ํ์ผ๊ณผ TensorFlow ๊ทธ๋ํ์ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํ๊ธฐ์ํด ์ฌ์ฉ๋ฉ๋๋ค.
์ด๋ฅผ ์ํด, ํธ์์ ๋น์ด์๋ `unity-volume` ๋๋ ํ ๋ฆฌ๋ฅผ ์ ์ฅ์์ ๋ฃจํธ์ ๋ง๋ค์์ผ๋, ๋ค๋ฅธ ๋๋ ํ ๋ฆฌ์ ์ฌ์ฉ์ ์์ ๋กญ๊ฒ ํ ์ ์์ต๋๋ค.
์ด ๊ฐ์ด๋์ ๋๋จธ์ง ๋ถ๋ถ์์๋ `unity-volume` ๋๋ ํ ๋ฆฌ๊ฐ ์ฌ์ฉ๋๋ค๊ณ ๊ฐ์ ํ๊ณ ์งํ๋ฉ๋๋ค.
## ์ฌ์ฉ๋ฒ
ML-Agents ์ฉ ๋์ปค ์ฌ์ฉ์๋ ์ธ ๋จ๊ณ๊ฐ ํฌํจ๋ฉ๋๋ค.: ํน์ ํ๋๊ทธ๋ฅผ ์ฌ์ฉํ์ฌ ์ ๋ํฐ ํ๊ฒฝ ๋น๋, ๋์ปค ์ปจํ
์ด๋ ๋น๋
๋ง์ง๋ง์ผ๋ก, ์ปจํ
์ด๋ ์คํ. ๋ง์ฝ ML-Agents ์ฉ ์ ๋ํฐ ํ๊ฒฝ ๋น๋์ ์ต์ํ์ง ์๋ค๋ฉด, [3D ๋ฐธ๋ฐ์ค ๋ณผ ์์ ์ ํจ๊ป ์์ํ๊ธฐ](Getting-Started-with-Balance-Ball.md) ๊ฐ์ด๋๋ฅผ ๋จผ์ ์ฝ์ผ์ญ์์ค.
### ํ๊ฒฝ ๋น๋ (์ต์
)
_ํ์ต์ ์ํด ์๋ํฐ ์ฌ์ฉ์ ์ํ๋ค๋ฉด ์ด ๋จ๊ณ๋ฅผ ๊ฑด๋๋ธ ์ ์์ต๋๋ค._
๋์ปค๋ ์ผ๋ฐ์ ์ผ๋ก ํธ์คํธ ๋จธ์ ๊ณผ (๋ฆฌ๋
์ค) ์ปค๋์ ๊ณต์ ํ๋ ์ปจํ
์ด๋๋ฅผ ์คํํ๊ธฐ ๋๋ฌธ์,
์ ๋ํฐ ํ๊ฒฝ์ ๋ฆฌ๋
์ค ํ๋ซํผ์ด ๊ตฌ์ถ๋์ด์ผ ํฉ๋๋ค. ์ ๋ํฐ ํ๊ฒฝ์ ๋น๋ํ ๋, ๋น๋ ์ธํ
์ฐฝ(Build Settings window)์์
๋ค์ ์ต์
์ ์ ํํด ์ฃผ์ญ์์ค:
- ํ๊ฒ ํ๋ซํผ์ `๋ฆฌ๋
์ค`๋ก ์ค์ (Set the _Target Platform_ to `Linux`)
- _์ํคํ
์ฒ_๋ฅผ `x86_64'๋ก ์ค์ (Set the _Architecture_ to `x86_64`)
- ํ๊ฒฝ์์ ์๊ฐ์ ์ธ ๊ด์ฐฐ์ ํ์๋ก ํ์ง์๋๋ค๋ฉด, `headless` ์ต์
์ ์ ํํ ์ ์์ต๋๋ค (์๋ ์ฌ์ง ์ฐธ์กฐ).
`๋น๋` (Build)๋ฅผ ํด๋ฆญํ๊ณ , ํ๊ฒฝ ์ด๋ฆ์ ์ ํํ๊ณ (์์: `3DBall`) ์ถ๋ ฅ ๋๋ ํ ๋ฆฌ๋ฅผ `unity-volume`์ผ๋ก ์ค์ ํ์ญ์์ค.
๋น๋ ํ์, ํ์ผ `<ํ๊ฒฝ ์ด๋ฆ>.x86_64` ์ ํ์๋๋ ํ ๋ฆฌ `<ํ๊ฒฝ ์ด๋ฆ>_Data/` ๊ฐ `unity-volume` ์ ์์ฑ ๋์ด์๋์ง ํ์ธํ์ญ์์ค.
![๋์ปค๋ฅผ ์ํ ๋น๋ ์ค์ ](images/docker_build_settings.png)
### ๋์ปค ์ปจํ
์ด๋ ๋น๋
์ฒซ ๋ฒ์งธ, ๋์ปค ๋จธ์ ์ด ์์คํ
์์ ์๋ํ๋์ง ํ์ธํ์ญ์์ค. ์ ์ฅ์์ ์ต์๋จ์์ ๋ค์ ๋ช
๋ น์ด๋ฅผ ํธ์ถํ์ฌ
๋์ปค ์ปจํ
์ด๋๋ฅผ ๋น๋ํ์ญ์์ค:
```sh
docker build -t <image-name> .
```
`<image-name>`์ ๋์ปค ์ด๋ฏธ์ง ์ด๋ฆ์ผ๋ก ๋ฐ๊พธ์ญ์์ค, ์์: `balance.ball.v0.1`.
### ๋์ปค ์ปจํ
์ด๋ ์คํ
์ ์ฅ์์ ์ต์๋จ์์ ๋ค์ ๋ช
๋ น์ด๋ฅผ ํธ์ถํ์ฌ ๋์ปค ์ปจํ
์ด๋๋ฅผ ์คํํ์ญ์์ค:
```sh
docker run --name <container-name> \
--mount type=bind,source="$(pwd)"/unity-volume,target=/unity-volume \
-p 5005:5005 \
<image-name>:latest \
--docker-target-name=unity-volume \
<trainer-config-file> \
--env=<environment-name> \
--train \
--run-id=<run-id>
```
์ธ์(argument) ๊ฐ ์ ๋ณด:
- `<container-name>` ์ ์ปจํ
์ด๋๋ฅผ ๊ตฌ๋ถํ๊ธฐ์ํด ์ฌ์ฉ๋ฉ๋๋ค (์ปจํ
์ด๋๋ฅผ ์ธํฐ๋ฝํธํ๊ฑฐ๋ ์ข
๋ฃ์ํฌ ๋).
์ด๊ฒ์ ์ ํ์ฌํญ์ด๋ฉฐ ์ค์ ํ์ง ์์์ ๊ฒฝ์ฐ ๋์ปค๋ ๋๋คํ ์ด๋ฆ์ ์์ฑํฉ๋๋ค. _๋์ปค ์ด๋ฏธ์ง๋ฅผ ์คํํ ๋๋ง๋ค
๊ณ ์ ํ ์ด๋ฆ์ ๊ฐ์ ธ์ผํจ์ ์ ์ํ์ญ์์ค._
- `<image-name>` ์ปจํ
์ด๋๋ฅผ ๋น๋ํ ๋ ์ฌ์ฉํ image name์ ์ฐธ์กฐํฉ๋๋ค.
- `<environment-name>` __(์ต์
)__: ๋ฆฌ๋
์ค ์คํํ์ผ๊ณผ ํจ๊ป ํ์ต์ ํ ๊ฒฝ์ฐ, ์ธ์ ๊ฐ์ด ์คํํ์ผ์ ์ด๋ฆ์ด ๋๋ค.
์๋ํฐ์์ ํ์ต์ ํ ๊ฒฝ์ฐ, `<environment-name>` ์ธ์๋ฅผ ์ ๋ฌํ์ง ๋ง๊ณ ์ ๋ํฐ์์ _"Start training by pressing
the Play button in the Unity Editor"_ ๋ฉ์ธ์ง๊ฐ ํ๋ฉด์ ํ์๋ ๋ :arrow_forward: ๋ฒํผ์ ๋๋ฅด์ญ์์ค.
- `source`: ์ ๋ํฐ ์คํํ์ผ์ ์ ์ฅํ ํธ์คํธ ์ด์์ฒด์ ์ ๊ฒฝ๋ก๋ฅผ ์ฐธ์กฐํฉ๋๋ค.
- `target`: ๋์ปค๊ฐ`source` ๊ฒฝ๋ก์ ์ด ์ด๋ฆ์ ๊ฐ์ง ๋์คํฌ๋ก ๋ง์ดํธํ๋๋ก ํฉ๋๋ค.
- `docker-target-name`: ML-Agents ํ์ด์ฌ ํจํค์ง์๊ฒ ์ ๋ํฐ ์คํํ์ผ์ ์ฝ๊ณ ๊ทธ๋ํ๋ฅผ ์ ์ฅํ ์ ์๋ ๋์คํฌ์ ์ด๋ฆ์ ์๋ ค์ค๋ค.
**๊ทธ๋ฌ๋ฏ๋ก `target`๊ณผ ๋์ผํ ๊ฐ์ ๊ฐ์ ธ์ผ ํฉ๋๋ค.**
- `trainer-config-file`, `train`, `run-id`: ML-Agents ์ธ์๋ค์ `mlagents-learn`๋ก ์ ๋ฌ๋ฉ๋๋ค. ํธ๋ ์ด๋ ์ค์ ํ์ผ์ ์ด๋ฆ `trainer-config-file`,
์๊ณ ๋ฆฌ์ฆ์ ํ์ตํ๋ `train`, ๊ทธ๋ฆฌ๊ณ ๊ฐ ์คํ์ ๊ณ ์ ํ ์๋ณ์๋ฅผ ํ๊น
ํ๋๋ฐ ์ฌ์ฉ๋๋ `run-id`.
์ปจํ
์ด๋๊ฐ ํ์ผ์ ์ ๊ทผํ ์ ์๋๋ก trainer-config ํ์ผ์ `unity-volume` ์์ ๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค.
`3DBall` ํ๊ฒฝ ์คํํ์ผ์ ํ์ตํ๊ธฐ ์ํด ๋ค์ ๋ช
๋ น์ด๊ฐ ์ฌ์ฉ๋ฉ๋๋ค:
```sh
docker run --name 3DBallContainer.first.trial \
--mount type=bind,source="$(pwd)"/unity-volume,target=/unity-volume \
-p 5005:5005 \
balance.ball.v0.1:latest 3DBall \
--docker-target-name=unity-volume \
trainer_config.yaml \
--env=3DBall
--train \
--run-id=3dball_first_trial
```
๋์ปค ๋ง์ดํธ์ ๋ํ ์ธ๋ถ ์ฌํญ์ ๋์ปค์ [์ด ๋ฌธ์](https://docs.docker.com/storage/bind-mounts/)๋ฅผ ์ฐธ๊ณ ํด ์ฃผ์ญ์์ค.
**์ฐธ๊ณ ** ๋์ปค๋ฅผ ์ฌ์ฉํด ์๊ฐ์ ์ธ ๊ด์ฐฐ์ ํฌํจํ ํ๊ฒฝ์ ํ์ตํ ๊ฒฝ์ฐ, ์ฝํ
์ด๋๋ฅผ ์ํด ํ ๋นํ ๋์ปค์ ๋ํดํธ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋๋ ค์ผํ ๊ฒ์
๋๋ค.
์๋ฅผ ๋ค์ด, [์ฌ๊ธฐ](https://docs.docker.com/docker-for-mac/#advanced) Mac ์ฌ์ฉ์๋ฅผ ์ํ ๋์ปค ์ง์์ฌํญ์ ๋ด์ฃผ์ญ์์ค.
### ์ปจํ
์ด๋ ์ค์ง ๋ฐ ์ํ ์ ์ฅ
ํ์ต ์งํ ์ํฉ์ ๋ง์กฑํ์ ๊ฒฝ์ฐ, ์ํ๋ฅผ ์ ์ฅํ๋ ๋์ `Ctrl+C` or `โ+C` (Mac) ํค๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ๋ค์ ๋ช
๋ น์ด๋ฅผ ํตํด ๋์ปค ์ปจํ
์ด๋๋ฅผ ์ค์งํ ์ ์์ต๋๋ค:
```sh
docker kill --signal=SIGINT <container-name>
```
`<container-name>` ์ `docker run` ๋ช
๋ น์ด์ ์ง์ ๋ ์ปจํ
์ด๋ ์ด๋ฆ์
๋๋ค. ์ง์ ํ์ง ์์ผ๋ฉด ๋ฌด์์๋ก ์์ฑ๋๋ฉฐ`docker container ls`๋ฅผ ํตํด ํ์ธํ ์ ์์ต๋๋ค.
## ํ๊ธ ๋ฒ์ญ
ํด๋น ๋ฌธ์์ ํ๊ธ ๋ฒ์ญ์ [์ฅํ์ค (Hyeonjun Jang)]([https://github.com/janghyeonjun](https://github.com/janghyeonjun))์ ์ํด ์งํ๋์์ต๋๋ค. ๋ด์ฉ์ ์ค๋ฅ๋ ์คํ์๊ฐ ์๋ ๊ฒฝ์ฐ totok682@naver.com ์ผ๋ก ์ฐ๋ฝ์ฃผ์๋ฉด ๊ฐ์ฌ๋๋ฆฌ๊ฒ ์ต๋๋ค.
|