1
0
mirror of https://github.com/gryf/coach.git synced 2025-12-18 03:30:19 +01:00

introduce dockerfiles. (#169)

* introduce dockerfiles.

* ensure golden tests are run not just collected.

* Skip CI download of dockerfiles.

* add StarCraft environment and tests.

* add minimaps starcraft validation parameters.

* Add functional test running (from Ayoob)

* pin mujoco_py version to a 1.5 compatible release.

* fix config syntax issue.

* pin remaining mujoco_py install calls.

* Relax pin of gym version in gym Dockerfile.

* update makefile based on functional test filtering.
This commit is contained in:
Scott Leishman
2019-04-03 09:33:17 -07:00
committed by anabwan
parent 0b808f0794
commit f173e69187
11 changed files with 459 additions and 33 deletions

33
docker/Dockerfile Normal file
View File

@@ -0,0 +1,33 @@
FROM coach-base:master as builder
# prep some of the more common environments
# Gym (installed with coach)
Run pip3 install gym[atari] box2d
# Mujoco
RUN mkdir -p ~/.mujoco \
&& wget https://www.roboti.us/download/mjpro150_linux.zip -O mujoco.zip \
&& unzip mujoco.zip -d ~/.mujoco \
&& rm mujoco.zip
ARG MUJOCO_KEY
ENV MUJOCO_KEY=$MUJOCO_KEY
ENV LD_LIBRARY_PATH /root/.mujoco/mjpro150/bin:$LD_LIBRARY_PATH
RUN echo $MUJOCO_KEY | base64 --decode > /root/.mujoco/mjkey.txt
RUN pip3 install mujoco_py==1.50.1.68
# Vizdoom
RUN pip3 install vizdoom
RUN mkdir /root/src
COPY setup.py /root/src/.
COPY requirements.txt /root/src/.
RUN pip3 install -r /root/src/requirements.txt
FROM coach-base:master
WORKDIR /root/src
COPY --from=builder /root/.mujoco /root/.mujoco
ENV LD_LIBRARY_PATH /root/.mujoco/mjpro150/bin:$LD_LIBRARY_PATH
COPY --from=builder /root/.cache /root/.cache
COPY setup.py /root/src/.
COPY requirements.txt /root/src/.
COPY README.md /root/src/.
RUN pip3 install gym[atari] box2d mujoco_py==1.50.1.68 vizdoom && pip3 install -e .[all] && rm -rf /root/.cache
COPY . /root/src

39
docker/Dockerfile.base Normal file
View File

@@ -0,0 +1,39 @@
FROM nvidia/cuda:9.0-cudnn7-runtime-ubuntu16.04
################################
# Install apt-get Requirements #
################################
# General
RUN apt-get update && \
apt-get install -y python3-pip cmake zlib1g-dev python3-tk python-opencv \
# Boost libraries
libboost-all-dev \
# Scipy requirements
libblas-dev liblapack-dev libatlas-base-dev gfortran \
# Pygame requirements
libsdl-dev libsdl-image1.2-dev libsdl-mixer1.2-dev libsdl-ttf2.0-dev \
libsmpeg-dev libportmidi-dev libavformat-dev libswscale-dev \
# Dashboard
dpkg-dev build-essential python3.5-dev libjpeg-dev libtiff-dev libsdl1.2-dev libnotify-dev \
freeglut3 freeglut3-dev libsm-dev libgtk2.0-dev libgtk-3-dev libwebkitgtk-dev libgtk-3-dev \
libwebkitgtk-3.0-dev libgstreamer-plugins-base1.0-dev \
# Gym
libav-tools libsdl2-dev swig cmake \
# Mujoco_py
curl libgl1-mesa-dev libgl1-mesa-glx libglew-dev libosmesa6-dev software-properties-common \
# ViZDoom
build-essential zlib1g-dev libsdl2-dev libjpeg-dev \
nasm tar libbz2-dev libgtk2.0-dev cmake git libfluidsynth-dev libgme-dev \
libopenal-dev timidity libwildmidi-dev unzip wget && \
apt-get clean autoclean && \
apt-get autoremove -y
############################
# Install Pip Requirements #
############################
RUN pip3 install --upgrade pip
RUN pip3 install setuptools==39.1.0 && pip3 install pytest && pip3 install pytest-xdist
RUN curl -o /usr/local/bin/patchelf https://s3-us-west-2.amazonaws.com/openai-sci-artifacts/manual-builds/patchelf_0.9_amd64.elf \
&& chmod +x /usr/local/bin/patchelf

View File

@@ -0,0 +1,20 @@
FROM coach-base:master as builder
# prep vizdoom and any of its related requirements.
RUN pip3 install vizdoom
# add coach source starting with files that could trigger
# re-build if dependencies change.
RUN mkdir /root/src
COPY setup.py /root/src/.
COPY requirements.txt /root/src/.
RUN pip3 install -r /root/src/requirements.txt
FROM coach-base:master
WORKDIR /root/src
COPY --from=builder /root/.cache /root/.cache
COPY setup.py /root/src/.
COPY requirements.txt /root/src/.
COPY README.md /root/src/.
RUN pip3 install vizdoom && pip3 install -e .[all] && rm -rf /root/.cache
COPY . /root/src

View File

@@ -0,0 +1,20 @@
FROM coach-base:master as builder
# prep gym and any of its related requirements.
RUN pip3 install gym[atari,box2d,classic_control]
# add coach source starting with files that could trigger
# re-build if dependencies change.
RUN mkdir /root/src
COPY setup.py /root/src/.
COPY requirements.txt /root/src/.
RUN pip3 install -r /root/src/requirements.txt
FROM coach-base:master
WORKDIR /root/src
COPY --from=builder /root/.cache /root/.cache
COPY setup.py /root/src/.
COPY requirements.txt /root/src/.
COPY README.md /root/src/.
RUN pip3 install gym[atari,box2d,classic_control] && pip3 install -e .[all] && rm -rf /root/.cache
COPY . /root/src

View File

@@ -0,0 +1,31 @@
FROM coach-base:master as builder
# prep mujoco and any of its related requirements.
# Mujoco
RUN mkdir -p ~/.mujoco \
&& wget https://www.roboti.us/download/mjpro150_linux.zip -O mujoco.zip \
&& unzip -n mujoco.zip -d ~/.mujoco \
&& rm mujoco.zip
ARG MUJOCO_KEY
ENV MUJOCO_KEY=$MUJOCO_KEY
ENV LD_LIBRARY_PATH /root/.mujoco/mjpro150/bin:$LD_LIBRARY_PATH
RUN echo $MUJOCO_KEY | base64 --decode > /root/.mujoco/mjkey.txt
RUN pip3 install mujoco_py==1.50.1.68
# add coach source starting with files that could trigger
# re-build if dependencies change.
RUN mkdir /root/src
COPY setup.py /root/src/.
COPY requirements.txt /root/src/.
RUN pip3 install -r /root/src/requirements.txt
FROM coach-base:master
WORKDIR /root/src
COPY --from=builder /root/.mujoco /root/.mujoco
ENV LD_LIBRARY_PATH /root/.mujoco/mjpro150/bin:$LD_LIBRARY_PATH
COPY --from=builder /root/.cache /root/.cache
COPY setup.py /root/src/.
COPY requirements.txt /root/src/.
COPY README.md /root/src/.
RUN pip3 install mujoco_py==1.50.1.68 && pip3 install -e .[all] && rm -rf /root/.cache
COPY . /root/src

View File

@@ -0,0 +1,27 @@
FROM coach-base:master as builder
# prep pysc2 and any of its related requirements.
RUN wget http://blzdistsc2-a.akamaihd.net/Linux/SC2.3.17.zip -O sc2.zip \
&& unzip -P 'iagreetotheeula' -d ~ sc2.zip \
&& rm sc2.zip
RUN wget https://github.com/deepmind/pysc2/releases/download/v1.2/mini_games.zip -O mini_games.zip \
&& unzip -d ~/StarCraftII/Maps mini_games.zip \
&& rm mini_games.zip
RUN pip3 install pysc2
# add coach source starting with files that could trigger
# re-build if dependencies change.
RUN mkdir /root/src
COPY setup.py /root/src/.
COPY requirements.txt /root/src/.
RUN pip3 install -r /root/src/requirements.txt
FROM coach-base:master
WORKDIR /root/src
COPY --from=builder /root/StarCraftII /root/StarCraftII
COPY --from=builder /root/.cache /root/.cache
COPY setup.py /root/src/.
COPY requirements.txt /root/src/.
COPY README.md /root/src/.
RUN pip3 install pysc2 && pip3 install -e .[all] && rm -rf /root/.cache
COPY . /root/src

141
docker/Makefile Normal file
View File

@@ -0,0 +1,141 @@
# REGISTRY=gcr.io
REGISTRY=docker.io
ORGANIZATION=nervana
IMAGE=coach
CONTEXT = $(realpath ..)
BUILD_ARGUMENTS=
RUN_ARGUMENTS=
ifdef http_proxy
BUILD_ARGUMENTS+=--build-arg http_proxy=$(http_proxy)
endif
ifdef https_proxy
BUILD_ARGUMENTS+=--build-arg https_proxy=$(https_proxy)
endif
ifndef MUJOCO_KEY
KEY_NAME=${CONTEXT}/mjkey.txt
ifneq ("$(wildcard ${KEY_NAME})", "")
UNAME_S := $(shell uname -s)
ifeq ($(UNAME_S),Linux)
MUJOCO_KEY:=$(shell cat ${KEY_NAME} | base64 -w 0)
endif
ifeq ($(UNAME_S),Darwin)
MUJOCO_KEY:=$(shell cat ${KEY_NAME} | base64)
endif
endif
endif
ifdef MUJOCO_KEY
BUILD_ARGUMENTS+=--build-arg MUJOCO_KEY=$(MUJOCO_KEY)
endif
RUN_ARGUMENTS+=--rm
RUN_ARGUMENTS+=--net host
RUN_ARGUMENTS+=-v /tmp/checkpoint:/checkpoint
UNIT_TESTS=python3 -m pytest rl_coach/tests -m unit_test
INTEGRATION_TESTS=python3 -m pytest rl_coach/tests -m integration_test --tb=short
# Functional Tests
ifdef FUNCTIONAL_PRESETS
FUNCTIONAL_PRESETS:=-k "${FUNCTIONAL_PRESETS}"
endif
ifndef FUNCTIONAL_PRESETS
FUNCTIONAL_PRESETS=
endif
FUNCTIONAL_TESTS=python3 -m pytest rl_coach/tests -s -v -k ${FUNCTIONAL_PRESETS} -m functional_test
# Golden Tests
ifdef GOLDEN_PRESETS
GOLDEN_PRESETS:=-k "${GOLDEN_PRESETS}"
endif
ifndef GOLDEN_PRESETS
GOLDEN_PRESETS=
endif
GOLDEN_TESTS=python3 -m pytest rl_coach/tests -m golden_test -v ${GOLDEN_PRESETS}
# example specifying a couple presets:
# GOLDEN_TESTS=python3 -m pytest rl_coach/tests -m golden_test -v -k "Mujoco_NAF or Doom_Basic_DQN"
# example specifying all golden tests using the mujoco environment
# GOLDEN_TESTS=python3 -m pytest rl_coach/tests -m golden_test -v -k "Mujoco"
# Trace Tests
ifdef TRACE_PRESETS
TRACE_PRESETS := -p $(TRACE_PRESETS)
else
TRACE_PRESETS :=
endif
TRACE_TESTS=python3 rl_coach/tests/trace_tests.py -prl ${TRACE_PRESETS}
ifndef DOCKER
DOCKER = docker
endif
build_base:
${DOCKER} build -f=Dockerfile.base -t=${IMAGE}-base:master ${BUILD_ARGUMENTS} ${CONTEXT}
build: build_base
${DOCKER} build -f=Dockerfile -t=${IMAGE} ${BUILD_ARGUMENTS} ${CONTEXT}
mkdir -p /tmp/checkpoint
rm -rf /tmp/checkpoint/*
shell: build
${DOCKER} run ${RUN_ARGUMENTS} -it ${IMAGE} /bin/bash
unit_tests: build
${DOCKER} run ${RUN_ARGUMENTS} -it ${IMAGE} ${UNIT_TESTS}
integration_tests: build
${DOCKER} run ${RUN_ARGUMENTS} -it ${IMAGE} ${INTEGRATION_TESTS}
functional_tests: build
${DOCKER} run ${RUN_ARGUMENTS} -it ${IMAGE} ${FUNCTIONAL_TESTS}
golden_tests: build
${DOCKER} run ${RUN_ARGUMENTS} -it ${IMAGE} ${GOLDEN_TESTS}
trace_tests: build
${DOCKER} run ${RUN_ARGUMENTS} -it ${IMAGE} ${TRACE_TESTS}
run: build
${DOCKER} run ${RUN_ARGUMENTS} -it ${IMAGE}
run_training_worker: build
${DOCKER} run ${RUN_ARGUMENTS} -it ${IMAGE} python3 rl_coach/training_worker.py --preset CartPole_DQN_distributed
run_rollout_worker: build
${DOCKER} run ${RUN_ARGUMENTS} -it ${IMAGE} python3 rl_coach/rollout_worker.py --preset CartPole_DQN_distributed
bootstrap_kubernetes: build push
kubectl run -i --tty --attach --image=${REGISTRY}/${IMAGE} --restart=Never distributed-coach -- python3 rl_coach/orchestrators/start_training.py --preset CartPole_DQN_distributed --image ${IMAGE} -ns 10.63.249.182 -np /
stop_kubernetes:
kubectl delete service --ignore-not-found redis-service
kubectl delete pv --ignore-not-found nfs-checkpoint-pv
kubectl delete pvc --ignore-not-found nfs-checkpoint-pvc
kubectl delete deployment --ignore-not-found redis-server
kubectl get jobs | grep train | awk "{print $\1}" | xargs kubectl delete jobs
kubectl get jobs | grep worker | awk "{print $\1}" | xargs kubectl delete jobs
kubernetes: stop_kubernetes
python3 ${CONTEXT}/rl_coach/orchestrators/start_training.py --preset CartPole_DQN_distributed --image ${IMAGE} -ns 10.63.249.182 -np /
push: build
${DOCKER} tag ${IMAGE} ${REGISTRY}/${ORGANIZATION}/${IMAGE}
${DOCKER} push ${REGISTRY}/${ORGANIZATION}/${IMAGE}
unit_tests_without_docker:
cd .. && ${UNIT_TESTS}
integration_tests_without_docker:
cd .. && ${INTEGRATION_TESTS}
functional_tests_without_docker:
cd .. && ${FUNCTIONAL_TESTS}
golden_tests_without_docker:
cd .. && ${GOLDEN_TESTS}
trace_tests_without_docker:
cd .. && ${TRACE_TESTS}

35
docker/README.md Normal file
View File

@@ -0,0 +1,35 @@
# Container Images
In this directory we've put together several different Dockerfile's that can be used to build
containers that have coach and other environments/dependencies installed. How to build these
and what each contains is defined below:
## default `Dockerfile`
* `make build` to create the image
* will create a basic Coach installation along with Gym (atari), Mujoco, and Vizdoom environments.
* useful for running unit/integration tests `make unit_tests` to run these in the container
* `make shell` will launch this container locally, and provide a bash shell prompt.
* includes GPU support (derives from `Dockerfile.base` which is a CUDA ubuntu 16.04 derived image)
## `Dockerfile.mujoco_environment`
* `docker build --build-arg MUJOCO_KEY=${MUJOCO_KEY} -f docker/Dockerfile.mujoco_environment .`
from the parent dir to create the image
* contains mujoco environment and Coach.
* you need to supply your own license key (base64 encrypted) as an environment variable `MUJOCO_KEY`
to ensure you get the complete Mujoco environment
## `Dockerfile.gym_environment`
* `docker build -f docker/Dockerfile.gym_environment .` from the parent dir to create the image
* contains OpenAI Gym environment (and all extras) and Coach.
## `Dockerfile.doom_environment`
* `docker build -f docker/Dockerfile.doom_environment .` from the parent dir to create the image
* contains vizdoom environment and Coach.
## `Dockerfile.starcraft_environment`
* `docker build -f docker/Dockerfile.starcraft_environment .` from the parent dir to create the image
* contains StarcraftII environment and Coach.
## `Dockerfile.carla_environment`
* `docker build -f docker/Dockerfile.carla_environment .` from the parent dir to create the image
* contains CARLA driving simulator environment and Coach.