From 86b5bc1789a4b0bf24c2f81e315de9c005f6f0cd Mon Sep 17 00:00:00 2001 From: Mayank Agrawal Date: Mon, 7 Feb 2022 11:34:02 -0500 Subject: [PATCH] Migrate deeplabcut --- bc_vt_deeplabcut/CHANGELOG.md | 10 +++ bc_vt_deeplabcut/DevGuide.md | 45 +++++++++++++ bc_vt_deeplabcut/LICENSE.txt | 24 +++++++ bc_vt_deeplabcut/README.md | 63 +++++++++++++++++ bc_vt_deeplabcut/form.js | 61 +++++++++++++++++ bc_vt_deeplabcut/form.yml.erb | 86 ++++++++++++++++++++++++ bc_vt_deeplabcut/icon.png | Bin 0 -> 44501 bytes bc_vt_deeplabcut/manifest.yml | 14 ++++ bc_vt_deeplabcut/submit.yml.erb | 26 +++++++ bc_vt_deeplabcut/template/after.sh.erb | 13 ++++ bc_vt_deeplabcut/template/before.sh.erb | 21 ++++++ bc_vt_deeplabcut/template/script.sh.erb | 30 +++++++++ bc_vt_deeplabcut/view.html.erb | 9 +++ 13 files changed, 402 insertions(+) create mode 100644 bc_vt_deeplabcut/CHANGELOG.md create mode 100644 bc_vt_deeplabcut/DevGuide.md create mode 100644 bc_vt_deeplabcut/LICENSE.txt create mode 100644 bc_vt_deeplabcut/README.md create mode 100644 bc_vt_deeplabcut/form.js create mode 100644 bc_vt_deeplabcut/form.yml.erb create mode 100644 bc_vt_deeplabcut/icon.png create mode 100644 bc_vt_deeplabcut/manifest.yml create mode 100644 bc_vt_deeplabcut/submit.yml.erb create mode 100644 bc_vt_deeplabcut/template/after.sh.erb create mode 100644 bc_vt_deeplabcut/template/before.sh.erb create mode 100644 bc_vt_deeplabcut/template/script.sh.erb create mode 100644 bc_vt_deeplabcut/view.html.erb diff --git a/bc_vt_deeplabcut/CHANGELOG.md b/bc_vt_deeplabcut/CHANGELOG.md new file mode 100644 index 0000000..6c2bac4 --- /dev/null +++ b/bc_vt_deeplabcut/CHANGELOG.md @@ -0,0 +1,10 @@ +# Changelog +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) +and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). + +## 1.0.0 - 2022-02-06 +### Added +- Initial release! + diff --git a/bc_vt_deeplabcut/DevGuide.md b/bc_vt_deeplabcut/DevGuide.md new file mode 100644 index 0000000..b2e94bc --- /dev/null +++ b/bc_vt_deeplabcut/DevGuide.md @@ -0,0 +1,45 @@ + +# Batch Connect - DeepLabCut App + +An example Batch Connect app that launches a DeepLabCut application within a +batch job. + +## Prerequisites + +This Batch Connect app requires the following software be installed on the +**compute nodes** that the batch job is intended to run on (**NOT** the +OnDemand node): + +- [OpenSSL](https://www.openssl.org/) 1.0.1+ (used to hash the Jupyter Notebook + server password) +- [Lmod](https://www.tacc.utexas.edu/research-development/tacc-projects/lmod) + 6.0.1+ or any other `module purge` and `module load ` based CLI + used to load appropriate environments within the batch job before launching + the Jupyter Notebook server. +- [Singularity](https://sylabs.io/guides/3.0/user-guide/installation.html) Singularity is a container platform. It allows you to create and run containers that package up pieces of software in a way that is portable and reproducible. ... Your container is a single file, and you don't have to worry about how to install all the software you need on each different operating system and system. + +### Development Installation + +```bash +cd /home//ondemand/dev +git clone git@github.com:AdvancedResearchComputing/OnDemandApps.git +``` + +### System Installation +```bash +cd /var/www/ood/apps/sys +git clone git@github.com:AdvancedResearchComputing/OnDemandApps.git +``` +> Make sure to give executable permissions for *image file* + + +- Make necessary description changes to **[manifest.yml](./manifest.yml)** +## Contributing + +1. Fork it +2. Create your feature branch (`git checkout -b my-new-feature`) +3. Commit your changes (`git commit -am 'Add some feature'`) +4. Push to the branch (`git push origin my-new-feature`) +5. Create a new Pull Request + +--- \ No newline at end of file diff --git a/bc_vt_deeplabcut/LICENSE.txt b/bc_vt_deeplabcut/LICENSE.txt new file mode 100644 index 0000000..3494185 --- /dev/null +++ b/bc_vt_deeplabcut/LICENSE.txt @@ -0,0 +1,24 @@ +Copyright (c) 2020 Virginia Tech + +Copyright (c) 2016-2018 Ohio Supercomputer Center + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/bc_vt_deeplabcut/README.md b/bc_vt_deeplabcut/README.md new file mode 100644 index 0000000..ab72fba --- /dev/null +++ b/bc_vt_deeplabcut/README.md @@ -0,0 +1,63 @@ +[![GitHub License](https://img.shields.io/badge/license-MIT-green.svg)](https://opensource.org/licenses/MIT) + +# Batch Connect - VT Deeplabcut + +A Batch Connect app designed for [Advanced Research Computing]'s VT OnDemand that launches +within a batch job. For other apps and assistance with Open OnDemand, see [Open OnDemand]. + +## Prerequisites + +This Batch Connect app requires the following software be installed on the +**compute nodes** that the batch job is intended to run on (**NOT** the +OnDemand node): + + +- [COMSOL Multiphysics] 5.1+ +- [Xfce Desktop] 4+ + +For VNC server support: + +- [TurboVNC] 2.1+ +- [websockify] 0.8.0+ + +For hardware rendering support (coming soon ...): + +- [X server] +- [VirtualGL] 2.3+ + +**Optional** software: + +- [Lmod] 6.0.1+ or any other `module purge` and `module load ` based + CLI used to load appropriate environments within the batch job + +[Open OnDemand] http://openondemand.org/ +[Advanced Research Computing] https://arc.vt.edu/ +[DeepLabCut]: https://github.com/DeepLabCut/DeepLabCut +[Xfce Desktop]: https://xfce.org/ +[TurboVNC]: http://www.turbovnc.org/ +[websockify]: https://github.com/novnc/websockify +[X server]: https://www.x.org/ +[VirtualGL]: http://www.virtualgl.org/ +[Lmod]: https://www.tacc.utexas.edu/research-development/tacc-projects/lmod + +## Install + +Use git to clone this app: + +```sh +git clone +cd +``` + +You will not need to do anything beyond this as all necessary assets are +installed. You will also not need to restart this app as it isn't a Passenger +app. + +Again, you do not need to restart the app as it isn't a Passenger app. + +## Contributing, see https://osc.github.io/ood-documentation/master/install-ihpc-apps.html for inspiration. +1. Fork it +2. Create your feature branch (`git checkout -b my-new-feature`) +3. Commit your changes (`git commit -am 'Add some feature'`) +4. Push to the branch (`git push origin my-new-feature`) +5. Create a new Pull Request diff --git a/bc_vt_deeplabcut/form.js b/bc_vt_deeplabcut/form.js new file mode 100644 index 0000000..1ccf300 --- /dev/null +++ b/bc_vt_deeplabcut/form.js @@ -0,0 +1,61 @@ +'use strict' + +/** + * Fix num cores, allowing blanks to remain + */ +function fix_num_cores() { + let node_type_input = $('#batch_connect_session_context_node_type'); + let node_type = node_type_input.val(); + let num_cores_input = $('#num_cores'); + + if(num_cores_input.val() === '') { + return; + } + + if(node_type === 'hugemem') { + set_ppn_owens_hugemem(num_cores_input); + } else { + set_ppn_owens_regular(num_cores_input); + } +} + +/** + * Sets the PPN limits available for Owens hugemem nodes. + * + * hugemem reservations are always assigned the full node + * + * @param {element} num_cores_input The input for num_cores + */ +function set_ppn_owens_hugemem(num_cores_input) { + const NUM_CORES = 48; + num_cores_input.attr('max', NUM_CORES); + num_cores_input.attr('min', NUM_CORES); + num_cores_input.val(NUM_CORES); +} + +/** + * Sets the PPN limits available for non hugemem Owens nodes. + * + * @param {element} num_cores_input The input for num_cores + */ +function set_ppn_owens_regular(num_cores_input) { + const NUM_CORES = 28; + num_cores_input.attr('max', NUM_CORES); + num_cores_input.attr('min', 0); + num_cores_input.val(Math.min(NUM_CORES, num_cores_input.val())); +} + + +/** + * Change the maximum number of cores selected. + */ +function set_node_type_change_handler() { + let node_type_input = $('#batch_connect_session_context_node_type'); + node_type_input.change(node_type_input, fix_num_cores); +} + +$(document).ready(function() { + // Set the max value to be what was set in the last session + fix_num_cores(); + set_node_type_change_handler(); +}); \ No newline at end of file diff --git a/bc_vt_deeplabcut/form.yml.erb b/bc_vt_deeplabcut/form.yml.erb new file mode 100644 index 0000000..8340b90 --- /dev/null +++ b/bc_vt_deeplabcut/form.yml.erb @@ -0,0 +1,86 @@ +# Batch Connect app configuration file +# +--- +cluster: + - 'tinkercliffs' + - 'infer' + +# Define attribute values that aren't meant to be modified by the user within +# the Dashboard form +attributes: + +# specify widgets for user modifiable job settings + bc_queue: + help: | + - To request a GPU enabled queue, preface it with v100_. Example: v100_normal_q, t4_normal_q + + bc_num_hours: + label: Number of hours (min-1, max-48) + required: true + value: 1 + min: 1 + max: 72 + step: 1 + + bc_num_slots: 1 +# label: Number of nodes (currently confined to 1) +# required: true +# value: 1 +# min: 1 +# max: 1 +# step: 1 + + bc_account: + widget: text_field + label: Account + value: "" + help: | + - The allocation you would like to use for SLURM. + + num_cores: + widget: number_field + label: Number of cores per node (min-1, max-128) + value: 1 + min: 1 + max: 128 + step: 1 + + gpu_per_node: + widget: number_field + label: Number of GPUs per node (min-0, max-2) + value: 0 + min: 0 + max: 2 + step: 1 + help: | + - If requesting GPU nodes, you must enter a GPU-enabled Partition above or the job will fail. + + Container: deeplabcut-24Sep2021-gui.sif +# widget: select +# label: "use container" +# help: "This defines the remote DeepLabCut version to run." +# options: +# <%- Dir.glob('/projects/arcsingularity/*deeplabcut*sif').each do |f| -%> +# <%- sif = f.sub('/projects/arcsingularity/','') -%> +# - [ "Container: <%= sif %>", "<%= sif %>" ] +# <%- end -%> + + bc_vnc_resolution: + required: true + +# All of the attributes that make up the Dashboard form (in respective order), +# and made available to the submit configuration file and the template ERB +# files +# +form: + - cluster + - Container + - bc_account + - reservation + - bc_queue + - bc_num_hours + - bc_num_slots + - num_cores + - gpu_per_node + - bc_vnc_resolution + - bc_email_on_started diff --git a/bc_vt_deeplabcut/icon.png b/bc_vt_deeplabcut/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..d08173ab9bae543183de754e22fb5478eb1892b8 GIT binary patch literal 44501 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 d|G!#8?|~fVg **NOTE** this app does not work without installing DeepLabCut in your profile first, so the first time you use this app it will take ~5min to start!! + + [TinkerCliffs]: https://www.arc.vt.edu/TinkerCliffs + [Infer]: https://www.arc.vt.edu/infer + [DragonsTooth]: https://www.arc.vt.edu/dragonstooth + [Cascades]: https://www.arc.vt.edu/cascades + [Huckleberry]: https://www.arc.vt.edu/huckleberry + [desktop OOD app]:https://github.com/AdvancedResearchComputing/ARC-ondemand-apps/tree/master/bc_vt_desktop + [DeepLabCut]: https://github.com/DeepLabCut/DeepLabCut diff --git a/bc_vt_deeplabcut/submit.yml.erb b/bc_vt_deeplabcut/submit.yml.erb new file mode 100644 index 0000000..00826f8 --- /dev/null +++ b/bc_vt_deeplabcut/submit.yml.erb @@ -0,0 +1,26 @@ +# Job submission configuration file +# +--- + +# +# Configure the content of the job script for the batch job here +# @see http://www.rubydoc.info/gems/ood_core/OodCore/BatchConnect/Template +# +batch_connect: + template: "basic" + set_host: "host=$(hostname -s)" + conn_params: + - ondemand_host +# +# Configure the job script submission parameters for the batch job here +# @see http://www.rubydoc.info/gems/ood_core/OodCore/Job/Script +# +script: + copy_environment: true + native: + - "--nodes=<%= bc_num_slots.blank? ? "1" : bc_num_slots.to_i %>" + - "--cpus-per-task=<%= num_cores.blank? ? "1" : num_cores %>" + - "--time=<%= bc_num_hours + ":0:0" %>" + - "--reservation=<%= reservation %>" + - "--account=<%= bc_account %>" + - "--gres=gpu:<%= gpu_per_node.blank? ? "0" : gpu_per_node.to_i %>" diff --git a/bc_vt_deeplabcut/template/after.sh.erb b/bc_vt_deeplabcut/template/after.sh.erb new file mode 100644 index 0000000..c719112 --- /dev/null +++ b/bc_vt_deeplabcut/template/after.sh.erb @@ -0,0 +1,13 @@ +# Wait for the X server to start + +while [ ! -f ./connection.rc ]; do sleep 1; done +source connection.rc + +echo "Waiting for VNC Server to open port ${host}:${port}..." +if wait_until_port_used "${host}:${port}" 2400; then + echo "Discovered VNC Server listening on port ${port}!" +else + echo "Timed out waiting for VNC Server to open port ${port}!" + clean_up 1 +fi +sleep 2 diff --git a/bc_vt_deeplabcut/template/before.sh.erb b/bc_vt_deeplabcut/template/before.sh.erb new file mode 100644 index 0000000..8464a3d --- /dev/null +++ b/bc_vt_deeplabcut/template/before.sh.erb @@ -0,0 +1,21 @@ +echo starting begin.sh +if [ -z ${HOME+x} ]; +then + export HOME=$(echo ~) + source /etc/profile + source /etc/bashrc + source $HOME/.bashrc +fi + +# Export the module function if it exists +[[ $(type -t module) == "function" ]] && export -f module +hostname +pwd + +module reset +module load containers/singularity + +singularity run --cleanenv --nv \ + --bind `pwd`:/cwd,$TMPDIR:/TMPDIR,/projects,/work/$USER,/cm \ + /projects/arcsingularity/ubuntu-xfce-v0.2.0.sif -d "Desktop-$(hostname)" & + diff --git a/bc_vt_deeplabcut/template/script.sh.erb b/bc_vt_deeplabcut/template/script.sh.erb new file mode 100644 index 0000000..54d2434 --- /dev/null +++ b/bc_vt_deeplabcut/template/script.sh.erb @@ -0,0 +1,30 @@ +#!/bin/bash -l + +while [ ! -f ./connection.rc ]; do sleep 1; done + +cat connection.rc +source connection.rc + +env > env.txt + +pwd +#unset XDG_RUNTIME_DIR + +module list + +echo running on `hostname` +echo starting singularity +echo running on ${host}:${port} + +module load cuDNN/8.0.4.30-CUDA-11.1.1 +## fix up singularity +unset SINGULARITY_TMPDIR +## this seems to be needed on a100s, not infer +export SINGULARITYENV_LD_LIBRARY_PATH=$LD_LIBRARY_PATH + +singularity run --nv --env DISPLAY=$DISPLAY --writable-tmpfs --bind=/apps,/cm,$TMPDIR:$TMPDIR,/projects:/projects,/work,`pwd`:/data \ + /projects/arcsingularity/<%= context.Container %> + +sleep 6000 +wait $! + diff --git a/bc_vt_deeplabcut/view.html.erb b/bc_vt_deeplabcut/view.html.erb new file mode 100644 index 0000000..214f774 --- /dev/null +++ b/bc_vt_deeplabcut/view.html.erb @@ -0,0 +1,9 @@ +
+ + + + + +