From 17550594e663145aa5c31ade4f1407ce1a910821 Mon Sep 17 00:00:00 2001 From: Lars Lorentz Ludvigsen <59617571+larsll@users.noreply.github.com> Date: Sat, 6 Jul 2024 13:11:56 +0200 Subject: [PATCH 01/12] Combined Image (#176) * Initial testing * Sagemaker SDK 2 * Single image support * Remove unnecessary variable --- bin/activate.sh | 24 +++++++++--------------- bin/init.sh | 25 +++---------------------- bin/scripts_wrapper.sh | 30 +++++++++++++++++------------- defaults/dependencies.json | 6 ++---- defaults/template-system.env | 5 ++--- docker/docker-compose-eval.yml | 5 ++--- docker/docker-compose-training.yml | 9 ++++++--- scripts/evaluation/start.sh | 4 ++++ scripts/training/start.sh | 6 ++++-- scripts/training/stop.sh | 23 ++++++++++++++--------- utils/start-local-browser.sh | 2 +- 11 files changed, 64 insertions(+), 75 deletions(-) diff --git a/bin/activate.sh b/bin/activate.sh index cbdbb2a7..a01e1697 100644 --- a/bin/activate.sh +++ b/bin/activate.sh @@ -184,24 +184,18 @@ if [[ -n "${DR_MINIO_COMPOSE_FILE}" ]]; then fi ## Version check -DEPENDENCY_VERSION=$(jq -r '.master_version | select (.!=null)' $DIR/defaults/dependencies.json) - -SAGEMAKER_VER=$(docker inspect awsdeepracercommunity/deepracer-sagemaker:$DR_SAGEMAKER_IMAGE 2>/dev/null | jq -r .[].Config.Labels.version) -if [ -z "$SAGEMAKER_VER" ]; then SAGEMAKER_VER=$DR_SAGEMAKER_IMAGE; fi -if ! verlte $DEPENDENCY_VERSION $SAGEMAKER_VER; then - echo "WARNING: Incompatible version of Deepracer Sagemaker. Expected >$DEPENDENCY_VERSION. Got $SAGEMAKER_VER." +if [[ -z "$DR_SIMAPP_SOURCE" ]]; then + echo "ERROR: Variable DR_SIMAPP_SOURCE not defined." fi - -ROBOMAKER_VER=$(docker inspect awsdeepracercommunity/deepracer-robomaker:$DR_ROBOMAKER_IMAGE 2>/dev/null | jq -r .[].Config.Labels.version) -if [ -z "$ROBOMAKER_VER" ]; then ROBOMAKER_VER=$DR_ROBOMAKER_IMAGE; fi -if ! verlte $DEPENDENCY_VERSION $ROBOMAKER_VER; then - echo "WARNING: Incompatible version of Deepracer Robomaker. Expected >$DEPENDENCY_VERSION. Got $ROBOMAKER_VER." +if [[ -z "$DR_SIMAPP_VERSION" ]]; then + echo "ERROR: Variable DR_SIMAPP_VERSION not defined." fi +DEPENDENCY_VERSION=$(jq -r '.master_version | select (.!=null)' $DIR/defaults/dependencies.json) -COACH_VER=$(docker inspect awsdeepracercommunity/deepracer-rlcoach:$DR_COACH_IMAGE 2>/dev/null | jq -r .[].Config.Labels.version) -if [ -z "$COACH_VER" ]; then COACH_VER=$DR_COACH_IMAGE; fi -if ! verlte $DEPENDENCY_VERSION $COACH_VER; then - echo "WARNING: Incompatible version of Deepracer-for-Cloud Coach. Expected >$DEPENDENCY_VERSION. Got $COACH_VER." +SIMAPP_VER=$(docker inspect ${DR_SIMAPP_SOURCE}:${DR_SIMAPP_VERSION} 2>/dev/null | jq -r .[].Config.Labels.version) +if [ -z "$SIMAPP_VER" ]; then SIMAPP_VER=$SIMAPP_VERSION; fi +if ! verlte $DEPENDENCY_VERSION $SIMAPP_VER; then + echo "WARNING: Incompatible version of Deepracer Sagemaker. Expected >$DEPENDENCY_VERSION. Got $SIMAPP_VER." fi ## Create a dr-local-aws command diff --git a/bin/init.sh b/bin/init.sh index 506c29de..50e4c65d 100755 --- a/bin/init.sh +++ b/bin/init.sh @@ -142,28 +142,9 @@ for arg in "$@"; do done # Download docker images. Change to build statements if locally built images are desired. -COACH_VERSION=$(jq -r '.containers.rl_coach | select (.!=null)' $INSTALL_DIR/defaults/dependencies.json) -sed -i "s//$COACH_VERSION/g" $INSTALL_DIR/system.env - -ROBOMAKER_VERSION=$(jq -r '.containers.robomaker | select (.!=null)' $INSTALL_DIR/defaults/dependencies.json) -if [ -n $ROBOMAKER_VERSION ]; then - ROBOMAKER_VERSION=$ROBOMAKER_VERSION-$CPU_LEVEL -else - ROBOMAKER_VERSION=$CPU_LEVEL -fi -sed -i "s//$ROBOMAKER_VERSION/g" $INSTALL_DIR/system.env - -SAGEMAKER_VERSION=$(jq -r '.containers.sagemaker | select (.!=null)' $INSTALL_DIR/defaults/dependencies.json) -if [ -n $SAGEMAKER_VERSION ]; then - SAGEMAKER_VERSION=$SAGEMAKER_VERSION-$SAGEMAKER_TAG -else - SAGEMAKER_VERSION=$SAGEMAKER_TAG -fi -sed -i "s//$SAGEMAKER_VERSION/g" $INSTALL_DIR/system.env - -docker pull awsdeepracercommunity/deepracer-rlcoach:$COACH_VERSION -docker pull awsdeepracercommunity/deepracer-robomaker:$ROBOMAKER_VERSION -docker pull awsdeepracercommunity/deepracer-sagemaker:$SAGEMAKER_VERSION +SIMAPP_VERSION=$(jq -r '.containers.simapp | select (.!=null)' $INSTALL_DIR/defaults/dependencies.json) +sed -i "s//$SIMAPP_VERSION/g" $INSTALL_DIR/system.env +docker pull awsdeepracercommunity/deepracer-simapp:$SIMAPP_VERSION # create the network sagemaker-local if it doesn't exit SAGEMAKER_NW='sagemaker-local' diff --git a/bin/scripts_wrapper.sh b/bin/scripts_wrapper.sh index 27310f06..b34d2128 100644 --- a/bin/scripts_wrapper.sh +++ b/bin/scripts_wrapper.sh @@ -138,19 +138,23 @@ function dr-find-sagemaker { STACK_NAME="deepracer-$DR_RUN_ID" RUN_NAME=${DR_LOCAL_S3_MODEL_PREFIX} - SAGEMAKER_CONTAINERS=$(docker ps | awk ' /sagemaker/ { print $1 } ' | xargs) - - if [[ -n $SAGEMAKER_CONTAINERS ]]; then - for CONTAINER in $SAGEMAKER_CONTAINERS; do - CONTAINER_NAME=$(docker ps --format '{{.Names}}' --filter id=$CONTAINER) - CONTAINER_PREFIX=$(echo $CONTAINER_NAME | perl -n -e'/(.*)_(algo(.*))_./; print $1') - COMPOSE_SERVICE_NAME=$(echo $CONTAINER_NAME | perl -n -e'/(.*)_(algo(.*))_./; print $2') - COMPOSE_FILE=$(sudo find /tmp/sagemaker -name docker-compose.yaml -exec grep -l "$RUN_NAME" {} + | grep $CONTAINER_PREFIX) - if [[ -n $COMPOSE_FILE ]]; then - echo $CONTAINER - return - fi - done + SAGEMAKER_CONTAINERS=$(docker ps | awk ' /simapp/ { print $1 } ' | xargs) + + if [[ -n "$SAGEMAKER_CONTAINERS" ]]; then + for CONTAINER in $SAGEMAKER_CONTAINERS; do + CONTAINER_NAME=$(docker ps --format '{{.Names}}' --filter id=$CONTAINER) + CONTAINER_PREFIX=$(echo $CONTAINER_NAME | perl -n -e'/(.*)-(algo-(.)-(.*))/; print $1') + COMPOSE_SERVICE_NAME=$(echo $CONTAINER_NAME | perl -n -e'/(.*)-(algo-(.)-(.*))/; print $2') + + if [[ -n "$COMPOSE_SERVICE_NAME" ]]; then + COMPOSE_FILES=$(sudo find /tmp/sagemaker -name docker-compose.yaml -exec grep -l "$COMPOSE_SERVICE_NAME" {} +) + for COMPOSE_FILE in $COMPOSE_FILES; do + if sudo grep -q "RUN_ID=${DR_RUN_ID}" $COMPOSE_FILE && sudo grep -q "${RUN_NAME}" $COMPOSE_FILE; then + echo $CONTAINER + fi + done + fi + done fi } diff --git a/defaults/dependencies.json b/defaults/dependencies.json index 6c5b2c37..1ba851f4 100644 --- a/defaults/dependencies.json +++ b/defaults/dependencies.json @@ -1,8 +1,6 @@ { - "master_version": "5.2", + "master_version": "5.3", "containers": { - "rl_coach": "5.2.1", - "robomaker": "5.2.2", - "sagemaker": "5.2.1" + "simapp": "5.3.0" } } diff --git a/defaults/template-system.env b/defaults/template-system.env index eafb4834..680f888a 100644 --- a/defaults/template-system.env +++ b/defaults/template-system.env @@ -10,11 +10,10 @@ DR_KINESIS_STREAM_NAME= DR_CAMERA_MAIN_ENABLE=True DR_CAMERA_SUB_ENABLE=False DR_CAMERA_KVS_ENABLE=True -DR_SAGEMAKER_IMAGE= -DR_ROBOMAKER_IMAGE= +DR_SIMAPP_SOURCE=awsdeepracercommunity/deepracer-simapp +DR_SIMAPP_VERSION= DR_MINIO_IMAGE=latest DR_ANALYSIS_IMAGE=cpu -DR_COACH_IMAGE= DR_WORKERS=1 DR_ROBOMAKER_MOUNT_LOGS=False # DR_ROBOMAKER_MOUNT_SIMAPP_DIR= diff --git a/docker/docker-compose-eval.yml b/docker/docker-compose-eval.yml index 1b7c54b1..a46d19cf 100644 --- a/docker/docker-compose-eval.yml +++ b/docker/docker-compose-eval.yml @@ -7,10 +7,10 @@ networks: services: rl_coach: - image: awsdeepracercommunity/deepracer-rlcoach:${DR_COACH_IMAGE} + image: ${DR_SIMAPP_SOURCE}:${DR_SIMAPP_VERSION} command: ["/bin/bash", "-c", "echo No work for coach in Evaluation Mode"] robomaker: - image: awsdeepracercommunity/deepracer-robomaker:${DR_ROBOMAKER_IMAGE} + image: ${DR_SIMAPP_SOURCE}:${DR_SIMAPP_VERSION} command: ["${ROBOMAKER_COMMAND}"] ports: - "${DR_ROBOMAKER_EVAL_PORT}:8080" @@ -18,7 +18,6 @@ services: - CUDA_VISIBLE_DEVICES=${DR_ROBOMAKER_CUDA_DEVICES:-} - DEBUG_REWARD=${DR_EVAL_DEBUG_REWARD} - WORLD_NAME=${DR_WORLD_NAME} - - NUMBER_OF_TRIALS=${DR_NUMBER_OF_EPISODES} - MODEL_S3_PREFIX=${DR_LOCAL_S3_MODEL_PREFIX} - MODEL_S3_BUCKET=${DR_LOCAL_S3_BUCKET} - APP_REGION=${DR_AWS_APP_REGION} diff --git a/docker/docker-compose-training.yml b/docker/docker-compose-training.yml index d907d74e..4069d178 100644 --- a/docker/docker-compose-training.yml +++ b/docker/docker-compose-training.yml @@ -7,10 +7,13 @@ networks: services: rl_coach: - image: awsdeepracercommunity/deepracer-rlcoach:${DR_COACH_IMAGE} + image: ${DR_SIMAPP_SOURCE}:${DR_SIMAPP_VERSION} + command: ["python3 /opt/code/ml/rl_coach/start.py"] + working_dir: "/opt/ml/code/" environment: + - RUN_ID=${DR_RUN_ID} - AWS_REGION=${DR_AWS_APP_REGION} - - SAGEMAKER_IMAGE=${DR_SAGEMAKER_IMAGE} + - SAGEMAKER_IMAGE=${DR_SIMAPP_SOURCE}:${DR_SIMAPP_VERSION} - PRETRAINED=${DR_LOCAL_S3_PRETRAINED} - PRETRAINED_S3_PREFIX=${DR_LOCAL_S3_PRETRAINED_PREFIX} - PRETRAINED_S3_BUCKET=${DR_LOCAL_S3_BUCKET} @@ -25,7 +28,7 @@ services: - "/var/run/docker.sock:/var/run/docker.sock" - "/tmp/sagemaker:/tmp/sagemaker" robomaker: - image: awsdeepracercommunity/deepracer-robomaker:${DR_ROBOMAKER_IMAGE} + image: ${DR_SIMAPP_SOURCE}:${DR_SIMAPP_VERSION} command: ["${ROBOMAKER_COMMAND}"] ports: - "${DR_ROBOMAKER_TRAIN_PORT}:8080" diff --git a/scripts/evaluation/start.sh b/scripts/evaluation/start.sh index 8f1dc12d..64942ce8 100755 --- a/scripts/evaluation/start.sh +++ b/scripts/evaluation/start.sh @@ -44,6 +44,10 @@ if [[ "${DR_DOCKER_STYLE,,}" == "swarm" ]]; then fi fi +echo "Evaluation of model s3://$DR_LOCAL_S3_BUCKET/$DR_LOCAL_S3_MODEL_PREFIX starting." +echo "Using image ${DR_SIMAPP_SOURCE}:${DR_SIMAPP_VERSION}" +echo "" + # clone if required if [ -n "$OPT_CLONE" ]; then echo "Cloning model into s3://$DR_LOCAL_S3_BUCKET/${DR_LOCAL_S3_MODEL_PREFIX}-E" diff --git a/scripts/training/start.sh b/scripts/training/start.sh index 16984e6b..b679cd51 100755 --- a/scripts/training/start.sh +++ b/scripts/training/start.sh @@ -89,6 +89,8 @@ if [ -n "$METADATA_FILE" ] && [ -n "$REWARD_FILE" ] && [ -n "$HYPERPARAM_FILE" ] echo " s3://${DR_LOCAL_S3_BUCKET}/${DR_LOCAL_S3_REWARD_KEY}" echo " s3://${DR_LOCAL_S3_BUCKET}/${DR_LOCAL_S3_MODEL_METADATA_KEY}" echo " s3://${DR_LOCAL_S3_BUCKET}/${DR_LOCAL_S3_HYPERPARAMETERS_KEY}" + echo "Using image ${DR_SIMAPP_SOURCE}:${DR_SIMAPP_VERSION}" + echo "" else echo "Training aborted. Configuration files were not found." echo "Manually check that the following files exist:" @@ -141,10 +143,10 @@ if [ "$DR_WORKERS" -gt 1 ]; then else echo "Creating Robomaker configuration in $S3_PATH/$DR_LOCAL_S3_TRAINING_PARAMS_FILE" fi - export ROBOMAKER_COMMAND="./run.sh multi distributed_training.launch" + export ROBOMAKER_COMMAND="/opt/simapp/run.sh multi distributed_training.launch" else - export ROBOMAKER_COMMAND="./run.sh run distributed_training.launch" + export ROBOMAKER_COMMAND="/opt/simapp/run.sh run distributed_training.launch" echo "Creating Robomaker configuration in $S3_PATH/$DR_LOCAL_S3_TRAINING_PARAMS_FILE" fi diff --git a/scripts/training/stop.sh b/scripts/training/stop.sh index 6575a48d..de30180a 100755 --- a/scripts/training/stop.sh +++ b/scripts/training/stop.sh @@ -1,19 +1,24 @@ #!/usr/bin/env bash - STACK_NAME="deepracer-$DR_RUN_ID" RUN_NAME=${DR_LOCAL_S3_MODEL_PREFIX} -SAGEMAKER_CONTAINERS=$(docker ps | awk ' /sagemaker/ { print $1 } ' | xargs) +SAGEMAKER_CONTAINERS=$(docker ps | awk ' /simapp/ { print $1 } ' | xargs) -if [[ -n $SAGEMAKER_CONTAINERS ]]; then +if [[ -n "$SAGEMAKER_CONTAINERS" ]]; then for CONTAINER in $SAGEMAKER_CONTAINERS; do CONTAINER_NAME=$(docker ps --format '{{.Names}}' --filter id=$CONTAINER) - CONTAINER_PREFIX=$(echo $CONTAINER_NAME | perl -n -e'/(.*)_(algo(.*))_./; print $1') - COMPOSE_SERVICE_NAME=$(echo $CONTAINER_NAME | perl -n -e'/(.*)_(algo(.*))_./; print $2') - COMPOSE_FILE=$(sudo find /tmp/sagemaker -name docker-compose.yaml -exec grep -l "$RUN_NAME" {} + | grep $CONTAINER_PREFIX) - if [[ -n $COMPOSE_FILE ]]; then - sudo docker compose -f $COMPOSE_FILE stop $COMPOSE_SERVICE_NAME - docker container rm $CONTAINER -v >/dev/null + CONTAINER_PREFIX=$(echo $CONTAINER_NAME | perl -n -e'/(.*)-(algo-(.)-(.*))/; print $1') + COMPOSE_SERVICE_NAME=$(echo $CONTAINER_NAME | perl -n -e'/(.*)-(algo-(.)-(.*))/; print $2') + + if [[ -n "$COMPOSE_SERVICE_NAME" ]]; then + COMPOSE_FILES=$(sudo find /tmp/sagemaker -name docker-compose.yaml -exec grep -l "$COMPOSE_SERVICE_NAME" {} +) + for COMPOSE_FILE in $COMPOSE_FILES; do + if sudo grep -q "RUN_ID=${DR_RUN_ID}" $COMPOSE_FILE && sudo grep -q "${RUN_NAME}" $COMPOSE_FILE; then + echo Found Sagemaker as $CONTAINER_NAME + sudo docker compose -f $COMPOSE_FILE stop $COMPOSE_SERVICE_NAME + docker container rm $CONTAINER -v >/dev/null + fi + done fi done fi diff --git a/utils/start-local-browser.sh b/utils/start-local-browser.sh index da21ebc8..c1d78591 100755 --- a/utils/start-local-browser.sh +++ b/utils/start-local-browser.sh @@ -58,7 +58,7 @@ fi echo "DR-$DR_RUN_ID - $DR_LOCAL_S3_MODEL_PREFIX - $TOPIC

DR-$DR_RUN_ID - $DR_LOCAL_S3_MODEL_PREFIX - $TOPIC

" >$FILE -ROBOMAKER_CONTAINERS=$(docker ps --format "{{.ID}}" --filter name=deepracer-$DR_RUN_ID --filter "ancestor=awsdeepracercommunity/deepracer-robomaker:$DR_ROBOMAKER_IMAGE") +ROBOMAKER_CONTAINERS=$(docker ps --format "{{.ID}}" --filter name=deepracer-$DR_RUN_ID --filter "ancestor=${DR_SIMAPP_SOURCE}:${DR_SIMAPP_VERSION}") if [ -z "$ROBOMAKER_CONTAINERS" ]; then echo "No running robomakers. Exiting." exit From 061b1a6d9fa3d44b71fa108465dc6e4f8f21df18 Mon Sep 17 00:00:00 2001 From: Lars Lorentz Ludvigsen <59617571+larsll@users.noreply.github.com> Date: Sat, 6 Jul 2024 13:16:48 +0200 Subject: [PATCH 02/12] Fix swarm init (#177) --- bin/init.sh | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/bin/init.sh b/bin/init.sh index 50e4c65d..dae4985d 100755 --- a/bin/init.sh +++ b/bin/init.sh @@ -151,7 +151,31 @@ SAGEMAKER_NW='sagemaker-local' if [[ "${OPT_STYLE}" == "swarm" ]]; then + docker node ls >/dev/null 2>/dev/null + if [ $? -ne 0 ]; then + echo "Swarm exists. Exiting." + exit 1 + fi + docker swarm init + if [ $? -ne 0 ]; then + + DEFAULT_IFACE=$(ip route | grep default | awk '{print $5}') + DEFAULT_IP=$(ip addr show $DEFAULT_IFACE | grep "inet\b" | awk '{print $2}' | cut -d/ -f1) + + if [ -z "$DEFAULT_IP" ]; then + echo "Could not determine default IP address. Exiting." + exit 1 + fi + + echo "Error when creating swarm, trying again with advertise address $DEFAULT_IP." + docker swarm init --advertise-addr $DEFAULT_IP + if [ $? -ne 0 ]; then + echo "Cound not create swarm. Exiting." + exit 1 + fi + fi + SWARM_NODE=$(docker node inspect self | jq .[0].ID -r) docker node update --label-add Sagemaker=true $SWARM_NODE >/dev/null 2>/dev/null docker node update --label-add Robomaker=true $SWARM_NODE >/dev/null 2>/dev/null From d77072a9ba3b6598fbe700d08e1720a8600571ee Mon Sep 17 00:00:00 2001 From: Lars Ludvigsen Date: Sat, 6 Jul 2024 13:59:02 +0200 Subject: [PATCH 03/12] Exit code fix --- scripts/evaluation/start.sh | 4 ++-- scripts/training/start.sh | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/scripts/evaluation/start.sh b/scripts/evaluation/start.sh index 64942ce8..ed22f3e3 100755 --- a/scripts/evaluation/start.sh +++ b/scripts/evaluation/start.sh @@ -83,14 +83,14 @@ if [[ "${DR_HOST_X,,}" == "true" ]]; then if ! DISPLAY=$ROBO_DISPLAY timeout 1s xset q &>/dev/null; then echo "No X Server running on display $ROBO_DISPLAY. Exiting" - exit 0 + exit 1 fi if [[ -z "$XAUTHORITY" ]]; then export XAUTHORITY=~/.Xauthority if [[ ! -f "$XAUTHORITY" ]]; then echo "No XAUTHORITY defined. .Xauthority does not exist. Stopping." - exit 0 + exit 1 fi fi fi diff --git a/scripts/training/start.sh b/scripts/training/start.sh index b679cd51..b0ec5097 100755 --- a/scripts/training/start.sh +++ b/scripts/training/start.sh @@ -160,14 +160,14 @@ if [[ "${DR_HOST_X,,}" == "true" ]]; then if ! DISPLAY=$ROBO_DISPLAY timeout 1s xset q &>/dev/null; then echo "No X Server running on display $ROBO_DISPLAY. Exiting" - exit 0 + exit 1 fi if [[ -z "$XAUTHORITY" ]]; then export XAUTHORITY=~/.Xauthority if [[ ! -f "$XAUTHORITY" ]]; then echo "No XAUTHORITY defined. .Xauthority does not exist. Stopping." - exit 0 + exit 1 fi fi From 12a7cbff016eea3e09997b6420bf39f34cf37391 Mon Sep 17 00:00:00 2001 From: Lars Ludvigsen Date: Sat, 6 Jul 2024 14:04:52 +0200 Subject: [PATCH 04/12] Robomaker command default value --- bin/scripts_wrapper.sh | 8 ++++---- docker/docker-compose-eval.yml | 2 +- docker/docker-compose-training.yml | 2 +- scripts/evaluation/stop.sh | 1 - scripts/training/stop.sh | 1 - 5 files changed, 6 insertions(+), 8 deletions(-) diff --git a/bin/scripts_wrapper.sh b/bin/scripts_wrapper.sh index b34d2128..4a028ed5 100644 --- a/bin/scripts_wrapper.sh +++ b/bin/scripts_wrapper.sh @@ -46,7 +46,7 @@ function dr-increment-training { } function dr-stop-training { - ROBOMAKER_COMMAND="" bash -c "cd $DR_DIR/scripts/training && ./stop.sh" + bash -c "cd $DR_DIR/scripts/training && ./stop.sh" } function dr-start-evaluation { @@ -55,7 +55,7 @@ function dr-start-evaluation { } function dr-stop-evaluation { - ROBOMAKER_COMMAND="" bash -c "cd $DR_DIR/scripts/evaluation && ./stop.sh" + bash -c "cd $DR_DIR/scripts/evaluation && ./stop.sh" } function dr-start-tournament { @@ -63,13 +63,13 @@ function dr-start-tournament { } function dr-start-loganalysis { - ROBOMAKER_COMMAND="" bash -c "cd $DR_DIR/scripts/log-analysis && ./start.sh" + bash -c "cd $DR_DIR/scripts/log-analysis && ./start.sh" } function dr-stop-loganalysis { eval LOG_ANALYSIS_ID=$(docker ps | awk ' /deepracer-analysis/ { print $1 }') if [ -n "$LOG_ANALYSIS_ID" ]; then - ROBOMAKER_COMMAND="" bash -c "cd $DR_DIR/scripts/log-analysis && ./stop.sh" + bash -c "cd $DR_DIR/scripts/log-analysis && ./stop.sh" else echo "Log-analysis is not running." fi diff --git a/docker/docker-compose-eval.yml b/docker/docker-compose-eval.yml index a46d19cf..7315a355 100644 --- a/docker/docker-compose-eval.yml +++ b/docker/docker-compose-eval.yml @@ -11,7 +11,7 @@ services: command: ["/bin/bash", "-c", "echo No work for coach in Evaluation Mode"] robomaker: image: ${DR_SIMAPP_SOURCE}:${DR_SIMAPP_VERSION} - command: ["${ROBOMAKER_COMMAND}"] + command: ["${ROBOMAKER_COMMAND:-}"] ports: - "${DR_ROBOMAKER_EVAL_PORT}:8080" environment: diff --git a/docker/docker-compose-training.yml b/docker/docker-compose-training.yml index 4069d178..02bb62db 100644 --- a/docker/docker-compose-training.yml +++ b/docker/docker-compose-training.yml @@ -29,7 +29,7 @@ services: - "/tmp/sagemaker:/tmp/sagemaker" robomaker: image: ${DR_SIMAPP_SOURCE}:${DR_SIMAPP_VERSION} - command: ["${ROBOMAKER_COMMAND}"] + command: ["${ROBOMAKER_COMMAND:-}"] ports: - "${DR_ROBOMAKER_TRAIN_PORT}:8080" - "${DR_ROBOMAKER_GUI_PORT}:5900" diff --git a/scripts/evaluation/stop.sh b/scripts/evaluation/stop.sh index 228a8a49..d4ea7a6b 100755 --- a/scripts/evaluation/stop.sh +++ b/scripts/evaluation/stop.sh @@ -9,6 +9,5 @@ if [[ "${DR_DOCKER_STYLE,,}" == "swarm" ]]; then else COMPOSE_FILES=$(echo ${DR_EVAL_COMPOSE_FILE} | cut -f1-2 -d\ ) export DR_CURRENT_PARAMS_FILE="" - export ROBOMAKER_COMMAND="" docker compose $COMPOSE_FILES -p $STACK_NAME down fi diff --git a/scripts/training/stop.sh b/scripts/training/stop.sh index de30180a..ad4872e0 100755 --- a/scripts/training/stop.sh +++ b/scripts/training/stop.sh @@ -29,6 +29,5 @@ if [[ "${DR_DOCKER_STYLE,,}" == "swarm" ]]; then else COMPOSE_FILES=$(echo ${DR_TRAIN_COMPOSE_FILE} | cut -f1-2 -d\ ) export DR_CURRENT_PARAMS_FILE="" - export ROBOMAKER_COMMAND="" docker compose $COMPOSE_FILES -p $STACK_NAME down fi From 5a5ebfcdff11bfe8e27ceddbc766034fe3e1aaba Mon Sep 17 00:00:00 2001 From: Lars Lorentz Ludvigsen <59617571+larsll@users.noreply.github.com> Date: Sun, 7 Jul 2024 13:13:58 +0200 Subject: [PATCH 05/12] Adding WSL2 OpenGL support (#181) * Adding WSL2 OpenGL support * XAUTHORITY not needed in WSL2 * Updated Doc --- bin/activate.sh | 26 +++++++++++++++++++++--- docker/docker-compose-local-xorg-wsl.yml | 15 ++++++++++++++ docker/docker-compose-local-xorg.yml | 1 - docs/opengl.md | 13 +++++++++++- scripts/evaluation/start.sh | 7 ++++++- scripts/training/start.sh | 7 ++++++- 6 files changed, 62 insertions(+), 7 deletions(-) create mode 100644 docker/docker-compose-local-xorg-wsl.yml diff --git a/bin/activate.sh b/bin/activate.sh index a01e1697..6a4b6298 100644 --- a/bin/activate.sh +++ b/bin/activate.sh @@ -70,6 +70,11 @@ if [[ "$(type service 2>/dev/null)" ]]; then service docker status >/dev/null || sudo service docker start fi +## Check if WSL2 +if grep -qi Microsoft /proc/version && grep -q "WSL2" /proc/version; then + IS_WSL2="yes" +fi + # Check if we will use Docker Swarm or Docker Compose # If not defined then use Swarm if [[ -z "${DR_DOCKER_STYLE}" ]]; then @@ -130,10 +135,25 @@ else DR_EVAL_COMPOSE_FILE="$DR_DOCKER_FILE_SEP $DIR/docker/docker-compose-eval.yml" fi -# Prevent docker swarms to restart +# Add host X support for Linux and WSL2 if [[ "${DR_HOST_X,,}" == "true" ]]; then - DR_TRAIN_COMPOSE_FILE="$DR_TRAIN_COMPOSE_FILE $DR_DOCKER_FILE_SEP $DIR/docker/docker-compose-local-xorg.yml" - DR_EVAL_COMPOSE_FILE="$DR_EVAL_COMPOSE_FILE $DR_DOCKER_FILE_SEP $DIR/docker/docker-compose-local-xorg.yml" + if [[ "$IS_WSL2" == "yes" ]]; then + + # Check if package x11-server-utils is installed + if ! command -v xset &> /dev/null; then + echo "WARNING: Package x11-server-utils is not installed. Please install it to enable X11 support." + fi + + if [[ "${DR_DOCKER_STYLE,,}" == "swarm" && "${DR_USE_GUI,,}" == "true" ]]; then + echo "WARNING: Cannot use GUI in Swarm mode. Please switch to Compose mode." + fi + + DR_TRAIN_COMPOSE_FILE="$DR_TRAIN_COMPOSE_FILE $DR_DOCKER_FILE_SEP $DIR/docker/docker-compose-local-xorg-wsl.yml" + DR_EVAL_COMPOSE_FILE="$DR_EVAL_COMPOSE_FILE $DR_DOCKER_FILE_SEP $DIR/docker/docker-compose-local-xorg-wsl.yml" + else + DR_TRAIN_COMPOSE_FILE="$DR_TRAIN_COMPOSE_FILE $DR_DOCKER_FILE_SEP $DIR/docker/docker-compose-local-xorg.yml" + DR_EVAL_COMPOSE_FILE="$DR_EVAL_COMPOSE_FILE $DR_DOCKER_FILE_SEP $DIR/docker/docker-compose-local-xorg.yml" + fi fi # Prevent docker swarms to restart diff --git a/docker/docker-compose-local-xorg-wsl.yml b/docker/docker-compose-local-xorg-wsl.yml new file mode 100644 index 00000000..06d9fb4a --- /dev/null +++ b/docker/docker-compose-local-xorg-wsl.yml @@ -0,0 +1,15 @@ +version: '3.7' + +services: + robomaker: + environment: + - DISPLAY + - USE_EXTERNAL_X=${DR_HOST_X} + - QT_X11_NO_MITSHM=1 + - LD_LIBRARY_PATH=/usr/lib/wsl/lib + volumes: + - '/tmp/.X11-unix/:/tmp/.X11-unix' + - '/mnt/wslg:/mnt/wslg' + - '/usr/lib/wsl:/usr/lib/wsl' + devices: + - /dev/dxg diff --git a/docker/docker-compose-local-xorg.yml b/docker/docker-compose-local-xorg.yml index a1605421..af5ae9cf 100644 --- a/docker/docker-compose-local-xorg.yml +++ b/docker/docker-compose-local-xorg.yml @@ -7,7 +7,6 @@ services: - USE_EXTERNAL_X=${DR_HOST_X} - XAUTHORITY=/root/.Xauthority - QT_X11_NO_MITSHM=1 - - NVIDIA_DRIVER_CAPABILITIES=all volumes: - '/tmp/.X11-unix/:/tmp/.X11-unix' - '${XAUTHORITY}:/root/.Xauthority' \ No newline at end of file diff --git a/docs/opengl.md b/docs/opengl.md index 206cbf5e..8ee99918 100644 --- a/docs/opengl.md +++ b/docs/opengl.md @@ -41,7 +41,6 @@ This also applies for a desktop computer where you are not logged in. In this ca * Setup an X-server on the host. `utils/setup-xorg.sh` is a basic installation script. * Configure DRfC using the following settings in `system.env`: * `DR_HOST_X=True`; uses the local X server rather than starting one within the docker container. - * `DR_ROBOMAKER_IMAGE`; choose the tag for an OpenGL enabled image - e.g. `cpu-gl-avx` for an image where Tensorflow will use CPU or `gpu-gl` for an image where also Tensorflow will use the GPU. * `DR_DISPLAY`; the X display that the headless X server will start on. (Default is `:99`, avoid using `:0` or `:1` as it may conflict with other X servers.) Start up the X server with `utils/start-xorg.sh`. @@ -49,3 +48,15 @@ Start up the X server with `utils/start-xorg.sh`. If `DR_GUI_ENABLE=True` then a VNC server will be started on port 5900 so that you can connect and interact with the Gazebo UI. Check that OpenGL is working by looking for `gzserver` in `nvidia-smi`. + +## WSL2 on Windows 11 + +OpenGL is also supported in WSL2 on Windows 11. By default an Xwayland server is started in Ubuntu 22.04. + +To enable OpenGL acceleration perform the following steps: +* Install x11-server-utils with `sudo apt install x11-server-utils`. +* Configure DRfC using the following settings in `system.env`: + * `DR_HOST_X=True`; uses the local X server rather than starting one within the docker container. + * `DR_DISPLAY=:0`; the Xwayland starts on :0 by default. + +If you want to interact with the Gazebo UI, set `DR_DOCKER_STYLE=compose` and `DR_GUI_ENABLE=True` in `system.env`. \ No newline at end of file diff --git a/scripts/evaluation/start.sh b/scripts/evaluation/start.sh index ed22f3e3..b6059054 100755 --- a/scripts/evaluation/start.sh +++ b/scripts/evaluation/start.sh @@ -34,6 +34,11 @@ while getopts ":qc" opt; do esac done +## Check if WSL2 +if grep -qi Microsoft /proc/version && grep -q "WSL2" /proc/version; then + IS_WSL2="yes" +fi + # set evaluation specific environment variables STACK_NAME="deepracer-eval-$DR_RUN_ID" STACK_CONTAINERS=$(docker stack ps $STACK_NAME 2>/dev/null | wc -l) @@ -86,7 +91,7 @@ if [[ "${DR_HOST_X,,}" == "true" ]]; then exit 1 fi - if [[ -z "$XAUTHORITY" ]]; then + if [[ -z "$XAUTHORITY" && "$IS_WSL2" != "yes" ]]; then export XAUTHORITY=~/.Xauthority if [[ ! -f "$XAUTHORITY" ]]; then echo "No XAUTHORITY defined. .Xauthority does not exist. Stopping." diff --git a/scripts/training/start.sh b/scripts/training/start.sh index b0ec5097..7560620d 100755 --- a/scripts/training/start.sh +++ b/scripts/training/start.sh @@ -58,6 +58,11 @@ while getopts ":whqsavr:" opt; do esac done +## Check if WSL2 +if grep -qi Microsoft /proc/version && grep -q "WSL2" /proc/version; then + IS_WSL2="yes" +fi + # Ensure Sagemaker's folder is there if [ ! -d /tmp/sagemaker ]; then sudo mkdir -p /tmp/sagemaker @@ -163,7 +168,7 @@ if [[ "${DR_HOST_X,,}" == "true" ]]; then exit 1 fi - if [[ -z "$XAUTHORITY" ]]; then + if [[ -z "$XAUTHORITY" && "$IS_WSL2" != "yes" ]]; then export XAUTHORITY=~/.Xauthority if [[ ! -f "$XAUTHORITY" ]]; then echo "No XAUTHORITY defined. .Xauthority does not exist. Stopping." From 1770afee1dd2d82f0bfd71f3a85b6753b8255984 Mon Sep 17 00:00:00 2001 From: Lars Ludvigsen Date: Fri, 12 Jul 2024 21:13:36 +0200 Subject: [PATCH 06/12] Pass Telegraf Variables to RL-Coach --- docker/docker-compose-training.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docker/docker-compose-training.yml b/docker/docker-compose-training.yml index 02bb62db..0848f465 100644 --- a/docker/docker-compose-training.yml +++ b/docker/docker-compose-training.yml @@ -24,6 +24,8 @@ services: - MODELMETADATA_FILE_S3_KEY=${DR_LOCAL_S3_MODEL_METADATA_KEY} - CUDA_VISIBLE_DEVICES=${DR_SAGEMAKER_CUDA_DEVICES:-} - MAX_MEMORY_STEPS=${DR_TRAIN_MAX_STEPS_PER_ITERATION:-} + - TELEGRAF_HOST=${DR_TELEGRAF_HOST:-} + - TELEGRAF_PORT=${DR_TELEGRAF_PORT:-} volumes: - "/var/run/docker.sock:/var/run/docker.sock" - "/tmp/sagemaker:/tmp/sagemaker" From 9a4ffa1fd0d36ba3d3f7b0dbb828fbe5d8c8d3ba Mon Sep 17 00:00:00 2001 From: Matt Camp Date: Sat, 13 Jul 2024 09:26:52 +0200 Subject: [PATCH 07/12] Add params for KVS overlay and sagemaker metrics (#179) Co-authored-by: Lars Lorentz Ludvigsen <59617571+larsll@users.noreply.github.com> --- defaults/template-system.env | 1 + docker/docker-compose-training.yml | 3 ++- scripts/training/prepare-config.py | 3 +++ 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/defaults/template-system.env b/defaults/template-system.env index 680f888a..8d00c64f 100644 --- a/defaults/template-system.env +++ b/defaults/template-system.env @@ -10,6 +10,7 @@ DR_KINESIS_STREAM_NAME= DR_CAMERA_MAIN_ENABLE=True DR_CAMERA_SUB_ENABLE=False DR_CAMERA_KVS_ENABLE=True +DR_ENABLE_EXTRA_KVS_OVERLAY=False DR_SIMAPP_SOURCE=awsdeepracercommunity/deepracer-simapp DR_SIMAPP_VERSION= DR_MINIO_IMAGE=latest diff --git a/docker/docker-compose-training.yml b/docker/docker-compose-training.yml index 0848f465..f6a31261 100644 --- a/docker/docker-compose-training.yml +++ b/docker/docker-compose-training.yml @@ -25,7 +25,8 @@ services: - CUDA_VISIBLE_DEVICES=${DR_SAGEMAKER_CUDA_DEVICES:-} - MAX_MEMORY_STEPS=${DR_TRAIN_MAX_STEPS_PER_ITERATION:-} - TELEGRAF_HOST=${DR_TELEGRAF_HOST:-} - - TELEGRAF_PORT=${DR_TELEGRAF_PORT:-} + - TELEGRAF_PORT=${DR_TELEGRAF_PORT:-} + volumes: - "/var/run/docker.sock:/var/run/docker.sock" - "/tmp/sagemaker:/tmp/sagemaker" diff --git a/scripts/training/prepare-config.py b/scripts/training/prepare-config.py index 3f692c6d..f2fe04c5 100755 --- a/scripts/training/prepare-config.py +++ b/scripts/training/prepare-config.py @@ -52,6 +52,7 @@ config['CAMERA_MAIN_ENABLE'] = os.environ.get('DR_CAMERA_MAIN_ENABLE', 'True') config['CAMERA_SUB_ENABLE'] = os.environ.get('DR_CAMERA_SUB_ENABLE', 'True') config['BEST_MODEL_METRIC'] = os.environ.get('DR_TRAIN_BEST_MODEL_METRIC', 'progress') +config['ENABLE_EXTRA_KVS_OVERLAY'] = os.environ.get('DR_ENABLE_EXTRA_KVS_OVERLAY', 'False') # Object Avoidance if config['RACE_TYPE'] == 'OBJECT_AVOIDANCE': @@ -158,6 +159,8 @@ config.update({'REVERSE_DIR': os.environ.get('DR_TRAIN_REVERSE_DIRECTION', False)}) config.update({'CAMERA_MAIN_ENABLE': os.environ.get('DR_CAMERA_MAIN_ENABLE', 'True')}) config.update({'CAMERA_SUB_ENABLE': os.environ.get('DR_CAMERA_SUB_ENABLE', 'True')}) + config.update({'ENABLE_EXTRA_KVS_OVERLAY': os.environ.get('DR_ENABLE_EXTRA_KVS_OVERLAY', 'False')}) + # Update Object Avoidance parameters if config['RACE_TYPE'] == 'OBJECT_AVOIDANCE': From 7927efd2b017454e272bc8fe1809a7551657e48c Mon Sep 17 00:00:00 2001 From: Lars Ludvigsen Date: Sun, 14 Jul 2024 20:29:13 +0200 Subject: [PATCH 08/12] Ensure OpenGL works --- docker/docker-compose-local-xorg.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/docker/docker-compose-local-xorg.yml b/docker/docker-compose-local-xorg.yml index af5ae9cf..a1605421 100644 --- a/docker/docker-compose-local-xorg.yml +++ b/docker/docker-compose-local-xorg.yml @@ -7,6 +7,7 @@ services: - USE_EXTERNAL_X=${DR_HOST_X} - XAUTHORITY=/root/.Xauthority - QT_X11_NO_MITSHM=1 + - NVIDIA_DRIVER_CAPABILITIES=all volumes: - '/tmp/.X11-unix/:/tmp/.X11-unix' - '${XAUTHORITY}:/root/.Xauthority' \ No newline at end of file From d7d056d8f85235ef2b7197729bc77929331f8f3d Mon Sep 17 00:00:00 2001 From: Matt Camp Date: Mon, 15 Jul 2024 17:37:40 +0200 Subject: [PATCH 09/12] Add flags to enable KVS extra overlay (#184) * Initial testing * Sagemaker SDK 2 * Single image support * Remove unnecessary variable * Add params for KVS overlay and sagemaker metrics * Add params for KVS overlay and sagemaker metrics * Add DR_ENABLE_EXTRA_KVS_OVERLAY to evaluation/start script * Update docker-compose-training.yml * Update docker-compose-training.yml --------- Co-authored-by: Lars Ludvigsen Co-authored-by: Lars Lorentz Ludvigsen Co-authored-by: Lars Lorentz Ludvigsen <59617571+larsll@users.noreply.github.com> --- docker/docker-compose-training.yml | 2 +- scripts/evaluation/prepare-config.py | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/docker/docker-compose-training.yml b/docker/docker-compose-training.yml index f6a31261..f033dcd7 100644 --- a/docker/docker-compose-training.yml +++ b/docker/docker-compose-training.yml @@ -53,4 +53,4 @@ services: - GAZEBO_ARGS=${DR_GAZEBO_ARGS:-} - TELEGRAF_HOST=${DR_TELEGRAF_HOST:-} - TELEGRAF_PORT=${DR_TELEGRAF_PORT:-} - init: true \ No newline at end of file + init: true diff --git a/scripts/evaluation/prepare-config.py b/scripts/evaluation/prepare-config.py index f73269aa..1217b94a 100755 --- a/scripts/evaluation/prepare-config.py +++ b/scripts/evaluation/prepare-config.py @@ -81,6 +81,7 @@ def str2bool(v): config['CAMERA_MAIN_ENABLE'] = os.environ.get('DR_CAMERA_MAIN_ENABLE', 'True') config['CAMERA_SUB_ENABLE'] = os.environ.get('DR_CAMERA_SUB_ENABLE', 'True') config['REVERSE_DIR'] = os.environ.get('DR_EVAL_REVERSE_DIRECTION', False) +config['ENABLE_EXTRA_KVS_OVERLAY'] = os.environ.get('DR_ENABLE_EXTRA_KVS_OVERLAY', 'False') # Object Avoidance if config['RACE_TYPE'] == 'OBJECT_AVOIDANCE': From b8ca8ffc1dbb63760dd02c89e24a58c09ff6bb01 Mon Sep 17 00:00:00 2001 From: Lars Ludvigsen Date: Mon, 15 Jul 2024 22:21:49 +0200 Subject: [PATCH 10/12] Install fixes --- bin/init.sh | 6 +++--- defaults/dependencies.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/bin/init.sh b/bin/init.sh index dae4985d..febc131c 100755 --- a/bin/init.sh +++ b/bin/init.sh @@ -143,8 +143,8 @@ done # Download docker images. Change to build statements if locally built images are desired. SIMAPP_VERSION=$(jq -r '.containers.simapp | select (.!=null)' $INSTALL_DIR/defaults/dependencies.json) -sed -i "s//$SIMAPP_VERSION/g" $INSTALL_DIR/system.env -docker pull awsdeepracercommunity/deepracer-simapp:$SIMAPP_VERSION +sed -i "s//$SIMAPP_VERSION-$SAGEMAKER_TAG/g" $INSTALL_DIR/system.env +docker pull awsdeepracercommunity/deepracer-simapp:$SIMAPP_VERSION-$SAGEMAKER_TAG # create the network sagemaker-local if it doesn't exit SAGEMAKER_NW='sagemaker-local' @@ -152,7 +152,7 @@ SAGEMAKER_NW='sagemaker-local' if [[ "${OPT_STYLE}" == "swarm" ]]; then docker node ls >/dev/null 2>/dev/null - if [ $? -ne 0 ]; then + if [ $? -eq 0 ]; then echo "Swarm exists. Exiting." exit 1 fi diff --git a/defaults/dependencies.json b/defaults/dependencies.json index 1ba851f4..ec66cff0 100644 --- a/defaults/dependencies.json +++ b/defaults/dependencies.json @@ -1,6 +1,6 @@ { "master_version": "5.3", "containers": { - "simapp": "5.3.0" + "simapp": "5.3.0-rc0" } } From a46ef50a749df760116cdc7c01ccf51e761a19ee Mon Sep 17 00:00:00 2001 From: Lars Lorentz Ludvigsen Date: Tue, 16 Jul 2024 08:45:39 +0200 Subject: [PATCH 11/12] Improved help if DR_SIMAPP_SOURCE and VERSION not defined --- bin/activate.sh | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/bin/activate.sh b/bin/activate.sh index 6a4b6298..7a3c520f 100644 --- a/bin/activate.sh +++ b/bin/activate.sh @@ -204,12 +204,19 @@ if [[ -n "${DR_MINIO_COMPOSE_FILE}" ]]; then fi ## Version check -if [[ -z "$DR_SIMAPP_SOURCE" ]]; then - echo "ERROR: Variable DR_SIMAPP_SOURCE not defined." -fi -if [[ -z "$DR_SIMAPP_VERSION" ]]; then - echo "ERROR: Variable DR_SIMAPP_VERSION not defined." +if [[ -z "$DR_SIMAPP_SOURCE" || -z "$DR_SIMAPP_VERSION" ]]; then + DEFAULT_SIMAPP_VERSION=$(jq -r '.containers.simapp | select (.!=null)' $DIR/defaults/dependencies.json) + echo "ERROR: Variable DR_SIMAPP_SOURCE or DR_SIMAPP_VERSION not defined." + echo "" + echo "As of version 5.3 the variables DR_SIMAPP_SOURCE and DR_SIMAPP_VERSION are required in system.env." + echo "To continue to use the separate Sagemaker, Robomaker and RL Coach images, run 'git checkout legacy'." + echo "" + echo "Please add the following lines to your system.env file:" + echo "DR_SIMAPP_SOURCE=awsdeepracercommunity/deepracer-simapp" + echo "DR_SIMAPP_VERSION=${DEFAULT_SIMAPP_VERSION}-gpu" + return fi + DEPENDENCY_VERSION=$(jq -r '.master_version | select (.!=null)' $DIR/defaults/dependencies.json) SIMAPP_VER=$(docker inspect ${DR_SIMAPP_SOURCE}:${DR_SIMAPP_VERSION} 2>/dev/null | jq -r .[].Config.Labels.version) From 22da1f8880ed7c7746d28fd0a16e60e3e51f5eeb Mon Sep 17 00:00:00 2001 From: Lars Lorentz Ludvigsen <59617571+larsll@users.noreply.github.com> Date: Tue, 16 Jul 2024 18:46:33 +0200 Subject: [PATCH 12/12] Version 5.3.1 --- defaults/dependencies.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/defaults/dependencies.json b/defaults/dependencies.json index ec66cff0..684b9cba 100644 --- a/defaults/dependencies.json +++ b/defaults/dependencies.json @@ -1,6 +1,6 @@ { "master_version": "5.3", "containers": { - "simapp": "5.3.0-rc0" + "simapp": "5.3.1" } }