Package: gravityspawner
gravityspawner for JupyterhubThis package is forGravity of DOA, SJTUWe attend to select PBS/Slurm job queue first, then input arguments likehours, memory, CPU coresto spawn a Jupyter server.We need to combinetemplatesandwrapspawnerto achieve this goal:├──jupyterhub
│└──templates# jinja template│├──page.html# change the navigation bar, add some button│├──spawn.html# user can select and input arguments such as hour, cpu, memory. use JavaScript to hide the input form.│└──spawn_pending.html# waiting for spawning server, add some message└──src├──gravityspawner├──gravityspawner.py# get extra arguments from jinja template, then pass them to batchspawner [thanks wrapspawner.ProfilesSpawner]. set resource limits as well.InstallationInstall viapip:pipinstallgravityspawnerOr, another better way to usepip:python-mpipinstallgravityspawnerUsageAdd lines injupyterhub_config.py:c.JupyterHub.spawner_class='gravityspawner.GravitySpawner'If we usebatchspawner.TorqueSpawner, then add these lines injupyterhub_config.py:c.GravitySpawner.profiles=[('[ LOGIN 01 ] 8 cores 8 GB running forever (unless idle for more than 3 days)','local','jupyterhub.   spawner.LocalProcessSpawner',{'ip':'0.0.0.0'}),('[ SMALL ] Max: [ 72 cores + 400 GB ]','small','batchspawner.TorqueSpawner',dict(min_max_hour=(1,12),min_max_cpu=(8,72),min_max_memory=(10,360))),('[ GPU ] Max: [ 72 cores + 400 GB + NVIDIA Tesla V100 32GB ]','gpu','batchspawner.TorqueSpawner',dict(min_max_hour=(1,12),min_max_cpu=(8,72),min_max_memory=(10,360))),('[ FAT ] Max: [ 192 cores + 6000 GB ]','fat','batchspawner.TorqueSpawner',dict(min_max_hour=(1,12),min_max_cpu=(8,192),min_max_memory=(400,6000))),]profileshere representdisplay, key, Spawner, options. We can set limits of resource here, such ashour, memory, CPU cores. If you need more options or change options, you also need to edit thejupyterhub/templates/spawn.html(front-end)The finalpiece ofconfiguration ofjupyterhub_config.pylike this:importbatchspawnerimportgravityspawner# our jinja template, change front-end style and add extra optionsc.JupyterHub.template_paths=['/opt/jupyterhub/templates']# specify the spawner we usec.JupyterHub.spawner_class='gravityspawner.GravitySpawner'# PBS script to start Jupyter on computing nodes!c.TorqueSpawner.batch_script='''#!/bin/bash#PBS -N jupyterhub#PBS -q{queue}#PBS -l walltime={runtime}:00:00#PBS -l nodes=1:ppn={nprocs}#PBS -l mem={memory}gb####PBS -v{keepvars}#PBS -V#PBS -j oe#PBS -o /home/$USER/.jupyter/jupyterhub.logconda deactivate 1>/dev/null 2>&1conda deactivate 1>/dev/null 2>&1module load anaconda/conda-4.12.0 cuda/cuda-11.3source /opt/conda/conda-4.12.0/bin/activateconda activate /opt/jupyterhub/envs/hub02{cmd}'''# Defaul options of Spawner. local + small + gpu + fatc.GravitySpawner.profiles=[('[ LOGIN 02 ] 8 cores 8 GB running forever (unless idle for more than 3 days)','local','jupyterhub.spawner.LocalProcessSpawner',{'ip':'0.0.0.0'}),('[ SMALL ] Max: [ 72 cores + 400 GB ]','small','batchspawner.TorqueSpawner',dict(min_max_hour=(1,12),min_max_cpu=(8,72),min_max_memory=(10,360))),('[ GPU ] Max: [ 72 cores + 400 GB + NVIDIA Tesla V100 32GB ]','gpu','batchspawner.TorqueSpawner',dict(min_max_hour=(1,12),min_max_cpu=(8,72),min_max_memory=(10,360))),('[ FAT ] Max: [ 192 cores + 6000 GB ]','fat','batchspawner.TorqueSpawner',dict(min_max_hour=(1,12),min_max_cpu=(8,192),min_max_memory=(400,6000))),]ExampleThis is a typical dropdown menu letting the user choose between localLogin nodeandTorque/PBS queuesAfter usingjupyterhub/templates, we can input args according to our selection, e.g.🌰selectlogin node, which is'local'in code:selectTorque/PBS gpu queue, which is'gpu'in code: