๏ปฟ# ML-Agents ์ฉ ๋์ปค ์ฌ์ฉ๋ฒ
๋์ปค๋ฅผ ์ฌ์ฉํด ์ถ๋ก ๊ณผ ํ์ต์ ํ๊ณ ์ํ๋ Windows์ Mac ์ฌ์ฉ์๋ฅผ ์ํ ์๋ฃจ์
์ ์ ๊ณตํฉ๋๋ค.
์ด๊ฒ์ Python๊ณผ TensorFlow ์ค์น๋ฅผ ํผํ๊ณ ์ ํ๋ ๋ถ์๊ฒ ๋งค๋ ฅ์ ์ธ ์ต์
์ด ๋ ๊ฒ์
๋๋ค. ํ์ฌ ์ค์ ์ TensorFlow์ Unity๊ฐ CPU๋ฅผ ํตํด์๋ง
๊ณ์ฐํ๋๋ก ํฉ๋๋ค. ๋ฐ๋ผ์ ๋์ปค ์๋ฎฌ๋ ์ด์
์ GPU๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ์๊ฐ์ ๋ ๋๋ง์ ์ํด Xvfb
๋ฅผ ์ฌ์ฉํฉ๋๋ค.
Xvfb
๋ ML-Agents
(๋๋ ๋ค๋ฅธ ์์ฉ ํ๋ก๊ทธ๋จ)๊ฐ ๊ฐ์์ผ๋ก ๋ ๋๋ง์ ํ ์ ์๊ฒํ๋ ์ ํธ๋ฆฌํฐ ์
๋๋ค. ์ฆ, ML-Agents
๋ฅผ ์คํํ๋ ๊ธฐ๊ณ๊ฐ GPU๋ฅผ ๊ฐ์ง๊ณ ์๊ฑฐ๋
๋์คํ๋ ์ด๋ฅผ ๊ฐ์ง๊ณ ์๋ค๊ณ ๊ฐ์ ํ์ง ์์ต๋๋ค. ์ด๊ฒ์ ์นด๋ฉ๋ผ ๊ธฐ๋ฐ์ ์๊ฐ์ ๊ด์ฐฐ ์์๊ฐ ํฌํจ๋ ํ๊ฒฝ์ ๋์ฑ ๋๋ ค์ง ์๋ ์์์ ์๋ฏธํฉ๋๋ค.
์๊ตฌ์ฌํญ
- ์ ๋ํฐ Linux Build Support ์ปดํฌ๋ํธ
- ๋์ปค
์ค์น
์ ๋ํฐ ์ธ์คํจ๋ฌ๋ฅผ ๋ค์ด๋ก๋ํ๊ณ Linux Build Support ์ปดํฌ๋ํธ๋ฅผ ์ถ๊ฐํ์ญ์์ค.
๋์ปค๊ฐ ์ค์น๋์ด ์์ง ์๋ค๋ฉด ๋ค์ด๋ก๋ํ๊ณ ์ค์น ํ์ญ์์ค.
ํธ์คํธ ๋จธ์ ๊ณผ ๋ถ๋ฆฌ๋ ํ๊ฒฝ์์ ๋์ปค๋ฅผ ์คํํ๊ธฐ ๋๋ฌธ์, ํธ์คํธ ๋จธ์ ์์ ๋ง์ดํธ๋ ๋๋ ํ ๋ฆฌ๋ ํธ๋ ์ด๋ ํ๊ฒฝ ์ค์ ํ์ผ, ์ ๋ํฐ ์คํ ํ์ผ, ์ปค๋ฆฌํ๋ผ ํ์ผ๊ณผ TensorFlow ๊ทธ๋ํ์ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํ๊ธฐ์ํด ์ฌ์ฉ๋ฉ๋๋ค. ์ด๋ฅผ ์ํด, ํธ์์ ๋น์ด์๋
unity-volume
๋๋ ํ ๋ฆฌ๋ฅผ ์ ์ฅ์์ ๋ฃจํธ์ ๋ง๋ค์์ผ๋, ๋ค๋ฅธ ๋๋ ํ ๋ฆฌ์ ์ฌ์ฉ์ ์์ ๋กญ๊ฒ ํ ์ ์์ต๋๋ค. ์ด ๊ฐ์ด๋์ ๋๋จธ์ง ๋ถ๋ถ์์๋unity-volume
๋๋ ํ ๋ฆฌ๊ฐ ์ฌ์ฉ๋๋ค๊ณ ๊ฐ์ ํ๊ณ ์งํ๋ฉ๋๋ค.
์ฌ์ฉ๋ฒ
ML-Agents ์ฉ ๋์ปค ์ฌ์ฉ์๋ ์ธ ๋จ๊ณ๊ฐ ํฌํจ๋ฉ๋๋ค.: ํน์ ํ๋๊ทธ๋ฅผ ์ฌ์ฉํ์ฌ ์ ๋ํฐ ํ๊ฒฝ ๋น๋, ๋์ปค ์ปจํ ์ด๋ ๋น๋ ๋ง์ง๋ง์ผ๋ก, ์ปจํ ์ด๋ ์คํ. ๋ง์ฝ ML-Agents ์ฉ ์ ๋ํฐ ํ๊ฒฝ ๋น๋์ ์ต์ํ์ง ์๋ค๋ฉด, 3D ๋ฐธ๋ฐ์ค ๋ณผ ์์ ์ ํจ๊ป ์์ํ๊ธฐ ๊ฐ์ด๋๋ฅผ ๋จผ์ ์ฝ์ผ์ญ์์ค.
ํ๊ฒฝ ๋น๋ (์ต์ )
ํ์ต์ ์ํด ์๋ํฐ ์ฌ์ฉ์ ์ํ๋ค๋ฉด ์ด ๋จ๊ณ๋ฅผ ๊ฑด๋๋ธ ์ ์์ต๋๋ค.
๋์ปค๋ ์ผ๋ฐ์ ์ผ๋ก ํธ์คํธ ๋จธ์ ๊ณผ (๋ฆฌ๋ ์ค) ์ปค๋์ ๊ณต์ ํ๋ ์ปจํ ์ด๋๋ฅผ ์คํํ๊ธฐ ๋๋ฌธ์, ์ ๋ํฐ ํ๊ฒฝ์ ๋ฆฌ๋ ์ค ํ๋ซํผ์ด ๊ตฌ์ถ๋์ด์ผ ํฉ๋๋ค. ์ ๋ํฐ ํ๊ฒฝ์ ๋น๋ํ ๋, ๋น๋ ์ธํ ์ฐฝ(Build Settings window)์์ ๋ค์ ์ต์ ์ ์ ํํด ์ฃผ์ญ์์ค:
- ํ๊ฒ ํ๋ซํผ์
๋ฆฌ๋ ์ค
๋ก ์ค์ (Set the Target Platform toLinux
) - _์ํคํ
์ฒ_๋ฅผ
x86_64'๋ก ์ค์ (Set the _Architecture_ to
x86_64`) - ํ๊ฒฝ์์ ์๊ฐ์ ์ธ ๊ด์ฐฐ์ ํ์๋ก ํ์ง์๋๋ค๋ฉด,
headless
์ต์ ์ ์ ํํ ์ ์์ต๋๋ค (์๋ ์ฌ์ง ์ฐธ์กฐ).
๋น๋
(Build)๋ฅผ ํด๋ฆญํ๊ณ , ํ๊ฒฝ ์ด๋ฆ์ ์ ํํ๊ณ (์์: 3DBall
) ์ถ๋ ฅ ๋๋ ํ ๋ฆฌ๋ฅผ unity-volume
์ผ๋ก ์ค์ ํ์ญ์์ค.
๋น๋ ํ์, ํ์ผ <ํ๊ฒฝ ์ด๋ฆ>.x86_64
์ ํ์๋๋ ํ ๋ฆฌ <ํ๊ฒฝ ์ด๋ฆ>_Data/
๊ฐ unity-volume
์ ์์ฑ ๋์ด์๋์ง ํ์ธํ์ญ์์ค.
๋์ปค ์ปจํ ์ด๋ ๋น๋
์ฒซ ๋ฒ์งธ, ๋์ปค ๋จธ์ ์ด ์์คํ ์์ ์๋ํ๋์ง ํ์ธํ์ญ์์ค. ์ ์ฅ์์ ์ต์๋จ์์ ๋ค์ ๋ช ๋ น์ด๋ฅผ ํธ์ถํ์ฌ ๋์ปค ์ปจํ ์ด๋๋ฅผ ๋น๋ํ์ญ์์ค:
docker build -t <image-name> .
<image-name>
์ ๋์ปค ์ด๋ฏธ์ง ์ด๋ฆ์ผ๋ก ๋ฐ๊พธ์ญ์์ค, ์์: balance.ball.v0.1
.
๋์ปค ์ปจํ ์ด๋ ์คํ
์ ์ฅ์์ ์ต์๋จ์์ ๋ค์ ๋ช ๋ น์ด๋ฅผ ํธ์ถํ์ฌ ๋์ปค ์ปจํ ์ด๋๋ฅผ ์คํํ์ญ์์ค:
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
ํ๊ฒฝ ์คํํ์ผ์ ํ์ตํ๊ธฐ ์ํด ๋ค์ ๋ช
๋ น์ด๊ฐ ์ฌ์ฉ๋ฉ๋๋ค:
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
๋์ปค ๋ง์ดํธ์ ๋ํ ์ธ๋ถ ์ฌํญ์ ๋์ปค์ ์ด ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํด ์ฃผ์ญ์์ค.
์ฐธ๊ณ ๋์ปค๋ฅผ ์ฌ์ฉํด ์๊ฐ์ ์ธ ๊ด์ฐฐ์ ํฌํจํ ํ๊ฒฝ์ ํ์ตํ ๊ฒฝ์ฐ, ์ฝํ ์ด๋๋ฅผ ์ํด ํ ๋นํ ๋์ปค์ ๋ํดํธ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋๋ ค์ผํ ๊ฒ์ ๋๋ค. ์๋ฅผ ๋ค์ด, ์ฌ๊ธฐ Mac ์ฌ์ฉ์๋ฅผ ์ํ ๋์ปค ์ง์์ฌํญ์ ๋ด์ฃผ์ญ์์ค.
์ปจํ ์ด๋ ์ค์ง ๋ฐ ์ํ ์ ์ฅ
ํ์ต ์งํ ์ํฉ์ ๋ง์กฑํ์ ๊ฒฝ์ฐ, ์ํ๋ฅผ ์ ์ฅํ๋ ๋์ Ctrl+C
or โ+C
(Mac) ํค๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ๋ค์ ๋ช
๋ น์ด๋ฅผ ํตํด ๋์ปค ์ปจํ
์ด๋๋ฅผ ์ค์งํ ์ ์์ต๋๋ค:
docker kill --signal=SIGINT <container-name>
<container-name>
์ docker run
๋ช
๋ น์ด์ ์ง์ ๋ ์ปจํ
์ด๋ ์ด๋ฆ์
๋๋ค. ์ง์ ํ์ง ์์ผ๋ฉด ๋ฌด์์๋ก ์์ฑ๋๋ฉฐdocker container ls
๋ฅผ ํตํด ํ์ธํ ์ ์์ต๋๋ค.
ํ๊ธ ๋ฒ์ญ
ํด๋น ๋ฌธ์์ ํ๊ธ ๋ฒ์ญ์ ์ฅํ์ค (Hyeonjun Jang)์ ์ํด ์งํ๋์์ต๋๋ค. ๋ด์ฉ์ ์ค๋ฅ๋ ์คํ์๊ฐ ์๋ ๊ฒฝ์ฐ totok682@naver.com ์ผ๋ก ์ฐ๋ฝ์ฃผ์๋ฉด ๊ฐ์ฌ๋๋ฆฌ๊ฒ ์ต๋๋ค.