|
๏ปฟ# 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 ์ผ๋ก ์ฐ๋ฝ์ฃผ์๋ฉด ๊ฐ์ฌ๋๋ฆฌ๊ฒ ์ต๋๋ค. |
|
|