From 3493ce3d5b0af980d0c6c91fe7b8d8b33bb6fe76 Mon Sep 17 00:00:00 2001 From: vsoch Date: Tue, 22 Sep 2020 16:56:17 -0600 Subject: [PATCH] adding nero example Signed-off-by: vsoch --- README.md | 4 +- end.sh | 6 ++- examples/nero-jupyter.png | Bin 0 -> 58841 bytes examples/recipe-nero-gpu.md | 87 +++++++++++++++++++++++++++++++ helpers.sh | 19 ++++--- hosts/nero_ssh.sh | 19 +++++++ sbatches/nero/py3-jupyter.sbatch | 11 ++++ setup.sh | 11 +++- start-node.sh | 13 +++-- start.sh | 14 ++++- 10 files changed, 168 insertions(+), 16 deletions(-) create mode 100644 examples/nero-jupyter.png create mode 100644 examples/recipe-nero-gpu.md create mode 100644 hosts/nero_ssh.sh create mode 100755 sbatches/nero/py3-jupyter.sbatch diff --git a/README.md b/README.md index d1f44ab..f0238a1 100644 --- a/README.md +++ b/README.md @@ -134,9 +134,11 @@ bash start.sh sherlock/containershare-notebook docker://vanessa/repo2docker-juli ``` If you would like to request a custom notebook, please [reach out](https://www.github.com/vsoch/containershare/issues). +See [examples](examples) for Nero and Sherlock in the [examples](examples) folder. -## Usage +## More Examples +In addition to [examples](examples), here are some quick command examples: ```bash # To start a jupyter notebook in a specific directory ON the cluster resource diff --git a/end.sh b/end.sh index 3398723..c2aed69 100755 --- a/end.sh +++ b/end.sh @@ -22,5 +22,7 @@ NAME=$1 echo "Killing $NAME slurm job on ${RESOURCE}" ssh ${RESOURCE} "squeue --name=$NAME --user=$FORWARD_USERNAME -o '%A' -h | xargs --no-run-if-empty /usr/bin/scancel" -echo "Killing listeners on ${RESOURCE}" -ssh ${RESOURCE} "/usr/sbin/lsof -i :$PORT -t | xargs --no-run-if-empty kill" +if [[ "${RESOURCE}" != "nero" ]]; then + echo "Killing listeners on ${RESOURCE}" + ssh ${RESOURCE} "/usr/sbin/lsof -i :$PORT -t | xargs --no-run-if-empty kill" +fi diff --git a/examples/nero-jupyter.png b/examples/nero-jupyter.png new file mode 100644 index 0000000000000000000000000000000000000000..91f84defffc225b5711a3e37b594ba33ebe16ba8 GIT binary patch literal 58841 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 S!1B&S5JITb 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 literal 0 HcmV?d00001 diff --git a/examples/recipe-nero-gpu.md b/examples/recipe-nero-gpu.md new file mode 100644 index 0000000..fce4714 --- /dev/null +++ b/examples/recipe-nero-gpu.md @@ -0,0 +1,87 @@ +# Jupyter with GPU on Nero + +## Nero + +If you want to run forward on Nero, you can first generate the login credential for +your ssh configuration file by doing: + +```bash +/bin/bash hosts/nero_ssh.sh +``` +It will ask you for your username, and then give a snippet of code to copy into your +`~/.ssh/config` file. It should prompt you for your password and two step the first time, +and then work to login with just `ssh nero`. On Nero, you will also need to ensure that +you have the nbserverproxy module installed. To install packages from pypi, you'll +need this pip settings file exists in your $HOME folder: + +```bash +~/.pip/pip.conf +``` + +Within in you need to define this mirror: + +``` +[global] +index-url = https://nero-mirror.stanford.edu/pypi/simple +``` + +And then install the needed Python3 software for the notebook: + +```bash +pip3 install nbserverproxy --user +``` + +Now let's generate our params.sh file that will specify using nero, and wanting a GPU. +Do this via [setup.sh](setup.sh) to generate a params.sh file that looks like: + +``` +FORWARD_USERNAME="vsochat" +PORT="49153" +PARTITION="gpu" +RESOURCE="nero" +MEM="20G" +TIME="8:00:00" +CONTAINERSHARE="/scratch/users/vsochat/share" +GRES="gpu:1" +``` + +You can edit the defaults (e.g., time and memory) to be what fits your needs. +Now let's run the script to launch our node! By default the notebook home +will be our home directory, and we will load anaconda 3 and launch a notebook +on the port specified. + +```bash +bash start.sh nero/py3-jupyter +``` + +You'll see information and instructions stream to the screen. + +``` + +== View logs in separate terminal == +ssh nero cat /home/vsochat/forward-util/py3-jupyter.sbatch.out +ssh nero cat /home/vsochat/forward-util/py3-jupyter.sbatch.err + +== Instructions == +1. Password, output, and error printed to this terminal? Look at logs (see instruction above) +2. Browser: http://sh-02-21.int:8888/ -> http://localhost:8888/... +3. To end session: bash end.sh nero/py3-jupyter +``` + +In the example above, we are forwarding port 8888 from our local machine. We would +then open this up to see: + +![nero-jupyter.png](nero-jupyter.png) + +Remember that we need a password! This is actually echoed into the error stream, so +we would issue the following command to get it: + +```bash +ssh nero cat /home/vsochat/forward-util/py3-jupyter.sbatch.err +``` + +When you are ready to clean up: + +```bash +$ bash end.sh nero/py3-jupyter +``` diff --git a/helpers.sh b/helpers.sh index dcb1f32..e3fda58 100644 --- a/helpers.sh +++ b/helpers.sh @@ -96,14 +96,17 @@ function get_machine() { done - echo $MACHINE MACHINE="`ssh ${RESOURCE} squeue --name=$NAME --user=$FORWARD_USERNAME -o "%R" -h`" + # Nero must have lookup based on ip addres + if [[ ${RESOURCE} == "nero" ]]; then + MACHINE=$(ssh ${RESOURCE} scontrol show node $MACHINE | grep NodeAddr | cut -d' ' -f4 | cut -d'=' -f2) + fi echo $MACHINE # If we didn't get a node... - if [[ "$MACHINE" != "sh"* ]] + if [[ "$MACHINE" != "sh"* ]] && [[ "${RESOURCE}" != "nero"* ]] then - echo "Tried ${ATTEMPTS} attempts!" 1>&2 + echo "Tried ${ATTEMPT} attempts!" 1>&2 exit 1 fi } @@ -137,7 +140,11 @@ function setup_port_forwarding() { echo echo "== Setting up port forwarding ==" sleep 5 - echo "ssh -L $PORT:localhost:$PORT ${RESOURCE} ssh -L $PORT:localhost:$PORT -N $MACHINE &" - ssh -L $PORT:localhost:$PORT ${RESOURCE} ssh -L $PORT:localhost:$PORT -N "$MACHINE" & - + if [[ "${RESOURCE}" == "nero" ]]; then + echo "ssh -N -L${PORT}:${MACHINE}:${PORT} nero &" + ssh -N -L${PORT}:${MACHINE}:${PORT} nero & + else + echo "ssh -L $PORT:localhost:$PORT ${RESOURCE} ssh -L $PORT:localhost:$PORT -N $MACHINE &" + ssh -L $PORT:localhost:$PORT ${RESOURCE} ssh -L $PORT:localhost:$PORT -N "$MACHINE" & + fi } diff --git a/hosts/nero_ssh.sh b/hosts/nero_ssh.sh new file mode 100644 index 0000000..ebbfa82 --- /dev/null +++ b/hosts/nero_ssh.sh @@ -0,0 +1,19 @@ +#!/bin/bash +# +# Nero at Stanford +# Prints an ssh configuration for the user, selecting a login node at random +# Sample usage: bash nero_ssh.sh +echo +read -p "Nero username > " FORWARD_USERNAME + +# Randomly select login node from 1..4 +LOGIN_NODE=$((1 + RANDOM % 8)) + +echo "Host nero + User ${FORWARD_USERNAME} + Hostname nero.compute.stanford.edu + GSSAPIDelegateCredentials yes + GSSAPIAuthentication yes + ControlMaster auto + ControlPersist yes + ControlPath ~/.ssh/%C" diff --git a/sbatches/nero/py3-jupyter.sbatch b/sbatches/nero/py3-jupyter.sbatch new file mode 100755 index 0000000..1185356 --- /dev/null +++ b/sbatches/nero/py3-jupyter.sbatch @@ -0,0 +1,11 @@ +#!/bin/bash + +PORT=$1 +NOTEBOOK_DIR=${2:-${HOME}} +cd $NOTEBOOK_DIR + +export PATH=/share/sw/open/anaconda/3/bin:$PATH + +pip3 install nbserverproxy --user +cat /etc/hosts +jupyter lab --ip=0.0.0.0 --port=${PORT} diff --git a/setup.sh b/setup.sh index 729cd91..6c79064 100755 --- a/setup.sh +++ b/setup.sh @@ -27,6 +27,15 @@ echo read -p "${RESOURCE} partition (default: normal) > " PARTITION PARTITION=${PARTITION:-normal} +echo +echo "If you are using a gpu partition, you might want to define the next setting, +--gres to be something like gpu:1 (e.g., setting gpu:1 for this next variable +will be adding the flag --gres=gpu:1. Otherwise, leave blank to leave this unset" +echo +read -p "${RESOURCE} gres (default: unset) > " GRES +GRES=${GRES:-} + + echo SHARE="/scratch/users/vsochat/share" echo "A containershare (https://vsoch.github.io/containershare is a library of @@ -43,7 +52,7 @@ MEM=20G TIME=8:00:00 -for var in FORWARD_USERNAME PORT PARTITION RESOURCE MEM TIME CONTAINERSHARE +for var in FORWARD_USERNAME PORT PARTITION RESOURCE MEM TIME CONTAINERSHARE GRES do echo "$var="'"'"$(eval echo '$'"$var")"'"' done >> params.sh diff --git a/start-node.sh b/start-node.sh index 13e4463..c67ae1b 100755 --- a/start-node.sh +++ b/start-node.sh @@ -54,11 +54,16 @@ SBATCH_NAME=$(basename $SBATCH) command="sbatch --job-name=$NAME --partition=$PARTITION - --output=$RESOURCE_HOME/forward-util/$NAME.out - --error=$RESOURCE_HOME/forward-util/$NAME.err + --output=$RESOURCE_HOME/forward-util/$SBATCH_NAME.out + --error=$RESOURCE_HOME/forward-util/$SBATCH_NAME.err --mem=$MEM - --time=$TIME - $RESOURCE_HOME/forward-util/$SBATCH_NAME $PORT \"${@:2}\"" + --time=$TIME" + +# If we want a gres +if [[ "${GRES}" != "" ]]; then + command="${command} --gres ${GRES}" +fi +command="${command} $RESOURCE_HOME/forward-util/$SBATCH_NAME $PORT \"${@:2}\"" echo ${command} ssh ${RESOURCE} ${command} diff --git a/start.sh b/start.sh index 31cffb6..c9aa82f 100755 --- a/start.sh +++ b/start.sh @@ -44,6 +44,11 @@ echo echo "== Uploading sbatch script ==" scp $FORWARD_SCRIPT ${RESOURCE}:$RESOURCE_HOME/forward-util/ +if [[ "$?" != "0" ]]; then + echo "Issue uploading script with scp, trying sftp..." + echo "put ${FORWARD_SCRIPT}" | sftp ${FORWARD_USERNAME}@${RESOURCE}:${RESOURCE_HOME}/forward-util/ +fi + # adjust PARTITION if necessary set_partition echo @@ -57,8 +62,13 @@ command="sbatch --output=$RESOURCE_HOME/forward-util/$SBATCH_NAME.out --error=$RESOURCE_HOME/forward-util/$SBATCH_NAME.err --mem=$MEM - --time=$TIME - $RESOURCE_HOME/forward-util/$SBATCH_NAME $PORT \"${@:2}\"" + --time=$TIME" + +# If we want a gres +if [[ "${GRES}" != "" ]]; then + command="${command} --gres ${GRES}" +fi +command="${command} $RESOURCE_HOME/forward-util/$SBATCH_NAME $PORT \"${@:2}\"" echo ${command} ssh ${RESOURCE} ${command}