| ๏ปฟ# 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` ์ ์์ฑ ๋์ด์๋์ง ํ์ธํ์ญ์์ค. | |
|  | |
| ### ๋์ปค ์ปจํ ์ด๋ ๋น๋ | |
| ์ฒซ ๋ฒ์งธ, ๋์ปค ๋จธ์ ์ด ์์คํ ์์ ์๋ํ๋์ง ํ์ธํ์ญ์์ค. ์ ์ฅ์์ ์ต์๋จ์์ ๋ค์ ๋ช ๋ น์ด๋ฅผ ํธ์ถํ์ฌ | |
| ๋์ปค ์ปจํ ์ด๋๋ฅผ ๋น๋ํ์ญ์์ค: | |
| ```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 ์ผ๋ก ์ฐ๋ฝ์ฃผ์๋ฉด ๊ฐ์ฌ๋๋ฆฌ๊ฒ ์ต๋๋ค. | |