From 991f306e308048188cf8890b95558e63a4bb50b4 Mon Sep 17 00:00:00 2001 From: Guangzhen Jin Date: Thu, 25 Jun 2026 14:52:40 -0400 Subject: [PATCH 1/8] Add Hammer user guide (initial migration) 85 pages covering: Overview (hardware specs), Accounts, Software, File Storage & Transfer (with hsi/htar/recover), Compile (serial/mpi/ openmp/intel_mkl), Running Jobs (queues/submit/examples), JupyterHub, and FAQs. Replaces the external knowledge.rcac link in mkdocs.yml nav. --- docs/userguides/hammer/accounts.md | 26 + docs/userguides/hammer/compile.md | 22 + docs/userguides/hammer/compile/intel_mkl.md | 13 + docs/userguides/hammer/compile/mpi.md | 13 + docs/userguides/hammer/compile/openmp.md | 13 + docs/userguides/hammer/compile/serial.md | 13 + docs/userguides/hammer/faqs.md | 453 ++++++++++++++++++ docs/userguides/hammer/index.md | 33 ++ docs/userguides/hammer/jupyter.md | 78 +++ docs/userguides/hammer/overview.md | 40 ++ .../hammer/run_jobs/examples/apps.md | 27 ++ .../hammer/run_jobs/examples/apps/gaussian.md | 13 + .../hammer/run_jobs/examples/apps/learning.md | 13 + .../examples/apps/learning/customml.md | 13 + .../examples/apps/learning/ml_batch.md | 13 + .../examples/apps/learning/mltoolkit.md | 13 + .../run_jobs/examples/apps/mathematica.md | 13 + .../hammer/run_jobs/examples/apps/matlab.md | 13 + .../apps/matlab/implicit_parallelism.md | 13 + .../examples/apps/matlab/interpreter.md | 13 + .../examples/apps/matlab/mdcs_parallel.md | 13 + .../run_jobs/examples/apps/matlab/parfor.md | 13 + .../examples/apps/matlab/profile_manager.md | 13 + .../run_jobs/examples/apps/matlab/spmd.md | 13 + .../hammer/run_jobs/examples/apps/octave.md | 13 + .../hammer/run_jobs/examples/apps/python.md | 13 + .../run_jobs/examples/apps/python/conda.md | 13 + .../apps/python/environment_example.md | 13 + .../run_jobs/examples/apps/python/examples.md | 13 + .../run_jobs/examples/apps/python/numpy.md | 13 + .../run_jobs/examples/apps/python/packages.md | 13 + .../run_jobs/examples/apps/python/pip.md | 13 + .../run_jobs/examples/apps/python/source.md | 13 + .../hammer/run_jobs/examples/apps/r.md | 13 + .../hammer/run_jobs/examples/apps/r/data.md | 13 + .../hammer/run_jobs/examples/apps/r/job.md | 13 + .../run_jobs/examples/apps/r/package.md | 13 + .../run_jobs/examples/apps/r/rprofile.md | 13 + .../run_jobs/examples/apps/r/rstudio.md | 13 + .../hammer/run_jobs/examples/apps/r/server.md | 13 + .../hammer/run_jobs/examples/apps/spark.md | 13 + .../hammer/run_jobs/examples/apps/windows.md | 13 + .../run_jobs/examples/apps/windows/cmd.md | 13 + .../examples/apps/windows/launcher.md | 13 + .../hammer/run_jobs/examples/hadoop.md | 149 ++++++ .../hammer/run_jobs/examples/slurm.md | 27 ++ .../hammer/run_jobs/examples/slurm/batch.md | 13 + .../run_jobs/examples/slurm/directives.md | 13 + .../run_jobs/examples/slurm/interactive.md | 13 + .../hammer/run_jobs/examples/slurm/monitor.md | 13 + .../hammer/run_jobs/examples/slurm/mpi.md | 13 + .../run_jobs/examples/slurm/multiple.md | 13 + .../hammer/run_jobs/examples/slurm/openmp.md | 13 + .../hammer/run_jobs/examples/slurm/serial.md | 13 + .../run_jobs/examples/slurm/specific.md | 13 + docs/userguides/hammer/run_jobs/index.md | 44 ++ .../hammer/run_jobs/slurm/cancelling_job.md | 13 + .../hammer/run_jobs/slurm/checking_output.md | 13 + .../slurm/creating_the_submission_script.md | 45 ++ .../hammer/run_jobs/slurm/holding_job.md | 13 + .../hammer/run_jobs/slurm/job_dependencies.md | 13 + .../hammer/run_jobs/slurm/monitoring_job.md | 13 + .../hammer/run_jobs/slurm/queues.md | 68 +++ .../hammer/run_jobs/slurm/submit_script.md | 81 ++++ docs/userguides/hammer/software.md | 50 ++ docs/userguides/hammer/storage.md | 46 ++ .../hammer/storage/archive_and_compression.md | 13 + .../hammer/storage/environment_variables.md | 13 + docs/userguides/hammer/storage/ftp_sftp.md | 13 + docs/userguides/hammer/storage/globus.md | 13 + .../hammer/storage/home_directory.md | 13 + docs/userguides/hammer/storage/hsi.md | 13 + docs/userguides/hammer/storage/htar.md | 13 + .../hammer/storage/long_term_storage.md | 13 + docs/userguides/hammer/storage/recover.md | 31 ++ .../hammer/storage/recover/flost.md | 13 + docs/userguides/hammer/storage/recover/mac.md | 13 + .../hammer/storage/recover/manual.md | 13 + .../hammer/storage/recover/windows.md | 13 + docs/userguides/hammer/storage/scp.md | 13 + .../hammer/storage/scratch_space.md | 14 + docs/userguides/hammer/storage/sharing.md | 13 + .../hammer/storage/storage_quota.md | 13 + .../hammer/storage/tmp_directory.md | 13 + .../hammer/storage/windows_network_drive.md | 13 + mkdocs.yml | 11 +- 86 files changed, 2128 insertions(+), 1 deletion(-) create mode 100644 docs/userguides/hammer/accounts.md create mode 100644 docs/userguides/hammer/compile.md create mode 100644 docs/userguides/hammer/compile/intel_mkl.md create mode 100644 docs/userguides/hammer/compile/mpi.md create mode 100644 docs/userguides/hammer/compile/openmp.md create mode 100644 docs/userguides/hammer/compile/serial.md create mode 100644 docs/userguides/hammer/faqs.md create mode 100644 docs/userguides/hammer/index.md create mode 100644 docs/userguides/hammer/jupyter.md create mode 100644 docs/userguides/hammer/overview.md create mode 100644 docs/userguides/hammer/run_jobs/examples/apps.md create mode 100644 docs/userguides/hammer/run_jobs/examples/apps/gaussian.md create mode 100644 docs/userguides/hammer/run_jobs/examples/apps/learning.md create mode 100644 docs/userguides/hammer/run_jobs/examples/apps/learning/customml.md create mode 100644 docs/userguides/hammer/run_jobs/examples/apps/learning/ml_batch.md create mode 100644 docs/userguides/hammer/run_jobs/examples/apps/learning/mltoolkit.md create mode 100644 docs/userguides/hammer/run_jobs/examples/apps/mathematica.md create mode 100644 docs/userguides/hammer/run_jobs/examples/apps/matlab.md create mode 100644 docs/userguides/hammer/run_jobs/examples/apps/matlab/implicit_parallelism.md create mode 100644 docs/userguides/hammer/run_jobs/examples/apps/matlab/interpreter.md create mode 100644 docs/userguides/hammer/run_jobs/examples/apps/matlab/mdcs_parallel.md create mode 100644 docs/userguides/hammer/run_jobs/examples/apps/matlab/parfor.md create mode 100644 docs/userguides/hammer/run_jobs/examples/apps/matlab/profile_manager.md create mode 100644 docs/userguides/hammer/run_jobs/examples/apps/matlab/spmd.md create mode 100644 docs/userguides/hammer/run_jobs/examples/apps/octave.md create mode 100644 docs/userguides/hammer/run_jobs/examples/apps/python.md create mode 100644 docs/userguides/hammer/run_jobs/examples/apps/python/conda.md create mode 100644 docs/userguides/hammer/run_jobs/examples/apps/python/environment_example.md create mode 100644 docs/userguides/hammer/run_jobs/examples/apps/python/examples.md create mode 100644 docs/userguides/hammer/run_jobs/examples/apps/python/numpy.md create mode 100644 docs/userguides/hammer/run_jobs/examples/apps/python/packages.md create mode 100644 docs/userguides/hammer/run_jobs/examples/apps/python/pip.md create mode 100644 docs/userguides/hammer/run_jobs/examples/apps/python/source.md create mode 100644 docs/userguides/hammer/run_jobs/examples/apps/r.md create mode 100644 docs/userguides/hammer/run_jobs/examples/apps/r/data.md create mode 100644 docs/userguides/hammer/run_jobs/examples/apps/r/job.md create mode 100644 docs/userguides/hammer/run_jobs/examples/apps/r/package.md create mode 100644 docs/userguides/hammer/run_jobs/examples/apps/r/rprofile.md create mode 100644 docs/userguides/hammer/run_jobs/examples/apps/r/rstudio.md create mode 100644 docs/userguides/hammer/run_jobs/examples/apps/r/server.md create mode 100644 docs/userguides/hammer/run_jobs/examples/apps/spark.md create mode 100644 docs/userguides/hammer/run_jobs/examples/apps/windows.md create mode 100644 docs/userguides/hammer/run_jobs/examples/apps/windows/cmd.md create mode 100644 docs/userguides/hammer/run_jobs/examples/apps/windows/launcher.md create mode 100644 docs/userguides/hammer/run_jobs/examples/hadoop.md create mode 100644 docs/userguides/hammer/run_jobs/examples/slurm.md create mode 100644 docs/userguides/hammer/run_jobs/examples/slurm/batch.md create mode 100644 docs/userguides/hammer/run_jobs/examples/slurm/directives.md create mode 100644 docs/userguides/hammer/run_jobs/examples/slurm/interactive.md create mode 100644 docs/userguides/hammer/run_jobs/examples/slurm/monitor.md create mode 100644 docs/userguides/hammer/run_jobs/examples/slurm/mpi.md create mode 100644 docs/userguides/hammer/run_jobs/examples/slurm/multiple.md create mode 100644 docs/userguides/hammer/run_jobs/examples/slurm/openmp.md create mode 100644 docs/userguides/hammer/run_jobs/examples/slurm/serial.md create mode 100644 docs/userguides/hammer/run_jobs/examples/slurm/specific.md create mode 100644 docs/userguides/hammer/run_jobs/index.md create mode 100644 docs/userguides/hammer/run_jobs/slurm/cancelling_job.md create mode 100644 docs/userguides/hammer/run_jobs/slurm/checking_output.md create mode 100644 docs/userguides/hammer/run_jobs/slurm/creating_the_submission_script.md create mode 100644 docs/userguides/hammer/run_jobs/slurm/holding_job.md create mode 100644 docs/userguides/hammer/run_jobs/slurm/job_dependencies.md create mode 100644 docs/userguides/hammer/run_jobs/slurm/monitoring_job.md create mode 100644 docs/userguides/hammer/run_jobs/slurm/queues.md create mode 100644 docs/userguides/hammer/run_jobs/slurm/submit_script.md create mode 100644 docs/userguides/hammer/software.md create mode 100644 docs/userguides/hammer/storage.md create mode 100644 docs/userguides/hammer/storage/archive_and_compression.md create mode 100644 docs/userguides/hammer/storage/environment_variables.md create mode 100644 docs/userguides/hammer/storage/ftp_sftp.md create mode 100644 docs/userguides/hammer/storage/globus.md create mode 100644 docs/userguides/hammer/storage/home_directory.md create mode 100644 docs/userguides/hammer/storage/hsi.md create mode 100644 docs/userguides/hammer/storage/htar.md create mode 100644 docs/userguides/hammer/storage/long_term_storage.md create mode 100644 docs/userguides/hammer/storage/recover.md create mode 100644 docs/userguides/hammer/storage/recover/flost.md create mode 100644 docs/userguides/hammer/storage/recover/mac.md create mode 100644 docs/userguides/hammer/storage/recover/manual.md create mode 100644 docs/userguides/hammer/storage/recover/windows.md create mode 100644 docs/userguides/hammer/storage/scp.md create mode 100644 docs/userguides/hammer/storage/scratch_space.md create mode 100644 docs/userguides/hammer/storage/sharing.md create mode 100644 docs/userguides/hammer/storage/storage_quota.md create mode 100644 docs/userguides/hammer/storage/tmp_directory.md create mode 100644 docs/userguides/hammer/storage/windows_network_drive.md diff --git a/docs/userguides/hammer/accounts.md b/docs/userguides/hammer/accounts.md new file mode 100644 index 00000000..192d2035 --- /dev/null +++ b/docs/userguides/hammer/accounts.md @@ -0,0 +1,26 @@ +--- +tags: + - Hammer +authors: + - jin456 +resource: Hammer +search: + boost: 2 +--- +{% set resource = "hammer" %} +{{ accounts_md_snippet(resource) }} + +## SSH Keys +{{ ssh_keys_snippet(resource) }} + +## SSH X11 Forwarding +{{ ssh_x11_snippet(resource) }} + +## Thinlinc +{{ thinlinc_snippet(resource) }} + +## Purchasing Nodes + +--8<-- "docs/snippets/purchase_nodes.md" + +[**Back to Hammer User Guide**](index.md) diff --git a/docs/userguides/hammer/compile.md b/docs/userguides/hammer/compile.md new file mode 100644 index 00000000..0548a730 --- /dev/null +++ b/docs/userguides/hammer/compile.md @@ -0,0 +1,22 @@ +--- +tags: + - Hammer +authors: + - jin456 +resource: Hammer +search: + boost: 2 +--- + +# Compiling Source Code + +Documentation on compiling source code on Hammer. + +## In This Section + +- [Compiling Serial Programs](compile/serial.md) +- [Compiling MPI Programs](compile/mpi.md) +- [Compiling OpenMP Programs](compile/openmp.md) +- [Intel MKL Library](compile/intel_mkl.md) + +[**Back to Hammer User Guide**](index.md) diff --git a/docs/userguides/hammer/compile/intel_mkl.md b/docs/userguides/hammer/compile/intel_mkl.md new file mode 100644 index 00000000..8d71ac33 --- /dev/null +++ b/docs/userguides/hammer/compile/intel_mkl.md @@ -0,0 +1,13 @@ +--- +tags: + - Hammer +authors: + - jin456 +resource: Hammer +search: + boost: 2 +--- + +--8<-- "docs/snippets/compile_intel_mkl.md" + +[**Back to the Compiling Source Code section**](../compile.md) diff --git a/docs/userguides/hammer/compile/mpi.md b/docs/userguides/hammer/compile/mpi.md new file mode 100644 index 00000000..f3f4b78d --- /dev/null +++ b/docs/userguides/hammer/compile/mpi.md @@ -0,0 +1,13 @@ +--- +tags: + - Hammer +authors: + - jin456 +resource: Hammer +search: + boost: 2 +--- + +--8<-- "docs/snippets/compile_mpi.md" + +[**Back to the Compiling Source Code section**](../compile.md) diff --git a/docs/userguides/hammer/compile/openmp.md b/docs/userguides/hammer/compile/openmp.md new file mode 100644 index 00000000..1f890950 --- /dev/null +++ b/docs/userguides/hammer/compile/openmp.md @@ -0,0 +1,13 @@ +--- +tags: + - Hammer +authors: + - jin456 +resource: Hammer +search: + boost: 2 +--- + +--8<-- "docs/snippets/compile_openmp.md" + +[**Back to the Compiling Source Code section**](../compile.md) diff --git a/docs/userguides/hammer/compile/serial.md b/docs/userguides/hammer/compile/serial.md new file mode 100644 index 00000000..ed2d7ed5 --- /dev/null +++ b/docs/userguides/hammer/compile/serial.md @@ -0,0 +1,13 @@ +--- +tags: + - Hammer +authors: + - jin456 +resource: Hammer +search: + boost: 2 +--- + +--8<-- "docs/snippets/compile_serial.md" + +[**Back to the Compiling Source Code section**](../compile.md) diff --git a/docs/userguides/hammer/faqs.md b/docs/userguides/hammer/faqs.md new file mode 100644 index 00000000..728b880d --- /dev/null +++ b/docs/userguides/hammer/faqs.md @@ -0,0 +1,453 @@ +--- +tags: + - Hammer +authors: + - jin456 +resource: Hammer +search: + boost: 2 +--- + +# Frequently Asked Questions + +Some common questions, errors, and problems are categorized below. You can also use the search box above to search the user guide for any issues you are seeing. + +## About Hammer + +### Can you remove me from the Hammer mailing list? + +Your subscription in the Hammer mailing list is tied to your account on Hammer. If you are no longer using your account on Hammer, your account can be deleted from the [My Accounts](https://www.rcac.purdue.edu/account/myinfo) page. Hover over the resource you wish to remove yourself from and click the red 'X' button. Your account and mailing list subscription will be removed overnight. Be sure to make a copy of any data you wish to keep first. + +### How is Hammer different than other Community Clusters? + +Hammer differs from the other Community Clusters in several significant aspects: + +* Hammer is optimized for loosely-coupled, high-throughput computing (HTC), rather than tightly-coupled parallel applications. This makes it ideal for workloads consisting of many independent, single-node jobs. +* Hammer home directories are entirely separate from other Community Clusters home directories. There is no automatic copying or synchronization between the two. At their discretion, users can copy parts or all of another Community Cluster home directory into Hammer. [Instructions are provided](storage.md#file-transfer). +* Hammer uses a named queue (mylab) system where each research partner gets a dedicated queue. All users also have access to the `standby` queue for lower-priority work and the `debug` queue for short interactive debugging sessions. +* Users of `hsi` and `htar` commands may encounter Fortress keytab- and authentication-related error messages due to the dedicated nature of Hammer home directories. A [temporary workaround is provided](#hsihtar-unable-to-authenticate-user-with-remote-gateway-error-2-or-9) while a permanent solution is being developed. + +### Do I need to do anything to my firewall to access Hammer? + +No firewall changes are needed to access Hammer. However, to access data through Network Drives (i.e., CIFS, "Z: Drive"), you must be on a Purdue campus network or connected through [VPN](http://www.itap.purdue.edu/connections/vpn/). + +### Does Hammer have the same home directory as other clusters? + +The Hammer home directory and its contents are exclusive to Hammer cluster front-end hosts and compute nodes. This home directory is not available on other RCAC machines but Hammer. There is no automatic copying or synchronization between home directories. + +At your discretion you can manually copy all or parts of your main research computing home to Hammer using one of the [suggested methods](storage.md#file-transfer). + +If you plan to use `hsi` or `htar` commands to access Fortress tape archive from Hammer, please see also the [keytab generation question](#hsihtar-unable-to-authenticate-user-with-remote-gateway-error-2-or-9) for a temporary workaround to a potential caveat, while a permanent mitigation is being developed. + +## Logging In & Accounts + +### /usr/bin/xauth: error in locking authority file + +#### Problem + +I receive this message when logging in: + +`/usr/bin/xauth: error in locking authority file` + +#### Solution + +Your home directory disk quota is full. You may check your quota with `myquota`. + +You will need to free up space in your home directory. + +`ncdu` command is a convenient interactive tool to examine disk usage. Consider running `ncdu $HOME` to analyze where the bulk of the usage is. With this knowledge, you could then archive your data elsewhere (e.g. your research group's Data Depot space, or Fortress tape archive), or delete files you no longer need. + +There are several common locations that tend to grow large over time and are merely cached downloads. The following are safe to delete if you see them in the output of `ncdu $HOME`: + +``` +/home/myusername/.local/share/Trash +/home/myusername/.cache/pip +/home/myusername/.conda/pkgs +/home/myusername/.apptainer/cache +``` + +### My SSH connection hangs + +#### Problem + +Your console hangs while trying to connect to a RCAC Server. + +#### Solution + +This can happen due to various reasons. Most common reasons for hanging SSH terminals are: + +* **Network:** If you are connected over wifi, make sure that your Internet connection is fine. +* **Busy front-end server:** When you connect to a cluster, you SSH to one of the front-end login nodes. Due to transient user loads, one or more of the front-ends may become unresponsive for a short while. To avoid this, try reconnecting to the cluster or wait until the login node you have connected to has reduced load. +* **File system issue:** If a server has issues with one or more of the file systems (`home`, `scratch`, or `depot`) it may freeze your terminal. To avoid this you can connect to another front-end. + +If neither of the suggestions above work, please [contact support](https://www.rcac.purdue.edu/help) specifying the name of the server where your console is hung. + +### ThinLinc session frozen + +#### Problem + +Your ThinLinc session is frozen and you can not launch any commands or close the session. + +#### Solution + +This can happen due to various reasons. The most common reason is that you ran something memory-intensive inside that ThinLinc session on a front-end, so parts of the ThinLinc session got killed by Cgroups, and the entire session got stuck. + +* **If you are using a web-version ThinLinc remote desktop (inside the browser):** + + The web version does not have the capability to kill the existing session, only the standalone client does. Please install the standalone client and follow the steps below: + + [ThinLinc](accounts.md#thinlinc) + +* **If you are using a ThinLinc client:** + + Close the ThinLinc client, reopen the client login popup, and select `End existing session`. + +

+ ThinLinc Login Popup +

+ + Select "End existing session" and try "Connect" again. + +### ThinLinc session unreachable + +#### Problem + +When trying to login to ThinLinc and re-connect to your existing session, you receive an error *"Your ThinLinc session is currently unreachable"*. + +#### Solution + +This can happen if the specific login node your existing remote desktop session was residing on is currently offline or down, so ThinLinc can not reconnect to your existing session. Most often the session is non-recoverable at this point, so the solution is to terminate your existing ThinLinc desktop session and start a new one. + +* **If you are using a web-version ThinLinc remote desktop (inside the browser):** + + The web version does not have the capability to kill the existing session, only the standalone client does. Please install the standalone client and follow the steps below: + + [ThinLinc](accounts.md#thinlinc) + +* **If you are using a ThinLinc client:** + + Close the ThinLinc client, reopen the client login popup, and select `End existing session`. + +

+ ThinLinc Login Popup +

+ + Select "End existing session" and try "Connect" again. + +### How to disable ThinLinc screensaver + +#### Problem + +Your ThinLinc desktop is locked after being idle for a while, and it asks for a password to refresh it. It means the "screensaver" and "lock screen" functions are turned on, but you want to disable these functions. + +#### Solution + +If your screen is locked, close the ThinLinc client, reopen the client login popup, and select `End existing session`. + +

+ ThinLinc Login Popup +

+ +Select "End existing session" and try "Connect" again. + +To permanently avoid screen lock issue, right click desktop and select `Applications`, then `settings`, and select `Screensaver`. + +

+ ThinLinc Screensaver +

+ +Select "Applications", then "settings", and select "Screensaver". + +Under **Screensaver**, turn off the `Enable Screensaver`, then under **Lock Screen**, turn off the `Enable Lock Screen`, and close the window. + +

+ ThinLinc Disable Screensaver +

+ +Under "Screensaver" tab, turn off the "Enable Screensaver" option. + +

+ ThinLinc Disable Lock Screen +

+ +Under "Lock Screen" tab, turn off the "Enable Lock Screen" option. + +### I worked on Hammer after I graduated/left Purdue, but can not access it anymore + +#### Problem + +You have graduated or left Purdue but continue collaboration with your Purdue colleagues. You find that your access to Purdue resources has suddenly stopped and your password is no longer accepted. + +#### Solution + +Access to all resources depends on having a valid Purdue Career Account. Expired Career Accounts are removed twice a year, during Spring and October breaks (more details at the [official page](https://www.purdue.edu/apps/account/IAMO/Purdue_CareerAccount_Expiration.jsp)). If your Career Account was purged due to expiration, you will not be be able to access the resources. + +To provide remote collaborators with valid Purdue credentials, the University provides a special procedure called [Request for Privileges (R4P)](https://www.purdue.edu/apps/account/r4p). If you need to continue your collaboration with your Purdue PI, the PI will have to submit or renew an R4P request on your behalf. + +After your R4P is completed and Career Account is restored, please note two additional necessary steps: + +* **Access:** Restored Career Accounts by default do **not** have any RCAC resources enabled for them. **Your PI will have to login to the [Manage Users](https://www.rcac.purdue.edu/account/groups) tool and explicitly re-enable your access by un-checking and then ticking back checkboxes for desired queues/Unix groups resources.** +* **Email:** Restored Career Accounts by default do **not** have their *@purdue.edu* email service enabled. While this does not preclude you from using RCAC resources, any email messages (be that generated on the clusters, or any service announcements) would not be delivered - which may cause inconvenience or loss of compute jobs. To avoid this, we recommend setting your restored *@purdue.edu* email service to "Forward" (to an actual address you read). The easiest way to ensure it is to go through the [Account Setup process](https://www.purdue.edu/apps/account/AccountSetup). + +## Jobs + +### cannot connect to X server / cannot open display + +#### Problem + +You receive the following message after entering a command to bring up a graphical window + +`cannot connect to X server` `cannot open display` + +#### Solution + +This can happen due to multiple reasons: + +1. Reason: Your SSH client software does not support graphical display by itself (e.g. SecureCRT or PuTTY). + * Solution: Try using a client software like ThinLinc or MobaXterm as described in the [SSH X11 Forwarding guide](accounts.md#ssh-x11-forwarding). +2. Reason: You did not enable X11 forwarding in your SSH connection. + + * Solution: If you are in a Windows environment, make sure that X11 forwarding is enabled in your connection settings (e.g. in MobaXterm or PuTTY). If you are in a Linux environment, try + + `ssh -Y -l username hostname` + +3. Reason: If you are trying to open a graphical window within an interactive PBS job, make sure you are using the `-X` option with `qsub` after following the previous step(s) for connecting to the front-end. Please see the example in the [Interactive Jobs guide](run_jobs/examples/slurm/interactive.md). +4. Reason: If none of the above apply, make sure that you are [within quota of your home directory](#usrbinxauth-error-in-locking-authority-file). + +### bash: command not found + +#### Problem + +You receive the following message after typing a command + +`bash: command not found` + +#### Solution + +This means the system doesn't know how to find your command. Typically, you need to load a module to do it. + +### bash: module command not found + +#### Problem + +You receive the following message after typing a command, e.g. module load intel + +`bash: module command not found` + +#### Solution + +The system cannot find the module command. You need to source the modules.sh file as below + +`source /etc/profile.d/modules.sh` + +or + +`#!/bin/bash -i` + +### Close Firefox / Firefox is already running but not responding + +--8<-- "docs/snippets/firefox_lock.md" + +### Jupyter: database is locked / can not load notebook format + +--8<-- "docs/snippets/jupyter_lock.md" + +### How do I know Non-uniform Memory Access (NUMA) layout on Hammer? + +* You can learn about processor layout on Hammer nodes using the following command: + + ``` + hammer-a001:~$ lstopo-no-graphics + ``` + +* For detailed IO connectivity: + + ``` + hammer-a001:~$ lstopo-no-graphics --physical --whole-io + ``` + +* Please note that NUMA information is useful for advanced MPI/OpenMP optimizations. For most users, using default NUMA settings in MPI or OpenMP would give you the best performance. + +### Why cannot I use --mem=0 when submitting jobs? + +#### Question + +Why can't I specify `--mem=0` for my job? + +#### Answer + +We no longer support requesting unlimited memory (`--mem=0`) as it has an adverse effect on the way scheduler allocates job, and could lead to large amount of nodes being blocked from usage. + +!!! note + Most often we suggest relying on default memory allocation (cluster-specific). But if you have to request custom amounts of memory, you can do it explicitly. For example `--mem=20G`. + +If you want to use the entire node's memory, you can submit the job with the `--exclusive` option. + +### Can I extend the walltime on a job? + +In some circumstances, yes. Walltime extensions must be requested of and completed by staff. Walltime extension requests will be considered on named (your advisor or research lab) queues. **Standby or debug queue jobs cannot be extended**. + +Extension requests are at the discretion of staff based on factors such as any upcoming maintenance or resource availability. Extensions can be made past the normal maximum walltime on named queues but these jobs are subject to early termination should a conflicting maintenance downtime be scheduled. + +Please be mindful of time remaining on your job when making requests and make requests at least 24 hours before the end of your job AND during business hours. We cannot guarantee jobs will be extended in time with less than 24 hours notice, after-hours, during weekends, or on a holiday. + +We ask that you make accurate walltime requests during job submissions. Accurate walltimes will allow the job scheduler to efficiently and quickly schedule jobs on the cluster. Please consider that extensions can impact scheduling efficiency for all users of the cluster. + +Requests can be made by [contacting support](https://www.rcac.purdue.edu/help). We ask that you: + +* Provide numerical job IDs, cluster name, and your desired extension amount. +* Provide at least 24 hours notice before job will end (more if request is made on a weekend or holiday). +* Consider making requests during business hours. We may not be able to respond in time to requests made after-hours, on a weekend, or on a holiday. + +### What is the debug queue? + +The debug queue is intended for short interactive debugging sessions. It allows up to 2 compute nodes per job, has a maximum walltime of 30 minutes, and limits each user to 1 running job at a time. Jobs submitted to the debug queue are expected to start within minutes. To submit to the debug queue: + +``` +$ sbatch --account=debug --nodes=1 myjobsubmissionfile +``` + +## Data + +### My scratch files were purged — are they recoverable? + +No. Files in scratch directories are not backed up and are not recoverable once purged. Scratch files on Hammer are automatically purged after 60 days of inactivity. Please ensure that any important data is moved to your home directory, Data Depot, or Fortress archive before the purge deadline. + +### How is my Data Secured on Hammer? + +Hammer is operated in line with policies, standards, and best practices as described within [Secure Purdue](https://www.purdue.edu/securepurdue), and specific to [RCAC Resources](https://www.rcac.purdue.edu/policies). + +Security controls for Hammer are based on ones defined in NIST cybersecurity standards. + +Hammer supports research at the L1 fundamental and L2 sensitive levels. +Hammer is not approved for storing data at the L3 restricted (covered by HIPAA) or L4 Export Controlled (ITAR), or any Controlled Unclassified Information (CUI). + +For resources designed to support research with heightened security requirements, please look for resources within the [REED+ Ecosystem](https://www.rcac.purdue.edu/services/reedplus). + +### Can I share data with outside collaborators? + +Yes! Globus allows convenient sharing of data with outside collaborators. Data can be shared with collaborators' personal computers or directly with many other computing resources at other institutions. See the Globus documentation on how to share data: + +* + +### HSI/HTAR: Unable to authenticate user with remote gateway (error 2 or 9) + +There could be a variety of such errors, with wordings along the lines of + +``` +Could not initialize keytab on remote server. +result = -2, errno = 2rver connection +*** hpssex_OpenConnection: Unable to authenticate user with remote gateway at 128.211.138.40.1217result = -2, errno = 9 +Unable to setup communication to HPSS... +ERROR (main) unable to open remote gateway server connection +HTAR: HTAR FAILED +``` + +and + +``` +*** hpssex_OpenConnection: Unable to authenticate user with remote gateway at 128.211.138.40.1217result = -11000, errno = 9 +Unable to setup communication to HPSS... +*** HSI: error opening logging +Error - authentication/initialization failed +``` + +The root cause for these errors is an expired or non-existent keytab file (a special authentication token stored in your home directory). These keytabs are valid for 90 days and on most RCAC resources they are usually automatically checked and regenerated when you execute `hsi` or `htar` commands. However, if the keytab is invalid, or fails to generate, Fortress may be unable to authenticate you and you would see the above errors. This is especially common on those RCAC clusters that have their own dedicated home directories (such as Hammer), or on standalone installations (such as if you downloaded and installed HSI and HTAR on your non-RCAC computer). + +*This is a temporary problem and a permanent system-wide solution is being developed.* In the interim, the recommended workaround is to generate a new valid keytab file in your main research computing home directory, and then copy it to your home directory on Hammer. The `fortresskey` command is used to generate the keytab and can be executed on another cluster or a dedicated data management host `data.rcac.purdue.edu`: + +``` +$ ssh myusername@data.rcac.purdue.edu fortresskey +$ scp -pr myusername@data.rcac.purdue.edu:~/.private $HOME +``` + +With a valid keytab in place, you should then be able to use `hsi` and `htar` commands to access Fortress from Hammer. Note that only one keytab can be valid at any given time (i.e. if you regenerated it, you may have to copy the new keytab to all systems that you intend to use `hsi` or `htar` from if they do not share the main research computing home directory). + +### HSI/HTAR: put: Error -5 on transfer + +First, check your firewall settings, and ensure that there are no firewall rules interfering with connecting to Fortress. For firewall configuration, please see "[Do I need to do anything to my firewall to access Hammer?](#do-i-need-to-do-anything-to-my-firewall-to-access-hammer)" **If firewalls are not responsible:** + +Open the file named `/etc/hosts` on your workstation, especially if you run a Debian or Ubuntu Linux distribution. Look for a line like: + +``` +127.0.1.1 hostname.dept.purdue.edu hostname +``` + +Replace the IP address 127.0.1.1 with the real IP address for your system. If you don't know your IP address, you can find it with the command: + +``` +host `hostname --fqdn` +``` + +### Can I access Fortress from Hammer? + +Yes. While Fortress directories are not directly mounted on Hammer for performance and archival protection reasons, they can be accessed from Hammer front-ends and nodes using any of the recommended methods of [HSI, HTAR or Globus](https://www.rcac.purdue.edu/knowledge/fortress/storage/transfer). + +## Software + +### Cannot use pip after loading ml-toolkit modules + +#### Question + +Pip throws an error after loading the machine learning modules. How can I fix it? + +#### Answer + +Machine learning modules (tensorflow, pytorch, opencv etc.) include a version of `pip` that is newer than the one installed with Anaconda. As a result it will throw an error when you try to use it. + +``` +$ pip --version +Traceback (most recent call last): + File "/apps/cent7/anaconda/5.1.0-py36/bin/pip", line 7, in + from pip import main +ImportError: cannot import name 'main' +``` + +The preferred way to use `pip` with the machine learning modules is to invoke it via Python as shown below. + +``` +$ python -m pip --version +``` + +### How can I get access to Sentaurus software? + +#### Question + +How can I get access to Sentaurus tools for micro- and nano-electronics design? + +#### Answer + +Sentaurus software license requires a signed NDA. Please contact [Dr. Mark Johnson, Director of ECE Instructional Laboratories](https://engineering.purdue.edu/Mark-Johnson) to complete the process. + +Once the licensing process is complete and you have been added into a `cae2` Unix group, you could use Sentaurus on RCAC community clusters by loading the corresponding environment module: + +``` +module load sentaurus +``` + +### Julia package installation + +Users do not have write permission to the default julia package installation destination. However, users can install packages into home directory under `~/.julia`. + +Users can side step this by explicitly defining where to put julia packages: + +``` +$ export JULIA_DEPOT_PATH=$HOME/.julia +$ julia -e 'using Pkg; Pkg.add("PackageName")' +``` + +## About Research Computing + +### Can I get a private server from RCAC? + +#### Question + +Can I get a private (virtual or physical) server from RCAC? + +#### Answer + +Often, researchers may want a private server to run databases, web servers, or other software. RCAC currently has [Geddes](https://www.rcac.purdue.edu/compute/geddes), a Community Composable Platform optimized for composable, cloud-like workflows that are complementary to the batch applications run on Community Clusters. Funded by the National Science Foundation under grant OAC-2018926, Geddes consists of Dell Compute nodes with two 64-core AMD Epyc 'Rome' processors (128 cores per node). + +To purchase access to Geddes today, go to the [Cluster Access Purchase](https://www.rcac.purdue.edu/purchase) page. Please subscribe to our Community Cluster Program Mailing List to stay informed on the latest purchasing developments or contact us (rcac-cluster-purchase@lists.purdue.edu) if you have any questions. + +[**Back to Hammer User Guide**](index.md) diff --git a/docs/userguides/hammer/index.md b/docs/userguides/hammer/index.md new file mode 100644 index 00000000..f463f828 --- /dev/null +++ b/docs/userguides/hammer/index.md @@ -0,0 +1,33 @@ +--- +tags: + - Hammer +authors: + - jin456 +resource: Hammer +search: + boost: 2 +--- + +# Hammer User Guide + +
+
+ Gateway (Open OnDemand) + Launch +
+
+ Remote Desktop (ThinLinc) + Launch +
+
+ +Hammer is optimized for Purdue's communities utilizing loosely-coupled, high-throughput computing. + +- [**Hammer Overview**](overview.md) +- [**Accounts**](accounts.md) +- [**Software**](software.md) +- [**Running Jobs**](run_jobs/index.md) +- [**File Storage and Transfer**](storage.md) +- [**Compiling Source Code**](compile.md) +- [**Jupyter Hub**](jupyter.md) +- [**Frequently Asked Questions**](faqs.md) diff --git a/docs/userguides/hammer/jupyter.md b/docs/userguides/hammer/jupyter.md new file mode 100644 index 00000000..322e4661 --- /dev/null +++ b/docs/userguides/hammer/jupyter.md @@ -0,0 +1,78 @@ +--- +tags: + - Hammer +authors: + - jin456 +resource: Hammer +search: + boost: 2 +--- + +# Using Jupyter Hub + +Hammer provides a JupyterHub instance at [https://notebook.hammer.rcac.purdue.edu](https://notebook.hammer.rcac.purdue.edu). + +## What is Jupyter Hub + +Jupyter (an acronym meaning Julia, Python and R) is a web-based interactive environment. Notebooks organize code, documentation, and results into a single document. JupyterHub provides a multi-user server that manages and proxies multiple instances of the single-user Jupyter notebook server. + +## Getting Started + +Navigate to [https://notebook.hammer.rcac.purdue.edu](https://notebook.hammer.rcac.purdue.edu) and log in with your Purdue career account credentials. After logging in, you will see your home directory in the file browser on the left side. You can create new notebooks using the "New" dropdown, which supports Bash, R, and Python kernels. + +## Create Your Own Environment + +You can create custom conda environments and register them as Jupyter kernels so that your notebooks use the packages you need. + +### Step 1: Create a conda environment + +```bash +$ module load anaconda +$ conda create -n myenv python=3.10 +$ conda activate myenv +``` + +### Step 2: Install ipykernel in your environment + +```bash +$ conda install ipykernel +$ python -m ipykernel install --user --name myenv --display-name "Python (myenv)" +``` + +### Step 3: Install your desired packages + +```bash +$ conda install numpy scipy matplotlib +# or use pip +$ pip install +``` + +### Step 4: Reload JupyterHub + +After installing the kernel, reload the JupyterHub page. Your new environment will appear in the kernel selector when creating or switching kernels in a notebook. + +## Running Notebooks + +Once logged in, you can: + +* Create new notebooks from the Launcher or File menu +* Upload existing notebooks using the upload button in the file browser +* Run cells interactively using `Shift+Enter` or the Run menu +* Open a terminal from the Launcher to run shell commands + +## Accessing Scratch Space + +Your scratch directory is available at `/scratch/hammer/$USER`. You can access it from within a notebook using Python: + +```python +import os +scratch = os.environ.get('RCAC_SCRATCH', f'/scratch/hammer/{os.environ["USER"]}') +print(scratch) +``` + +## Limitations + +* JupyterHub on Hammer runs on the front-end login nodes. Do not run long, memory-intensive, or CPU-heavy computations directly in notebooks on the front-end. Use the notebook interface to submit jobs to the scheduler instead. +* For heavy computational workloads, consider submitting batch jobs via the [Running Jobs](run_jobs/index.md) section. + +[**Back to Hammer User Guide**](index.md) diff --git a/docs/userguides/hammer/overview.md b/docs/userguides/hammer/overview.md new file mode 100644 index 00000000..d3e5b639 --- /dev/null +++ b/docs/userguides/hammer/overview.md @@ -0,0 +1,40 @@ +--- +tags: + - Hammer +authors: + - jin456 +resource: Hammer +search: + boost: 2 +--- + +# Hammer Overview + +Hammer is a Community Cluster optimized for Purdue's communities utilizing loosely-coupled, high-throughput computing. Hammer consists of multiple sub-clusters of Dell compute nodes with varying processor and memory configurations to support a wide range of research workloads. + +## Hammer Specifications + +Hammer Front-Ends + +| Front-Ends | Number of Nodes | Processors per Node | Cores per Node | Memory per Node | Retires in | +| --- | --- | --- | --- | --- | --- | +| | 2 | Two Haswell @ 2.60GHz | 20 | 64 GB | 2020 | + +Hammer Sub-Clusters + +| Sub-Cluster | Number of Nodes | Processors per Node | Cores per Node | Memory per Node | Retires in | +| --- | --- | --- | --- | --- | --- | +| A | 198 | Two Haswell @ 2.60GHz | 20 | 64 GB | 2020 | +| B | 40 | Two Haswell @ 2.60GHz | 40 | 128 GB | 2021 | +| C | 27 | Two Sky Lake @ 2.60GHz | 48 | 192 GB | 2022 | +| D | 18 | Two Sky Lake @ 2.60GHz | 48 | 192 GB | 2023 | +| E | 15 | Two Xeon Gold @ 2.60GHz | 48 | 96 GB | 2024 | + +Hammer nodes run Rocky Linux 8 and use Slurm (Simple Linux Utility for Resource Management) as the batch scheduler for resource and job management. The application of operating system patches occurs as security needs dictate. All nodes allow for unlimited stack usage, as well as unlimited core dump size (though disk space and server quotas may still be a limiting factor). + +On Hammer, the following set of compiler and message-passing library for parallel code are recommended: + +* GCC +* OpenMPI + +[**Back to Hammer User Guide**](index.md) diff --git a/docs/userguides/hammer/run_jobs/examples/apps.md b/docs/userguides/hammer/run_jobs/examples/apps.md new file mode 100644 index 00000000..f2d577a4 --- /dev/null +++ b/docs/userguides/hammer/run_jobs/examples/apps.md @@ -0,0 +1,27 @@ +--- +tags: + - Hammer +authors: + - jin456 +resource: Hammer +search: + boost: 2 +--- + +# Specific Applications + +The following examples demonstrate job submission files for some common real-world applications. See the [Generic SLURM Examples](slurm.md) section for more examples on job submissions that can be adapted for use. + +## In This Section + +- [Gaussian](apps/gaussian.md) +- [Mathematica](apps/mathematica.md) +- [Matlab](apps/matlab.md) +- [Octave](apps/octave.md) +- [Python](apps/python.md) +- [R](apps/r.md) +- [Spark](apps/spark.md) +- [Windows](apps/windows.md) +- [Machine Learning](apps/learning.md) + +[**Back to the Running Jobs section**](../index.md) diff --git a/docs/userguides/hammer/run_jobs/examples/apps/gaussian.md b/docs/userguides/hammer/run_jobs/examples/apps/gaussian.md new file mode 100644 index 00000000..3336d795 --- /dev/null +++ b/docs/userguides/hammer/run_jobs/examples/apps/gaussian.md @@ -0,0 +1,13 @@ +--- +tags: + - Hammer +authors: + - jin456 +resource: Hammer +search: + boost: 2 +--- + +--8<-- "docs/snippets/examples/apps/gaussian.md" + +[**Back to the Specific Applications section**](../apps.md) diff --git a/docs/userguides/hammer/run_jobs/examples/apps/learning.md b/docs/userguides/hammer/run_jobs/examples/apps/learning.md new file mode 100644 index 00000000..39b67c6a --- /dev/null +++ b/docs/userguides/hammer/run_jobs/examples/apps/learning.md @@ -0,0 +1,13 @@ +--- +tags: + - Hammer +authors: + - jin456 +resource: Hammer +search: + boost: 2 +--- + +--8<-- "docs/snippets/examples/apps/learning.md" + +[**Back to the Specific Applications section**](../apps.md) diff --git a/docs/userguides/hammer/run_jobs/examples/apps/learning/customml.md b/docs/userguides/hammer/run_jobs/examples/apps/learning/customml.md new file mode 100644 index 00000000..c34620b1 --- /dev/null +++ b/docs/userguides/hammer/run_jobs/examples/apps/learning/customml.md @@ -0,0 +1,13 @@ +--- +tags: + - Hammer +authors: + - jin456 +resource: Hammer +search: + boost: 2 +--- + +--8<-- "docs/snippets/examples/apps/learning/customml.md" + +[**Back to the Machine Learning section**](../learning.md) diff --git a/docs/userguides/hammer/run_jobs/examples/apps/learning/ml_batch.md b/docs/userguides/hammer/run_jobs/examples/apps/learning/ml_batch.md new file mode 100644 index 00000000..ae82645a --- /dev/null +++ b/docs/userguides/hammer/run_jobs/examples/apps/learning/ml_batch.md @@ -0,0 +1,13 @@ +--- +tags: + - Hammer +authors: + - jin456 +resource: Hammer +search: + boost: 2 +--- + +--8<-- "docs/snippets/examples/apps/learning/ml_batch.md" + +[**Back to the Machine Learning section**](../learning.md) diff --git a/docs/userguides/hammer/run_jobs/examples/apps/learning/mltoolkit.md b/docs/userguides/hammer/run_jobs/examples/apps/learning/mltoolkit.md new file mode 100644 index 00000000..fdd23a7d --- /dev/null +++ b/docs/userguides/hammer/run_jobs/examples/apps/learning/mltoolkit.md @@ -0,0 +1,13 @@ +--- +tags: + - Hammer +authors: + - jin456 +resource: Hammer +search: + boost: 2 +--- + +--8<-- "docs/snippets/examples/apps/learning/mltoolkit.md" + +[**Back to the Machine Learning section**](../learning.md) diff --git a/docs/userguides/hammer/run_jobs/examples/apps/mathematica.md b/docs/userguides/hammer/run_jobs/examples/apps/mathematica.md new file mode 100644 index 00000000..b274fa1b --- /dev/null +++ b/docs/userguides/hammer/run_jobs/examples/apps/mathematica.md @@ -0,0 +1,13 @@ +--- +tags: + - Hammer +authors: + - jin456 +resource: Hammer +search: + boost: 2 +--- + +--8<-- "docs/snippets/examples/apps/mathematica.md" + +[**Back to the Specific Applications section**](../apps.md) diff --git a/docs/userguides/hammer/run_jobs/examples/apps/matlab.md b/docs/userguides/hammer/run_jobs/examples/apps/matlab.md new file mode 100644 index 00000000..32b2301f --- /dev/null +++ b/docs/userguides/hammer/run_jobs/examples/apps/matlab.md @@ -0,0 +1,13 @@ +--- +tags: + - Hammer +authors: + - jin456 +resource: Hammer +search: + boost: 2 +--- + +--8<-- "docs/snippets/examples/apps/matlab.md" + +[**Back to the Specific Applications section**](../apps.md) diff --git a/docs/userguides/hammer/run_jobs/examples/apps/matlab/implicit_parallelism.md b/docs/userguides/hammer/run_jobs/examples/apps/matlab/implicit_parallelism.md new file mode 100644 index 00000000..94767169 --- /dev/null +++ b/docs/userguides/hammer/run_jobs/examples/apps/matlab/implicit_parallelism.md @@ -0,0 +1,13 @@ +--- +tags: + - Hammer +authors: + - jin456 +resource: Hammer +search: + boost: 2 +--- + +--8<-- "docs/snippets/examples/apps/matlab/implicit_parallelism.md" + +[**Back to the Matlab section**](../matlab.md) diff --git a/docs/userguides/hammer/run_jobs/examples/apps/matlab/interpreter.md b/docs/userguides/hammer/run_jobs/examples/apps/matlab/interpreter.md new file mode 100644 index 00000000..9e463d98 --- /dev/null +++ b/docs/userguides/hammer/run_jobs/examples/apps/matlab/interpreter.md @@ -0,0 +1,13 @@ +--- +tags: + - Hammer +authors: + - jin456 +resource: Hammer +search: + boost: 2 +--- + +--8<-- "docs/snippets/examples/apps/matlab/interpreter.md" + +[**Back to the Matlab section**](../matlab.md) diff --git a/docs/userguides/hammer/run_jobs/examples/apps/matlab/mdcs_parallel.md b/docs/userguides/hammer/run_jobs/examples/apps/matlab/mdcs_parallel.md new file mode 100644 index 00000000..9adc9e8f --- /dev/null +++ b/docs/userguides/hammer/run_jobs/examples/apps/matlab/mdcs_parallel.md @@ -0,0 +1,13 @@ +--- +tags: + - Hammer +authors: + - jin456 +resource: Hammer +search: + boost: 2 +--- + +--8<-- "docs/snippets/examples/apps/matlab/mdcs_parallel.md" + +[**Back to the Matlab section**](../matlab.md) diff --git a/docs/userguides/hammer/run_jobs/examples/apps/matlab/parfor.md b/docs/userguides/hammer/run_jobs/examples/apps/matlab/parfor.md new file mode 100644 index 00000000..294be9e4 --- /dev/null +++ b/docs/userguides/hammer/run_jobs/examples/apps/matlab/parfor.md @@ -0,0 +1,13 @@ +--- +tags: + - Hammer +authors: + - jin456 +resource: Hammer +search: + boost: 2 +--- + +--8<-- "docs/snippets/examples/apps/matlab/parfor.md" + +[**Back to the Matlab section**](../matlab.md) diff --git a/docs/userguides/hammer/run_jobs/examples/apps/matlab/profile_manager.md b/docs/userguides/hammer/run_jobs/examples/apps/matlab/profile_manager.md new file mode 100644 index 00000000..e377b77c --- /dev/null +++ b/docs/userguides/hammer/run_jobs/examples/apps/matlab/profile_manager.md @@ -0,0 +1,13 @@ +--- +tags: + - Hammer +authors: + - jin456 +resource: Hammer +search: + boost: 2 +--- + +--8<-- "docs/snippets/examples/apps/matlab/profile_manager.md" + +[**Back to the Matlab section**](../matlab.md) diff --git a/docs/userguides/hammer/run_jobs/examples/apps/matlab/spmd.md b/docs/userguides/hammer/run_jobs/examples/apps/matlab/spmd.md new file mode 100644 index 00000000..392e741b --- /dev/null +++ b/docs/userguides/hammer/run_jobs/examples/apps/matlab/spmd.md @@ -0,0 +1,13 @@ +--- +tags: + - Hammer +authors: + - jin456 +resource: Hammer +search: + boost: 2 +--- + +--8<-- "docs/snippets/examples/apps/matlab/spmd.md" + +[**Back to the Matlab section**](../matlab.md) diff --git a/docs/userguides/hammer/run_jobs/examples/apps/octave.md b/docs/userguides/hammer/run_jobs/examples/apps/octave.md new file mode 100644 index 00000000..afb506ce --- /dev/null +++ b/docs/userguides/hammer/run_jobs/examples/apps/octave.md @@ -0,0 +1,13 @@ +--- +tags: + - Hammer +authors: + - jin456 +resource: Hammer +search: + boost: 2 +--- + +--8<-- "docs/snippets/examples/apps/octave.md" + +[**Back to the Specific Applications section**](../apps.md) diff --git a/docs/userguides/hammer/run_jobs/examples/apps/python.md b/docs/userguides/hammer/run_jobs/examples/apps/python.md new file mode 100644 index 00000000..1da9bc74 --- /dev/null +++ b/docs/userguides/hammer/run_jobs/examples/apps/python.md @@ -0,0 +1,13 @@ +--- +tags: + - Hammer +authors: + - jin456 +resource: Hammer +search: + boost: 2 +--- + +--8<-- "docs/snippets/examples/apps/python.md" + +[**Back to the Specific Applications section**](../apps.md) diff --git a/docs/userguides/hammer/run_jobs/examples/apps/python/conda.md b/docs/userguides/hammer/run_jobs/examples/apps/python/conda.md new file mode 100644 index 00000000..1a2e939e --- /dev/null +++ b/docs/userguides/hammer/run_jobs/examples/apps/python/conda.md @@ -0,0 +1,13 @@ +--- +tags: + - Hammer +authors: + - jin456 +resource: Hammer +search: + boost: 2 +--- + +--8<-- "docs/snippets/examples/apps/python/conda.md" + +[**Back to the Python section**](../python.md) diff --git a/docs/userguides/hammer/run_jobs/examples/apps/python/environment_example.md b/docs/userguides/hammer/run_jobs/examples/apps/python/environment_example.md new file mode 100644 index 00000000..2bf78bbe --- /dev/null +++ b/docs/userguides/hammer/run_jobs/examples/apps/python/environment_example.md @@ -0,0 +1,13 @@ +--- +tags: + - Hammer +authors: + - jin456 +resource: Hammer +search: + boost: 2 +--- + +--8<-- "docs/snippets/examples/apps/python/environment_example.md" + +[**Back to the Python section**](../python.md) diff --git a/docs/userguides/hammer/run_jobs/examples/apps/python/examples.md b/docs/userguides/hammer/run_jobs/examples/apps/python/examples.md new file mode 100644 index 00000000..47574b19 --- /dev/null +++ b/docs/userguides/hammer/run_jobs/examples/apps/python/examples.md @@ -0,0 +1,13 @@ +--- +tags: + - Hammer +authors: + - jin456 +resource: Hammer +search: + boost: 2 +--- + +--8<-- "docs/snippets/examples/apps/python/examples.md" + +[**Back to the Python section**](../python.md) diff --git a/docs/userguides/hammer/run_jobs/examples/apps/python/numpy.md b/docs/userguides/hammer/run_jobs/examples/apps/python/numpy.md new file mode 100644 index 00000000..def75f68 --- /dev/null +++ b/docs/userguides/hammer/run_jobs/examples/apps/python/numpy.md @@ -0,0 +1,13 @@ +--- +tags: + - Hammer +authors: + - jin456 +resource: Hammer +search: + boost: 2 +--- + +--8<-- "docs/snippets/examples/apps/python/numpy.md" + +[**Back to the Python section**](../python.md) diff --git a/docs/userguides/hammer/run_jobs/examples/apps/python/packages.md b/docs/userguides/hammer/run_jobs/examples/apps/python/packages.md new file mode 100644 index 00000000..343c218d --- /dev/null +++ b/docs/userguides/hammer/run_jobs/examples/apps/python/packages.md @@ -0,0 +1,13 @@ +--- +tags: + - Hammer +authors: + - jin456 +resource: Hammer +search: + boost: 2 +--- + +--8<-- "docs/snippets/examples/apps/python/packages.md" + +[**Back to the Python section**](../python.md) diff --git a/docs/userguides/hammer/run_jobs/examples/apps/python/pip.md b/docs/userguides/hammer/run_jobs/examples/apps/python/pip.md new file mode 100644 index 00000000..676da1f1 --- /dev/null +++ b/docs/userguides/hammer/run_jobs/examples/apps/python/pip.md @@ -0,0 +1,13 @@ +--- +tags: + - Hammer +authors: + - jin456 +resource: Hammer +search: + boost: 2 +--- + +--8<-- "docs/snippets/examples/apps/python/pip.md" + +[**Back to the Python section**](../python.md) diff --git a/docs/userguides/hammer/run_jobs/examples/apps/python/source.md b/docs/userguides/hammer/run_jobs/examples/apps/python/source.md new file mode 100644 index 00000000..6b31c96f --- /dev/null +++ b/docs/userguides/hammer/run_jobs/examples/apps/python/source.md @@ -0,0 +1,13 @@ +--- +tags: + - Hammer +authors: + - jin456 +resource: Hammer +search: + boost: 2 +--- + +--8<-- "docs/snippets/examples/apps/python/source.md" + +[**Back to the Python section**](../python.md) diff --git a/docs/userguides/hammer/run_jobs/examples/apps/r.md b/docs/userguides/hammer/run_jobs/examples/apps/r.md new file mode 100644 index 00000000..11e6bcd5 --- /dev/null +++ b/docs/userguides/hammer/run_jobs/examples/apps/r.md @@ -0,0 +1,13 @@ +--- +tags: + - Hammer +authors: + - jin456 +resource: Hammer +search: + boost: 2 +--- + +--8<-- "docs/snippets/examples/apps/r.md" + +[**Back to the Specific Applications section**](../apps.md) diff --git a/docs/userguides/hammer/run_jobs/examples/apps/r/data.md b/docs/userguides/hammer/run_jobs/examples/apps/r/data.md new file mode 100644 index 00000000..bc29b608 --- /dev/null +++ b/docs/userguides/hammer/run_jobs/examples/apps/r/data.md @@ -0,0 +1,13 @@ +--- +tags: + - Hammer +authors: + - jin456 +resource: Hammer +search: + boost: 2 +--- + +--8<-- "docs/snippets/examples/apps/r/data.md" + +[**Back to the R section**](../r.md) diff --git a/docs/userguides/hammer/run_jobs/examples/apps/r/job.md b/docs/userguides/hammer/run_jobs/examples/apps/r/job.md new file mode 100644 index 00000000..67a6de13 --- /dev/null +++ b/docs/userguides/hammer/run_jobs/examples/apps/r/job.md @@ -0,0 +1,13 @@ +--- +tags: + - Hammer +authors: + - jin456 +resource: Hammer +search: + boost: 2 +--- + +--8<-- "docs/snippets/examples/apps/r/job.md" + +[**Back to the R section**](../r.md) diff --git a/docs/userguides/hammer/run_jobs/examples/apps/r/package.md b/docs/userguides/hammer/run_jobs/examples/apps/r/package.md new file mode 100644 index 00000000..eb7991a1 --- /dev/null +++ b/docs/userguides/hammer/run_jobs/examples/apps/r/package.md @@ -0,0 +1,13 @@ +--- +tags: + - Hammer +authors: + - jin456 +resource: Hammer +search: + boost: 2 +--- + +--8<-- "docs/snippets/examples/apps/r/package.md" + +[**Back to the R section**](../r.md) diff --git a/docs/userguides/hammer/run_jobs/examples/apps/r/rprofile.md b/docs/userguides/hammer/run_jobs/examples/apps/r/rprofile.md new file mode 100644 index 00000000..84795823 --- /dev/null +++ b/docs/userguides/hammer/run_jobs/examples/apps/r/rprofile.md @@ -0,0 +1,13 @@ +--- +tags: + - Hammer +authors: + - jin456 +resource: Hammer +search: + boost: 2 +--- + +--8<-- "docs/snippets/examples/apps/r/rprofile.md" + +[**Back to the R section**](../r.md) diff --git a/docs/userguides/hammer/run_jobs/examples/apps/r/rstudio.md b/docs/userguides/hammer/run_jobs/examples/apps/r/rstudio.md new file mode 100644 index 00000000..816bca11 --- /dev/null +++ b/docs/userguides/hammer/run_jobs/examples/apps/r/rstudio.md @@ -0,0 +1,13 @@ +--- +tags: + - Hammer +authors: + - jin456 +resource: Hammer +search: + boost: 2 +--- + +--8<-- "docs/snippets/examples/apps/r/rstudio.md" + +[**Back to the R section**](../r.md) diff --git a/docs/userguides/hammer/run_jobs/examples/apps/r/server.md b/docs/userguides/hammer/run_jobs/examples/apps/r/server.md new file mode 100644 index 00000000..0594a030 --- /dev/null +++ b/docs/userguides/hammer/run_jobs/examples/apps/r/server.md @@ -0,0 +1,13 @@ +--- +tags: + - Hammer +authors: + - jin456 +resource: Hammer +search: + boost: 2 +--- + +--8<-- "docs/snippets/examples/apps/r/server.md" + +[**Back to the R section**](../r.md) diff --git a/docs/userguides/hammer/run_jobs/examples/apps/spark.md b/docs/userguides/hammer/run_jobs/examples/apps/spark.md new file mode 100644 index 00000000..6a9cf340 --- /dev/null +++ b/docs/userguides/hammer/run_jobs/examples/apps/spark.md @@ -0,0 +1,13 @@ +--- +tags: + - Hammer +authors: + - jin456 +resource: Hammer +search: + boost: 2 +--- + +--8<-- "docs/snippets/examples/apps/spark.md" + +[**Back to the Specific Applications section**](../apps.md) diff --git a/docs/userguides/hammer/run_jobs/examples/apps/windows.md b/docs/userguides/hammer/run_jobs/examples/apps/windows.md new file mode 100644 index 00000000..3e47129b --- /dev/null +++ b/docs/userguides/hammer/run_jobs/examples/apps/windows.md @@ -0,0 +1,13 @@ +--- +tags: + - Hammer +authors: + - jin456 +resource: Hammer +search: + boost: 2 +--- + +--8<-- "docs/snippets/examples/apps/windows.md" + +[**Back to the Specific Applications section**](../apps.md) diff --git a/docs/userguides/hammer/run_jobs/examples/apps/windows/cmd.md b/docs/userguides/hammer/run_jobs/examples/apps/windows/cmd.md new file mode 100644 index 00000000..d280d4c2 --- /dev/null +++ b/docs/userguides/hammer/run_jobs/examples/apps/windows/cmd.md @@ -0,0 +1,13 @@ +--- +tags: + - Hammer +authors: + - jin456 +resource: Hammer +search: + boost: 2 +--- + +--8<-- "docs/snippets/examples/apps/windows/cmd.md" + +[**Back to the Windows section**](../windows.md) diff --git a/docs/userguides/hammer/run_jobs/examples/apps/windows/launcher.md b/docs/userguides/hammer/run_jobs/examples/apps/windows/launcher.md new file mode 100644 index 00000000..346d5b0a --- /dev/null +++ b/docs/userguides/hammer/run_jobs/examples/apps/windows/launcher.md @@ -0,0 +1,13 @@ +--- +tags: + - Hammer +authors: + - jin456 +resource: Hammer +search: + boost: 2 +--- + +--8<-- "docs/snippets/examples/apps/windows/launcher.md" + +[**Back to the Windows section**](../windows.md) diff --git a/docs/userguides/hammer/run_jobs/examples/hadoop.md b/docs/userguides/hammer/run_jobs/examples/hadoop.md new file mode 100644 index 00000000..68cb7c09 --- /dev/null +++ b/docs/userguides/hammer/run_jobs/examples/hadoop.md @@ -0,0 +1,149 @@ +--- +tags: + - Hammer +authors: + - jin456 +resource: Hammer +search: + boost: 2 +--- + +# Hadoop + +## HBase + +[Apache HBase](http://hbase.apache.org/) is the Hadoop database, a distributed, scalable, big data store. HBase is an open-source, distributed, versioned, non-relational database modeled after Google's [Bigtable: A Distributed Storage System for Structured Data](http://research.google.com/archive/bigtable.html) by Chang et al. Just as Bigtable leverages the distributed data storage provided by the Google File System, Apache HBase provides Bigtable-like capabilities on top of Hadoop and HDFS. + +## Hive + +[Apache Hive](https://hive.apache.org/) is a data warehouse infrastructure built on top of Hadoop for providing data summarization, query, and analysis. Hive provides a mechanism to project structure onto this data and query the data using a SQL-like language called HiveQL. At the same time this language also allows traditional map/reduce programmers to plug in their custom mappers and reducers when it is inconvenient or inefficient to express this logic in HiveQL. + +Load java module: + +``` +$ module load java +``` + +Export environment variables: + +``` +$ source /etc/default/hadoop +$ export HIVE_HOME=/apps/hathi/hive/ +$ export PATH=$HIVE_HOME/bin:$HIVE_HOME/hcatalog/bin:$PATH +``` + +To access Hive: + +``` +$ hive +15/09/10 15:14:16 INFO Configuration.deprecation: mapred.reduce.tasks is deprecated. Instead, use mapreduce.job.reduces +15/09/10 15:14:16 INFO Configuration.deprecation: mapred.min.split.size is deprecated. Instead, use mapreduce.input.fileinputformat.split.minsize +15/09/10 15:14:16 INFO Configuration.deprecation: mapred.reduce.tasks.speculative.execution is deprecated. Instead, use mapreduce.reduce.speculative +15/09/10 15:14:16 INFO Configuration.deprecation: mapred.min.split.size.per.node is deprecated. Instead, use mapreduce.input.fileinputformat.split.minsize.per.node +15/09/10 15:14:16 INFO Configuration.deprecation: mapred.input.dir.recursive is deprecated. Instead, use mapreduce.input.fileinputformat.input.dir.recursive +15/09/10 15:14:16 INFO Configuration.deprecation: mapred.min.split.size.per.rack is deprecated. Instead, use mapreduce.input.fileinputformat.split.minsize.per.rack +15/09/10 15:14:16 INFO Configuration.deprecation: mapred.max.split.size is deprecated. Instead, use mapreduce.input.fileinputformat.split.maxsize +15/09/10 15:14:16 INFO Configuration.deprecation: mapred.committer.job.setup.cleanup.needed is deprecated. Instead, use mapreduce.job.committer.setup.cleanup.needed + +Logging initialized using configuration in jar:file:/apps/hathi/apache-hive-0.14.0-bin/lib/hive-common-0.14.0.jar!/hive-log4j.properties +SLF4J: Class path contains multiple SLF4J bindings. +SLF4J: Found binding in [jar:file:/usr/lib/gphd/hadoop/lib/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class] +SLF4J: Found binding in [jar:file:/apps/hathi/apache-hive-0.14.0-bin/lib/hive-jdbc-0.14.0-standalone.jar!/org/slf4j/impl/StaticLoggerBinder.class] +SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation. +SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory] +hive> +``` + +To create and browse Hive tables: + +``` +$ hive> CREATE TABLE pokes_user (foo INT, bar STRING); +OK +Time taken: 1.56 seconds +$ hive> CREATE TABLE invites_user (foo INT, bar STRING) PARTITIONED BY (ds STRING); +OK +Time taken: 0.125 seconds +$ hive> SHOW TABLES; +OK +invites_user +pokes_user +Time taken: 0.114 seconds, Fetched: 2 row(s) +``` + +To browse Hive tables from hdfs: + +* Go to +* Click on "Browse the filesystem" +* Navigate to "/user/hive/warehouse" + +To run the HCatalog Server from the command-line: + +``` +$ cd /apps/hathi/hive +$ hcatalog/bin/hcat +``` + +For more information, refer to [GettingStarted - Apache Hive - Apache Software Foundation.](https://cwiki.apache.org/confluence/display/Hive/GettingStarted#GettingStarted-SimpleExampleUseCases) + +## Pig + +[Apache Pig](http://pig.apache.org/) is a platform for analyzing large data sets that consists of a high-level language for expressing data analysis programs, coupled with infrastructure for evaluating these programs. + +Before to use Pig, setup environment variables: + +``` +$ module load java +$ export PATH=/apps/hathi/pig/bin:$PATH +``` + +The following steps walk through how to run Pig in interactive mode. Before to run, you should put the `/etc/passwd` file from you local system to `hdfs:///user/yourusername/`. These Pig Latin statements extract all user IDs from the `/etc/passwd` file. + +First, invoke the Grunt shell: + +``` +$ pig -x mapreduce +15/10/06 16:32:01 INFO pig.ExecTypeProvider: Trying ExecType : LOCAL +15/10/06 16:32:01 INFO pig.ExecTypeProvider: Trying ExecType : MAPREDUCE +15/10/06 16:32:01 INFO pig.ExecTypeProvider: Picked MAPREDUCE as the ExecType +2015-10-06 16:32:01,856 [main] INFO org.apache.pig.Main - Apache Pig version 0.15.0 (r1682971) compiled Jun 01 2015, 11:44:35 +2015-10-06 16:32:01,857 [main] INFO org.apache.pig.Main - Logging error messages to: /path/to/pig/pig_1444163521852.log +2015-10-06 16:32:01,908 [main] INFO org.apache.pig.impl.util.Utils - Default bootup file /path/to/.pigbootup not found +2015-10-06 16:32:02,808 [main] INFO org.apache.hadoop.conf.Configuration.deprecation - mapred.job.tracker is deprecated. Instead, use mapreduce.jobtracker.address +2015-10-06 16:32:02,808 [main] INFO org.apache.hadoop.conf.Configuration.deprecation - fs.default.name is deprecated. Instead, use fs.defaultFS +2015-10-06 16:32:02,809 [main] INFO org.apache.pig.backend.hadoop.executionengine.HExecutionEngine - Connecting to hadoop file system at: hdfs://hathi-adm.rcac.purdue.edu:8020 +2015-10-06 16:32:02,816 [main] INFO org.apache.hadoop.conf.Configuration.deprecation - mapred.used.genericoptionsparser is deprecated. Instead, use mapreduce.client.genericoptionsparser.used +2015-10-06 16:32:04,362 [main] INFO org.apache.hadoop.conf.Configuration.deprecation - fs.default.name is deprecated. Instead, use fs.defaultFS +grunt> +``` + +Then, enter the Pig Latin statements interactively at the grunt prompt: + +``` +$ grunt> A = load 'passwd' using PigStorage(':'); +$ grunt> B = foreach A generate $0 as id; +$ grunt> dump B; +``` + +The following steps walk through how to run Pig in batch mode. + +First, save the following statements in the Pig script (id.pig): + +``` +/* id.pig */ + +A = load 'passwd' using PigStorage(':'); -- load the passwd file +B = foreach A generate $0 as id; -- extract the user IDs +store B into 'id.out'; -- write the results to a file name id.out +``` + +Then, run the Pig script in batch mode: + +``` +$ pig -x mapreduce id.pig +``` + +This is generate output in `hdfs:///user/yourusername/id.put/`. + +To learn programming in Pig, refer to: [Pig Overview](http://pig.apache.org/docs/r0.15.0/) + +[**Back to the Running Jobs section**](../index.md) diff --git a/docs/userguides/hammer/run_jobs/examples/slurm.md b/docs/userguides/hammer/run_jobs/examples/slurm.md new file mode 100644 index 00000000..12032994 --- /dev/null +++ b/docs/userguides/hammer/run_jobs/examples/slurm.md @@ -0,0 +1,27 @@ +--- +tags: + - Hammer +authors: + - jin456 +resource: Hammer +search: + boost: 2 +--- + +# Generic SLURM Jobs + +The following examples demonstrate the basics of SLURM jobs, and are designed to cover common job request scenarios. These example jobs will need to be modified to run your application or code. + +## In This Section + +- [Simple Job](slurm/batch.md) +- [Multiple Node](slurm/multiple.md) +- [Directives](slurm/directives.md) +- [Specific Types of Nodes](slurm/specific.md) +- [Interactive Jobs](slurm/interactive.md) +- [Serial Jobs](slurm/serial.md) +- [OpenMP](slurm/openmp.md) +- [MPI](slurm/mpi.md) +- [Monitoring Resources](slurm/monitor.md) + +[**Back to the Running Jobs section**](../index.md) diff --git a/docs/userguides/hammer/run_jobs/examples/slurm/batch.md b/docs/userguides/hammer/run_jobs/examples/slurm/batch.md new file mode 100644 index 00000000..d8e9cace --- /dev/null +++ b/docs/userguides/hammer/run_jobs/examples/slurm/batch.md @@ -0,0 +1,13 @@ +--- +tags: + - Hammer +authors: + - jin456 +resource: Hammer +search: + boost: 2 +--- + +--8<-- "docs/snippets/examples/slurm/batch.md" + +[**Back to the Generic SLURM Jobs section**](../slurm.md) diff --git a/docs/userguides/hammer/run_jobs/examples/slurm/directives.md b/docs/userguides/hammer/run_jobs/examples/slurm/directives.md new file mode 100644 index 00000000..e0d3fcad --- /dev/null +++ b/docs/userguides/hammer/run_jobs/examples/slurm/directives.md @@ -0,0 +1,13 @@ +--- +tags: + - Hammer +authors: + - jin456 +resource: Hammer +search: + boost: 2 +--- + +--8<-- "docs/snippets/examples/slurm/directives.md" + +[**Back to the Generic SLURM Jobs section**](../slurm.md) diff --git a/docs/userguides/hammer/run_jobs/examples/slurm/interactive.md b/docs/userguides/hammer/run_jobs/examples/slurm/interactive.md new file mode 100644 index 00000000..3717ede3 --- /dev/null +++ b/docs/userguides/hammer/run_jobs/examples/slurm/interactive.md @@ -0,0 +1,13 @@ +--- +tags: + - Hammer +authors: + - jin456 +resource: Hammer +search: + boost: 2 +--- + +--8<-- "docs/snippets/examples/slurm/interactive.md" + +[**Back to the Generic SLURM Jobs section**](../slurm.md) diff --git a/docs/userguides/hammer/run_jobs/examples/slurm/monitor.md b/docs/userguides/hammer/run_jobs/examples/slurm/monitor.md new file mode 100644 index 00000000..2bd9f231 --- /dev/null +++ b/docs/userguides/hammer/run_jobs/examples/slurm/monitor.md @@ -0,0 +1,13 @@ +--- +tags: + - Hammer +authors: + - jin456 +resource: Hammer +search: + boost: 2 +--- + +--8<-- "docs/snippets/examples/slurm/monitor.md" + +[**Back to the Generic SLURM Jobs section**](../slurm.md) diff --git a/docs/userguides/hammer/run_jobs/examples/slurm/mpi.md b/docs/userguides/hammer/run_jobs/examples/slurm/mpi.md new file mode 100644 index 00000000..f84fbc8e --- /dev/null +++ b/docs/userguides/hammer/run_jobs/examples/slurm/mpi.md @@ -0,0 +1,13 @@ +--- +tags: + - Hammer +authors: + - jin456 +resource: Hammer +search: + boost: 2 +--- + +--8<-- "docs/snippets/examples/slurm/mpi.md" + +[**Back to the Generic SLURM Jobs section**](../slurm.md) diff --git a/docs/userguides/hammer/run_jobs/examples/slurm/multiple.md b/docs/userguides/hammer/run_jobs/examples/slurm/multiple.md new file mode 100644 index 00000000..72ed4957 --- /dev/null +++ b/docs/userguides/hammer/run_jobs/examples/slurm/multiple.md @@ -0,0 +1,13 @@ +--- +tags: + - Hammer +authors: + - jin456 +resource: Hammer +search: + boost: 2 +--- + +--8<-- "docs/snippets/examples/slurm/multiple.md" + +[**Back to the Generic SLURM Jobs section**](../slurm.md) diff --git a/docs/userguides/hammer/run_jobs/examples/slurm/openmp.md b/docs/userguides/hammer/run_jobs/examples/slurm/openmp.md new file mode 100644 index 00000000..ddfdd318 --- /dev/null +++ b/docs/userguides/hammer/run_jobs/examples/slurm/openmp.md @@ -0,0 +1,13 @@ +--- +tags: + - Hammer +authors: + - jin456 +resource: Hammer +search: + boost: 2 +--- + +--8<-- "docs/snippets/examples/slurm/openmp.md" + +[**Back to the Generic SLURM Jobs section**](../slurm.md) diff --git a/docs/userguides/hammer/run_jobs/examples/slurm/serial.md b/docs/userguides/hammer/run_jobs/examples/slurm/serial.md new file mode 100644 index 00000000..5c2c3260 --- /dev/null +++ b/docs/userguides/hammer/run_jobs/examples/slurm/serial.md @@ -0,0 +1,13 @@ +--- +tags: + - Hammer +authors: + - jin456 +resource: Hammer +search: + boost: 2 +--- + +--8<-- "docs/snippets/examples/slurm/serial.md" + +[**Back to the Generic SLURM Jobs section**](../slurm.md) diff --git a/docs/userguides/hammer/run_jobs/examples/slurm/specific.md b/docs/userguides/hammer/run_jobs/examples/slurm/specific.md new file mode 100644 index 00000000..32930350 --- /dev/null +++ b/docs/userguides/hammer/run_jobs/examples/slurm/specific.md @@ -0,0 +1,13 @@ +--- +tags: + - Hammer +authors: + - jin456 +resource: Hammer +search: + boost: 2 +--- + +--8<-- "docs/snippets/examples/slurm/specific.md" + +[**Back to the Generic SLURM Jobs section**](../slurm.md) diff --git a/docs/userguides/hammer/run_jobs/index.md b/docs/userguides/hammer/run_jobs/index.md new file mode 100644 index 00000000..9c3c3b11 --- /dev/null +++ b/docs/userguides/hammer/run_jobs/index.md @@ -0,0 +1,44 @@ +--- +tags: + - Hammer +authors: + - jin456 +resource: Hammer +search: + boost: 2 +--- + +# Running Jobs + +Jobs are submitted on Hammer via the SLURM (Simple Linux Utility for Resource Management) scheduler, which is responsible for allocating resources and scheduling the start time of a job. You may use either the batch or interactive mode to run your jobs. The batch mode is ideal for finished programs, and the interactive mode is useful for debugging your job. + +!!! important + Do NOT run large, long, multi-threaded, parallel, or CPU-intensive jobs on a front-end login host. All users share the front-end hosts, and running anything but the smallest test job will negatively impact everyone's ability to use Hammer. Always use SLURM to submit your work as a job. + +Before creating your submission script, learn more about how to use Slurm accounts and queues on Hammer: + +- [**Basics of using Slurm accounts and queues**](slurm/queues.md) + +Batch jobs submitted via SLURM have four main steps: + +* [Create job submission script](slurm/creating_the_submission_script.md) +* [Submit job script](slurm/submit_script.md) +* [Monitor job status](slurm/monitoring_job.md) +* [Check output](slurm/checking_output.md) + +## Other useful topics + +- [Canceling a Job](slurm/cancelling_job.md) +- [Job Dependencies](slurm/job_dependencies.md) +- [Holding a Job](slurm/holding_job.md) + + +## Example Jobs + +A number of example jobs are available for you to look over and adapt to your own needs. The first few are generic examples, and latter ones go into specifics for particular software packages. + +- [Specific Applications](examples/apps.md) +- [Hadoop](examples/hadoop.md) +- [Generic SLURM Jobs](examples/slurm.md) + +[**Back to Hammer User Guide**](../index.md) diff --git a/docs/userguides/hammer/run_jobs/slurm/cancelling_job.md b/docs/userguides/hammer/run_jobs/slurm/cancelling_job.md new file mode 100644 index 00000000..224b4e0a --- /dev/null +++ b/docs/userguides/hammer/run_jobs/slurm/cancelling_job.md @@ -0,0 +1,13 @@ +--- +tags: + - Hammer +authors: + - jin456 +resource: Hammer +search: + boost: 2 +--- + +--8<-- "docs/snippets/cancelling_job.md" + +[**Back to the Running Jobs section**](../index.md) diff --git a/docs/userguides/hammer/run_jobs/slurm/checking_output.md b/docs/userguides/hammer/run_jobs/slurm/checking_output.md new file mode 100644 index 00000000..98ae54bb --- /dev/null +++ b/docs/userguides/hammer/run_jobs/slurm/checking_output.md @@ -0,0 +1,13 @@ +--- +tags: + - Hammer +authors: + - jin456 +resource: Hammer +search: + boost: 2 +--- + +--8<-- "docs/snippets/checking_output.md" + +[**Back to the Running Jobs section**](../index.md) diff --git a/docs/userguides/hammer/run_jobs/slurm/creating_the_submission_script.md b/docs/userguides/hammer/run_jobs/slurm/creating_the_submission_script.md new file mode 100644 index 00000000..8fd6916e --- /dev/null +++ b/docs/userguides/hammer/run_jobs/slurm/creating_the_submission_script.md @@ -0,0 +1,45 @@ +--- +tags: + - Hammer +authors: + - jin456 +resource: Hammer +search: + boost: 2 +--- + +# Job Submission Script + +To submit work to a SLURM queue, you must first create a *job submission file*. This job submission file is essentially a simple shell script. It will set any required environment variables, load any necessary modules, create or modify files and directories, and run any applications that you need: + +``` +#!/bin/bash +# FILENAME: myjobsubmissionfile + +# Loads Matlab and sets the application up +module load matlab + +# Change to the directory from which you originally submitted this job. +cd $SLURM_SUBMIT_DIR + +# Runs a Matlab script named 'myscript' +matlab -nodisplay -singleCompThread -r myscript +``` + +Once your script is prepared, you are ready to [submit your job](submit_script.md). + +## Job Script Environment Variables + +SLURM sets several potentially useful environment variables which you may use within your job submission files. Here is a list of some: + +| Name | Description | +| --- | --- | +| SLURM\_SUBMIT\_DIR | Absolute path of the current working directory when you submitted this job | +| SLURM\_JOBID | Job ID number assigned to this job by the batch system | +| SLURM\_JOB\_NAME | Job name supplied by the user | +| SLURM\_JOB\_NODELIST | Names of nodes assigned to this job | +| SLURM\_CLUSTER\_NAME | Name of the cluster executing the job | +| SLURM\_SUBMIT\_HOST | Hostname of the system where you submitted this job | +| SLURM\_JOB\_PARTITION | Name of the original queue to which you submitted this job | + +[**Back to the Running Jobs section**](../index.md) diff --git a/docs/userguides/hammer/run_jobs/slurm/holding_job.md b/docs/userguides/hammer/run_jobs/slurm/holding_job.md new file mode 100644 index 00000000..b92426de --- /dev/null +++ b/docs/userguides/hammer/run_jobs/slurm/holding_job.md @@ -0,0 +1,13 @@ +--- +tags: + - Hammer +authors: + - jin456 +resource: Hammer +search: + boost: 2 +--- + +--8<-- "docs/snippets/holding_job.md" + +[**Back to the Running Jobs section**](../index.md) diff --git a/docs/userguides/hammer/run_jobs/slurm/job_dependencies.md b/docs/userguides/hammer/run_jobs/slurm/job_dependencies.md new file mode 100644 index 00000000..b477228a --- /dev/null +++ b/docs/userguides/hammer/run_jobs/slurm/job_dependencies.md @@ -0,0 +1,13 @@ +--- +tags: + - Hammer +authors: + - jin456 +resource: Hammer +search: + boost: 2 +--- + +--8<-- "docs/snippets/job_dependencies.md" + +[**Back to the Running Jobs section**](../index.md) diff --git a/docs/userguides/hammer/run_jobs/slurm/monitoring_job.md b/docs/userguides/hammer/run_jobs/slurm/monitoring_job.md new file mode 100644 index 00000000..b505d02c --- /dev/null +++ b/docs/userguides/hammer/run_jobs/slurm/monitoring_job.md @@ -0,0 +1,13 @@ +--- +tags: + - Hammer +authors: + - jin456 +resource: Hammer +search: + boost: 2 +--- + +--8<-- "docs/snippets/monitoring_job.md" + +[**Back to the Running Jobs section**](../index.md) diff --git a/docs/userguides/hammer/run_jobs/slurm/queues.md b/docs/userguides/hammer/run_jobs/slurm/queues.md new file mode 100644 index 00000000..2be8b259 --- /dev/null +++ b/docs/userguides/hammer/run_jobs/slurm/queues.md @@ -0,0 +1,68 @@ +--- +tags: + - Hammer +authors: + - jin456 +resource: Hammer +search: + boost: 2 +--- + +# Queues + +On Hammer, jobs are submitted to named queues (also called accounts). Each research partner who has purchased access to Hammer receives a dedicated queue named after their research group. In addition, all users have access to the `standby` and `debug` queues. + +## Named (mylab) Queues + +Each research partner on Hammer has a dedicated queue named after their research group (e.g., `mylab`). These queues provide priority access to the resources purchased by that group. + +* Jobs submitted to a named queue have high priority and are expected to start within 4 hours. +* The maximum walltime for jobs in a named queue is **336 hours** (14 days). +* Named queue jobs withdraw resources from the group's purchased allocation while running. + +To submit a job to your named queue: + +```bash +$ sbatch --account=myqueuename myjobsubmissionfile +``` + +To check what queues you have access to, use the `slist` command. + +## Standby Queue + +The `standby` queue is available to all Hammer users and allows jobs to run on otherwise idle resources across the cluster. + +* Jobs in the standby queue have lower priority; there is no guaranteed start time. +* The maximum walltime for standby jobs is **4 hours**. +* Standby jobs use idle resources and do not count against your group's purchased allocation. + +To submit a job to the standby queue: + +```bash +$ sbatch --account=standby myjobsubmissionfile +``` + +## Debug Queue + +The `debug` queue is intended for short, interactive debugging sessions to help you test and troubleshoot your job scripts before submitting longer runs. + +* Each user may have **1 running job** in the debug queue at a time. +* Jobs may use up to **2 compute nodes**. +* The maximum walltime is **30 minutes**. +* Debug jobs are expected to start within minutes. + +To submit a job to the debug queue: + +```bash +$ sbatch --account=debug --nodes=1 myjobsubmissionfile +``` + +## Queue Summary + +| Queue | Who Can Use | Max Walltime | Expected Start | Notes | +| --- | --- | --- | --- | --- | +| Named (mylab) | Research group members | 336 hours | Within 4 hours | Dedicated, high priority | +| standby | All users | 4 hours | No guarantee | Uses idle resources | +| debug | All users | 30 minutes | Within minutes | 1 running job/user, max 2 nodes | + +[**Back to the Running Jobs section**](../index.md) diff --git a/docs/userguides/hammer/run_jobs/slurm/submit_script.md b/docs/userguides/hammer/run_jobs/slurm/submit_script.md new file mode 100644 index 00000000..337dc183 --- /dev/null +++ b/docs/userguides/hammer/run_jobs/slurm/submit_script.md @@ -0,0 +1,81 @@ +--- +tags: + - Hammer +authors: + - jin456 +resource: Hammer +search: + boost: 2 +--- + +# Submitting a Job + +Once you have a [job submission file](creating_the_submission_script.md), you may submit this script to SLURM using the `sbatch` command. SLURM will find, or wait for, available resources matching your request and run your job there. + +On Hammer, you specify the queue (account) using the `-A` or `--account=` option. To check the queues available to you, use the `slist` command. For a description of Hammer's queues, visit [Hammer Queues](queues.md). + +## Named Queue + +To submit a job to your research group's named queue: + +```bash +$ sbatch --account=myqueuename myjobsubmissionfile +``` + +## Standby Queue + +To submit a job to the standby queue (available to all users, lower priority, max 4 hours): + +```bash +$ sbatch --account=standby myjobsubmissionfile +``` + +## Debug Queue + +To submit a short debugging job to the debug queue (max 2 nodes, max 30 minutes): + +```bash +$ sbatch --account=debug --nodes=1 myjobsubmissionfile +``` + +## General Information + +By default, each job receives 30 minutes of *wall time*, or clock time. If you know that your job will not need more than a certain amount of time to run, request less than the maximum wall time, as this may allow your job to run sooner. To request 1 hour and 30 minutes of wall time: + +```bash +$ sbatch -t 01:30:00 --account=myqueuename myjobsubmissionfile +``` + +The `--nodes=` or `-N` value indicates how many compute nodes you would like for your job, and `--ntasks=` or `-n` value indicates the number of tasks you want to run. + +In some cases, you may want to request multiple nodes. To utilize multiple nodes, you will need to have a program or code that is specifically programmed to use multiple nodes such as with MPI. Simply requesting more nodes will not make your work go faster. Your code must support this ability. + +To request 2 compute nodes: + +```bash +$ sbatch -t 01:30:00 -N 2 -n 16 --account=myqueuename myjobsubmissionfile +``` + +If more convenient, you may also specify any command line options to `sbatch` from within your job submission file, using a special form of comment: + +``` +#!/bin/sh -l +# FILENAME: myjobsubmissionfile + +#SBATCH --account=myqueuename +#SBATCH --nodes=1 +#SBATCH --ntasks=1 +#SBATCH --time=1:30:00 +#SBATCH --job-name myjobname + +# Print the hostname of the compute node on which this job is running. +/bin/hostname +``` + +If an option is present in both your job submission file and on the command line, the option on the command line will take precedence. + +After you submit your job with `sbatch`, it may wait in queue for minutes, hours, or even longer depending on the queue and current load. How long it takes for a job to start depends on the specific queue, the resources and time requested, and other jobs already waiting. It is impossible to say for sure when any given job will start. For best results, request no more resources than your job requires. + +Once your job is submitted, you can [monitor the job status](monitoring_job.md), wait for the job to complete, and [check the job output](checking_output.md). + +[**Back to the Running Jobs section**](../index.md) diff --git a/docs/userguides/hammer/software.md b/docs/userguides/hammer/software.md new file mode 100644 index 00000000..b9f40e5c --- /dev/null +++ b/docs/userguides/hammer/software.md @@ -0,0 +1,50 @@ +--- +tags: + - Hammer +authors: + - jin456 +resource: Hammer +search: + boost: 2 +--- + +# Software + +## Software Catalog + +A comprehensive list of centrally installed software applications can be found here: + +[Software Catalog](../../software/app_catalog.md) + +Software can also be explored by popular domains and categories on the main [Software](../../software/index.md) page. + +## Module system + +{% set resource = "hammer" %} + +{{ module_system(resource) }} + +## Running the Apps +### Find available apps in the terminal +In addition to searching the software catalog for available applications, one can generate a list via the terminal: + +``` bash +$ module avail +``` +### View module prequisites and license information +After finding the module that you want to load, use 'module spider' to find any prerequisites or license information, if applicable: + +``` bash +$ module spider +``` +### Load the module +Use the command specified in the 'module spider' output to load your software module: + +``` bash +module load +``` + +### Running GUI versions of apps +If the app you want to use has a GUI, you can also login to {{ resource }} via Thinlinc. More information on this process can be found [here](accounts.md#thinlinc). + +[**Back to Hammer User Guide**](index.md) diff --git a/docs/userguides/hammer/storage.md b/docs/userguides/hammer/storage.md new file mode 100644 index 00000000..b5f178c0 --- /dev/null +++ b/docs/userguides/hammer/storage.md @@ -0,0 +1,46 @@ +--- +tags: + - Hammer +authors: + - jin456 +resource: Hammer +search: + boost: 2 +--- + +# File Storage and Transfer + +Learn more about file storage transfer for Hammer. + +## Storage Options + +File storage options on RCAC systems include long-term storage (home directories, depot, Fortress) and short-term storage (scratch directories, /tmp directory). Each option has different performance and intended uses, and some options vary from system to system as well. Daily snapshots of home directories are provided for a limited time for accidental deletion recovery. Scratch directories and temporary storage are not backed up and old files are regularly purged from scratch and /tmp directories. More details about each storage option appear below. + +- [Home Directory](storage/home_directory.md) +- [Scratch Space](storage/scratch_space.md) +- [/tmp Directory](storage/tmp_directory.md) +- [Long-Term Storage](storage/long_term_storage.md) + +### Other Storage Topics + +- [Storage Quota / Limits](storage/storage_quota.md) +- [Storage Environment Variables](storage/environment_variables.md) +- [Archive and Compression](storage/archive_and_compression.md) +- [Sharing](storage/sharing.md) + +## File Transfer + +Hammer supports several methods for file transfer. Use the links below to learn more about these methods. + +- [Globus](storage/globus.md) +- [Windows Network Drive / SMB](storage/windows_network_drive.md) +- [SCP](storage/scp.md) +- [FTP / SFTP](storage/ftp_sftp.md) +- [HSI](storage/hsi.md) +- [HTAR](storage/htar.md) + +## Lost File Recovery + +- [Lost File Recovery](storage/recover.md) + +[**Back to Hammer User Guide**](index.md) diff --git a/docs/userguides/hammer/storage/archive_and_compression.md b/docs/userguides/hammer/storage/archive_and_compression.md new file mode 100644 index 00000000..f7f30632 --- /dev/null +++ b/docs/userguides/hammer/storage/archive_and_compression.md @@ -0,0 +1,13 @@ +--- +tags: + - Hammer +authors: + - jin456 +resource: Hammer +search: + boost: 2 +--- + +--8<-- "docs/snippets/archive_and_compression.md" + +[**Back to the Storage section**](../storage.md) diff --git a/docs/userguides/hammer/storage/environment_variables.md b/docs/userguides/hammer/storage/environment_variables.md new file mode 100644 index 00000000..d46cb977 --- /dev/null +++ b/docs/userguides/hammer/storage/environment_variables.md @@ -0,0 +1,13 @@ +--- +tags: + - Hammer +authors: + - jin456 +resource: Hammer +search: + boost: 2 +--- +{% set resource = "hammer" %} +{{ environment_variables(resource) }} + +[**Back to the Storage section**](../storage.md) diff --git a/docs/userguides/hammer/storage/ftp_sftp.md b/docs/userguides/hammer/storage/ftp_sftp.md new file mode 100644 index 00000000..d3371d5e --- /dev/null +++ b/docs/userguides/hammer/storage/ftp_sftp.md @@ -0,0 +1,13 @@ +--- +tags: + - Hammer +authors: + - jin456 +resource: Hammer +search: + boost: 2 +--- + +--8<-- "docs/snippets/ftp_sftp.md" + +[**Back to the Storage section**](../storage.md) diff --git a/docs/userguides/hammer/storage/globus.md b/docs/userguides/hammer/storage/globus.md new file mode 100644 index 00000000..ae1977f7 --- /dev/null +++ b/docs/userguides/hammer/storage/globus.md @@ -0,0 +1,13 @@ +--- +tags: + - Hammer +authors: + - jin456 +resource: Hammer +search: + boost: 2 +--- + +--8<-- "docs/snippets/globus.md" + +[**Back to the Storage section**](../storage.md) diff --git a/docs/userguides/hammer/storage/home_directory.md b/docs/userguides/hammer/storage/home_directory.md new file mode 100644 index 00000000..8984b047 --- /dev/null +++ b/docs/userguides/hammer/storage/home_directory.md @@ -0,0 +1,13 @@ +--- +tags: + - Hammer +authors: + - jin456 +resource: Hammer +search: + boost: 2 +--- + +--8<-- "docs/snippets/home_directory.md" + +[**Back to the Storage section**](../storage.md) diff --git a/docs/userguides/hammer/storage/hsi.md b/docs/userguides/hammer/storage/hsi.md new file mode 100644 index 00000000..35b35c75 --- /dev/null +++ b/docs/userguides/hammer/storage/hsi.md @@ -0,0 +1,13 @@ +--- +tags: + - Hammer +authors: + - jin456 +resource: Hammer +search: + boost: 2 +--- + +--8<-- "docs/snippets/hsi.md" + +[**Back to the Storage section**](../storage.md) diff --git a/docs/userguides/hammer/storage/htar.md b/docs/userguides/hammer/storage/htar.md new file mode 100644 index 00000000..ca2898ef --- /dev/null +++ b/docs/userguides/hammer/storage/htar.md @@ -0,0 +1,13 @@ +--- +tags: + - Hammer +authors: + - jin456 +resource: Hammer +search: + boost: 2 +--- + +--8<-- "docs/snippets/htar.md" + +[**Back to the Storage section**](../storage.md) diff --git a/docs/userguides/hammer/storage/long_term_storage.md b/docs/userguides/hammer/storage/long_term_storage.md new file mode 100644 index 00000000..5ad4c526 --- /dev/null +++ b/docs/userguides/hammer/storage/long_term_storage.md @@ -0,0 +1,13 @@ +--- +tags: + - Hammer +authors: + - jin456 +resource: Hammer +search: + boost: 2 +--- + +--8<-- "docs/snippets/long_term_storage.md" + +[**Back to the Storage section**](../storage.md) diff --git a/docs/userguides/hammer/storage/recover.md b/docs/userguides/hammer/storage/recover.md new file mode 100644 index 00000000..4b2b7096 --- /dev/null +++ b/docs/userguides/hammer/storage/recover.md @@ -0,0 +1,31 @@ +--- +tags: + - Hammer +authors: + - jin456 +resource: Hammer +search: + boost: 2 +--- + +# Lost File Recovery + +Hammer is protected against accidental file deletion through a series of snapshots taken every night just after midnight. Each snapshot provides the state of your files at the time the snapshot was taken. It does so by storing only the files which have changed between snapshots. A file that has not changed between snapshots is only stored once but will appear in every snapshot. This is an efficient method of providing snapshots because the snapshot system does not have to store multiple copies of every file. + +These snapshots are kept for a limited time at various intervals. RCAC keeps nightly snapshots for 7 days, weekly snapshots for 4 weeks, and monthly snapshots for 3 months. This means you will find snapshots from the last 7 nights, the last 4 Sundays, and the last 3 first of the months. Files are available going back between two and three months, depending on how long ago the last first of the month was. Snapshots beyond this are not kept. + +**Only files which have been saved during an overnight snapshot are recoverable.** If you lose a file the same day you created it, the file is **not** recoverable because the snapshot system has not had a chance to save the file. + +**Snapshots are not a substitute for regular backups.** It is the responsibility of the researchers to back up any important data to the [Fortress Archive](https://www.rcac.purdue.edu/storage/fortress). Hammer **does** protect against hardware failures or physical disasters through other means however these other means are also **not** substitutes for backups. + +!!! Warning + Files in scratch directories are not recoverable. Files in scratch directories are not backed up. If you accidentally delete a file, a disk crashes, or old files are purged, they cannot be restored. + +Hammer offers several ways for researchers to access snapshots of their files. + +- [flost](recover/flost.md) +- [Manual Browsing](recover/manual.md) +- [Windows](recover/windows.md) +- [Mac OS X](recover/mac.md) + +[**Back to the Storage section**](../storage.md) diff --git a/docs/userguides/hammer/storage/recover/flost.md b/docs/userguides/hammer/storage/recover/flost.md new file mode 100644 index 00000000..858c6215 --- /dev/null +++ b/docs/userguides/hammer/storage/recover/flost.md @@ -0,0 +1,13 @@ +--- +tags: + - Hammer +authors: + - jin456 +resource: Hammer +search: + boost: 2 +--- +{% set resource = "hammer" %} +{{ recover_flost_snippet(resource) }} + +[**Back to the Lost File Recovery section**](../recover.md) diff --git a/docs/userguides/hammer/storage/recover/mac.md b/docs/userguides/hammer/storage/recover/mac.md new file mode 100644 index 00000000..70a2aee2 --- /dev/null +++ b/docs/userguides/hammer/storage/recover/mac.md @@ -0,0 +1,13 @@ +--- +tags: + - Hammer +authors: + - jin456 +resource: Hammer +search: + boost: 2 +--- +{% set resource = "hammer" %} +{{ recover_mac_snippet(resource) }} + +[**Back to the Lost File Recovery section**](../recover.md) diff --git a/docs/userguides/hammer/storage/recover/manual.md b/docs/userguides/hammer/storage/recover/manual.md new file mode 100644 index 00000000..ecfc4192 --- /dev/null +++ b/docs/userguides/hammer/storage/recover/manual.md @@ -0,0 +1,13 @@ +--- +tags: + - Hammer +authors: + - jin456 +resource: Hammer +search: + boost: 2 +--- +{% set resource = "hammer" %} +{{ recover_manual_snippet(resource) }} + +[**Back to the Lost File Recovery section**](../recover.md) diff --git a/docs/userguides/hammer/storage/recover/windows.md b/docs/userguides/hammer/storage/recover/windows.md new file mode 100644 index 00000000..25a1b7f7 --- /dev/null +++ b/docs/userguides/hammer/storage/recover/windows.md @@ -0,0 +1,13 @@ +--- +tags: + - Hammer +authors: + - jin456 +resource: Hammer +search: + boost: 2 +--- +{% set resource = "hammer" %} +{{ recover_windows_snippet(resource) }} + +[**Back to the Lost File Recovery section**](../recover.md) diff --git a/docs/userguides/hammer/storage/scp.md b/docs/userguides/hammer/storage/scp.md new file mode 100644 index 00000000..028e0076 --- /dev/null +++ b/docs/userguides/hammer/storage/scp.md @@ -0,0 +1,13 @@ +--- +tags: + - Hammer +authors: + - jin456 +resource: Hammer +search: + boost: 2 +--- + +--8<-- "docs/snippets/scp.md" + +[**Back to the Storage section**](../storage.md) diff --git a/docs/userguides/hammer/storage/scratch_space.md b/docs/userguides/hammer/storage/scratch_space.md new file mode 100644 index 00000000..c49dfea5 --- /dev/null +++ b/docs/userguides/hammer/storage/scratch_space.md @@ -0,0 +1,14 @@ +--- +tags: + - Hammer +authors: + - jin456 +resource: Hammer +search: + boost: 2 +--- +{% set resource = "hammer" %} +{{ scratch_space(resource) }} + + +[**Back to the Storage section**](../storage.md) diff --git a/docs/userguides/hammer/storage/sharing.md b/docs/userguides/hammer/storage/sharing.md new file mode 100644 index 00000000..a68fbf45 --- /dev/null +++ b/docs/userguides/hammer/storage/sharing.md @@ -0,0 +1,13 @@ +--- +tags: + - Hammer +authors: + - jin456 +resource: Hammer +search: + boost: 2 +--- + +--8<-- "docs/snippets/sharing.md" + +[**Back to the Storage section**](../storage.md) diff --git a/docs/userguides/hammer/storage/storage_quota.md b/docs/userguides/hammer/storage/storage_quota.md new file mode 100644 index 00000000..d77267b3 --- /dev/null +++ b/docs/userguides/hammer/storage/storage_quota.md @@ -0,0 +1,13 @@ +--- +tags: + - Hammer +authors: + - jin456 +resource: Hammer +search: + boost: 2 +--- +{% set resource = "hammer" %} +{{ storage_quota(resource) }} + +[**Back to the Storage section**](../storage.md) diff --git a/docs/userguides/hammer/storage/tmp_directory.md b/docs/userguides/hammer/storage/tmp_directory.md new file mode 100644 index 00000000..844a8b52 --- /dev/null +++ b/docs/userguides/hammer/storage/tmp_directory.md @@ -0,0 +1,13 @@ +--- +tags: + - Hammer +authors: + - jin456 +resource: Hammer +search: + boost: 2 +--- + +--8<-- "docs/snippets/tmp_directory.md" + +[**Back to the Storage section**](../storage.md) diff --git a/docs/userguides/hammer/storage/windows_network_drive.md b/docs/userguides/hammer/storage/windows_network_drive.md new file mode 100644 index 00000000..18cb6953 --- /dev/null +++ b/docs/userguides/hammer/storage/windows_network_drive.md @@ -0,0 +1,13 @@ +--- +tags: + - Hammer +authors: + - jin456 +resource: Hammer +search: + boost: 2 +--- + +--8<-- "docs/snippets/windows_network_drive.md" + +[**Back to the Storage section**](../storage.md) diff --git a/mkdocs.yml b/mkdocs.yml index 0ad4a467..ceeaee25 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -181,7 +181,16 @@ nav: - R Shiny: userguides/geddes/examples/r-shiny.md - Troubleshooting: userguides/geddes/troubleshooting.md - Negishi: https://www.rcac.purdue.edu/knowledge/negishi - - Hammer: https://www.rcac.purdue.edu/knowledge/hammer + - Hammer: + - userguides/hammer/index.md + - Hammer Overview: userguides/hammer/overview.md + - Accounts: userguides/hammer/accounts.md + - Software: userguides/hammer/software.md + - Running Jobs: userguides/hammer/run_jobs/index.md + - File Storage and Transfer: userguides/hammer/storage.md + - Compiling Source Code: userguides/hammer/compile.md + - Jupyter Hub: userguides/hammer/jupyter.md + - Frequently Asked Questions: userguides/hammer/faqs.md - Rossmann: https://www.rcac.purdue.edu/knowledge/rossmann - Weber: https://www.rcac.purdue.edu/knowledge/weber - Storage User Guides: From b83651fb3238929b0e7f60ce0b4484fab115dd35 Mon Sep 17 00:00:00 2001 From: Guangzhen Jin Date: Thu, 25 Jun 2026 15:02:47 -0400 Subject: [PATCH 2/8] Fix Hammer UG content vs source-of-truth comparison MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - accounts.md: remove Gateway/OnDemand section (Hammer has no Gateway); keep ThinLinc + SSH only, macro calls now pass literal "hammer" arg - overview.md: add Ethernet network info (10/25 Gbps, not Infiniband), fix intro (not a Community Cluster), replace GCC/OpenMPI line with rcac module default, remove extraneous compiler section - faqs.md: add 8-core max job size and exclusive-node note to "How is Hammer different"; fix NUMA node name hammer-a001 → hammer-a003; fix "interactive PBS job" → "interactive SLURM job" - queues.md: add HTC note (max 8 cores, exclusive node allocation) --- docs/userguides/hammer/accounts.md | 53 ++++++++++++++++--- docs/userguides/hammer/faqs.md | 11 ++-- docs/userguides/hammer/index.md | 12 ++--- docs/userguides/hammer/overview.md | 21 ++++---- .../hammer/run_jobs/slurm/queues.md | 3 ++ 5 files changed, 68 insertions(+), 32 deletions(-) diff --git a/docs/userguides/hammer/accounts.md b/docs/userguides/hammer/accounts.md index 192d2035..38a331ed 100644 --- a/docs/userguides/hammer/accounts.md +++ b/docs/userguides/hammer/accounts.md @@ -7,17 +7,56 @@ resource: Hammer search: boost: 2 --- -{% set resource = "hammer" %} -{{ accounts_md_snippet(resource) }} + +# Accounts on Hammer + +### Obtaining an Account + +To obtain an account, you must be part of a research group which has purchased access to Hammer. Refer to the [Accounts / Access](https://www.rcac.purdue.edu/account/request) page for more details on how to request access. + +!!! note + External (non-Purdue) collaborators can be granted access to Hammer, provided the collaborator has a valid Purdue career account. If the collaborator does not have a Purdue career account, a current Purdue faculty or staff member must file a [Request for Privileges (R4P)](https://www.purdue.edu/apps/account/r4p) to have the career account created. + +## Logging In To Hammer + +### Thinlinc + +One can login to the Hammer front-end with a full desktop environment via the [ThinLinc web client](https://desktop.hammer.rcac.purdue.edu). + +!!! important + Your full password is needed to trigger the MFA notification that is sent to your phone for approval. + +{{ thinlinc_snippet("hammer") }} + +### SSH + +*Secure Shell* or *SSH* is a way of establishing a secure connection between two computers. It uses public-key cryptography to authenticate the user with the remote computer and to establish a secure connection. Its usual function involves logging in to a remote machine and executing commands. There are many SSH clients available for all operating systems. + +!!! note + Hammer supports either Purdue's MFA two-factor authentication or SSH keys. + +#### SSH Client Software + +Linux / Solaris / AIX / HP-UX / Unix: + +- The `ssh` command is pre-installed. Log in using `ssh username@hammer.rcac.purdue.edu` from a terminal. + +Microsoft Windows: + +- [MobaXterm](https://mobaxterm.mobatek.net/download.html) is a small, easy to use, full-featured SSH client. It includes X11 support for remote displays, SFTP capabilities, and limited SSH authentication forwarding for keys. + +Mac OS X: + +- The `ssh` command is pre-installed. You may start a local terminal window from "Applications->Utilities". Log in by typing the command `ssh username@hammer.rcac.purdue.edu`. + +!!! important + When prompted to enter a password, enter your Purdue career account password. Your MFA app will then receive a notification to approve the login. ## SSH Keys -{{ ssh_keys_snippet(resource) }} +{{ ssh_keys_snippet("hammer") }} ## SSH X11 Forwarding -{{ ssh_x11_snippet(resource) }} - -## Thinlinc -{{ thinlinc_snippet(resource) }} +{{ ssh_x11_snippet("hammer") }} ## Purchasing Nodes diff --git a/docs/userguides/hammer/faqs.md b/docs/userguides/hammer/faqs.md index 728b880d..e3d0249b 100644 --- a/docs/userguides/hammer/faqs.md +++ b/docs/userguides/hammer/faqs.md @@ -22,9 +22,10 @@ Your subscription in the Hammer mailing list is tied to your account on Hammer. Hammer differs from the other Community Clusters in several significant aspects: -* Hammer is optimized for loosely-coupled, high-throughput computing (HTC), rather than tightly-coupled parallel applications. This makes it ideal for workloads consisting of many independent, single-node jobs. +* Hammer is optimized for loosely-coupled, high-throughput computing (HTC), rather than tightly-coupled parallel applications. This makes it ideal for workloads consisting of many independent, single-node jobs. The **maximum job size is 8 processor cores**. +* By default, SLURM jobs on Hammer receive exclusive access to compute nodes. Jobs requiring fewer than a full node's cores still occupy the entire node unless node sharing is explicitly requested. * Hammer home directories are entirely separate from other Community Clusters home directories. There is no automatic copying or synchronization between the two. At their discretion, users can copy parts or all of another Community Cluster home directory into Hammer. [Instructions are provided](storage.md#file-transfer). -* Hammer uses a named queue (mylab) system where each research partner gets a dedicated queue. All users also have access to the `standby` queue for lower-priority work and the `debug` queue for short interactive debugging sessions. +* Hammer uses a named queue system where each research partner gets a dedicated queue. All users also have access to the `standby` queue for lower-priority work and the `debug` queue for short interactive debugging sessions. * Users of `hsi` and `htar` commands may encounter Fortress keytab- and authentication-related error messages due to the dedicated nature of Hammer home directories. A [temporary workaround is provided](#hsihtar-unable-to-authenticate-user-with-remote-gateway-error-2-or-9) while a permanent solution is being developed. ### Do I need to do anything to my firewall to access Hammer? @@ -211,7 +212,7 @@ This can happen due to multiple reasons: `ssh -Y -l username hostname` -3. Reason: If you are trying to open a graphical window within an interactive PBS job, make sure you are using the `-X` option with `qsub` after following the previous step(s) for connecting to the front-end. Please see the example in the [Interactive Jobs guide](run_jobs/examples/slurm/interactive.md). +3. Reason: If you are trying to open a graphical window within an interactive SLURM job, make sure you are using the `--x11` option with `srun` or `salloc` after following the previous step(s) for connecting to the front-end. Please see the example in the [Interactive Jobs guide](run_jobs/examples/slurm/interactive.md). 4. Reason: If none of the above apply, make sure that you are [within quota of your home directory](#usrbinxauth-error-in-locking-authority-file). ### bash: command not found @@ -257,13 +258,13 @@ or * You can learn about processor layout on Hammer nodes using the following command: ``` - hammer-a001:~$ lstopo-no-graphics + hammer-a003:~$ lstopo-no-graphics ``` * For detailed IO connectivity: ``` - hammer-a001:~$ lstopo-no-graphics --physical --whole-io + hammer-a003:~$ lstopo-no-graphics --physical --whole-io ``` * Please note that NUMA information is useful for advanced MPI/OpenMP optimizations. For most users, using default NUMA settings in MPI or OpenMP would give you the best performance. diff --git a/docs/userguides/hammer/index.md b/docs/userguides/hammer/index.md index f463f828..a6870ccb 100644 --- a/docs/userguides/hammer/index.md +++ b/docs/userguides/hammer/index.md @@ -10,15 +10,9 @@ search: # Hammer User Guide -
-
- Gateway (Open OnDemand) - Launch -
-
- Remote Desktop (ThinLinc) - Launch -
+
+ Remote Desktop (ThinLinc) + Launch
Hammer is optimized for Purdue's communities utilizing loosely-coupled, high-throughput computing. diff --git a/docs/userguides/hammer/overview.md b/docs/userguides/hammer/overview.md index d3e5b639..6ee8192f 100644 --- a/docs/userguides/hammer/overview.md +++ b/docs/userguides/hammer/overview.md @@ -10,31 +10,30 @@ search: # Hammer Overview -Hammer is a Community Cluster optimized for Purdue's communities utilizing loosely-coupled, high-throughput computing. Hammer consists of multiple sub-clusters of Dell compute nodes with varying processor and memory configurations to support a wide range of research workloads. +Hammer is optimized for Purdue's communities utilizing loosely-coupled, high-throughput computing. Hammer was established in April 2015 through a partnership with HP and Intel and has been expanded annually, with each year's nodes kept in production for five years. ## Hammer Specifications +All Hammer compute nodes are connected via 10 Gbps or 25 Gbps Ethernet interconnects. + Hammer Front-Ends | Front-Ends | Number of Nodes | Processors per Node | Cores per Node | Memory per Node | Retires in | | --- | --- | --- | --- | --- | --- | -| | 2 | Two Haswell @ 2.60GHz | 20 | 64 GB | 2020 | +| | 2 | Two Haswell CPUs @ 2.60GHz | 20 | 64 GB | 2020 | Hammer Sub-Clusters | Sub-Cluster | Number of Nodes | Processors per Node | Cores per Node | Memory per Node | Retires in | | --- | --- | --- | --- | --- | --- | -| A | 198 | Two Haswell @ 2.60GHz | 20 | 64 GB | 2020 | -| B | 40 | Two Haswell @ 2.60GHz | 40 | 128 GB | 2021 | -| C | 27 | Two Sky Lake @ 2.60GHz | 48 | 192 GB | 2022 | -| D | 18 | Two Sky Lake @ 2.60GHz | 48 | 192 GB | 2023 | -| E | 15 | Two Xeon Gold @ 2.60GHz | 48 | 96 GB | 2024 | +| A | 198 | Two Haswell CPUs @ 2.60GHz | 20 | 64 GB | 2020 | +| B | 40 | Two Haswell CPUs @ 2.60GHz | 40 | 128 GB | 2021 | +| C | 27 | Two Sky Lake CPUs @ 2.60GHz | 48 | 192 GB | 2022 | +| D | 18 | Two Sky Lake CPUs @ 2.60GHz | 48 | 192 GB | 2023 | +| E | 15 | Two Intel Xeon Gold CPUs @ 2.60GHz | 48 | 96 GB | 2024 | Hammer nodes run Rocky Linux 8 and use Slurm (Simple Linux Utility for Resource Management) as the batch scheduler for resource and job management. The application of operating system patches occurs as security needs dictate. All nodes allow for unlimited stack usage, as well as unlimited core dump size (though disk space and server quotas may still be a limiting factor). -On Hammer, the following set of compiler and message-passing library for parallel code are recommended: - -* GCC -* OpenMPI +By default, the `rcac` module is loaded on login, which provides a standard set of compilers and message-passing libraries. Use `module list` to see currently loaded modules. [**Back to Hammer User Guide**](index.md) diff --git a/docs/userguides/hammer/run_jobs/slurm/queues.md b/docs/userguides/hammer/run_jobs/slurm/queues.md index 2be8b259..1e576a34 100644 --- a/docs/userguides/hammer/run_jobs/slurm/queues.md +++ b/docs/userguides/hammer/run_jobs/slurm/queues.md @@ -12,6 +12,9 @@ search: On Hammer, jobs are submitted to named queues (also called accounts). Each research partner who has purchased access to Hammer receives a dedicated queue named after their research group. In addition, all users have access to the `standby` and `debug` queues. +!!! note + Hammer is optimized for **high-throughput computing (HTC)**. The maximum job size is **8 processor cores**. By default, SLURM jobs on Hammer have exclusive access to compute nodes — a job requesting fewer than a full node's cores still occupies the entire node. + ## Named (mylab) Queues Each research partner on Hammer has a dedicated queue named after their research group (e.g., `mylab`). These queues provide priority access to the resources purchased by that group. From fbdff19e51b014c34b4a432acb6e98090e365bb1 Mon Sep 17 00:00:00 2001 From: Guangzhen Jin Date: Tue, 30 Jun 2026 14:53:40 -0400 Subject: [PATCH 3/8] Strict source comparison fixes for Hammer UG - submit_script.md: use -A (short flag) to match source; add basic single-node example, GPU example; fix inline #SBATCH directives; add note about 20 cores/node and exclusive node access - jupyter.md: fix kernel install to use ipython kernel install (source command); remove sections not in source (Running Notebooks, Scratch Space, Limitations); rewrite 5-step env creation to match source - overview.md: carry through user's edits (expansion history, purchase link, "Most Hammer nodes" wording) --- docs/userguides/hammer/jupyter.md | 63 ++++++------------- docs/userguides/hammer/overview.md | 6 +- .../hammer/run_jobs/slurm/submit_script.md | 43 ++++++------- 3 files changed, 42 insertions(+), 70 deletions(-) diff --git a/docs/userguides/hammer/jupyter.md b/docs/userguides/hammer/jupyter.md index 322e4661..2c7869b9 100644 --- a/docs/userguides/hammer/jupyter.md +++ b/docs/userguides/hammer/jupyter.md @@ -14,65 +14,40 @@ Hammer provides a JupyterHub instance at [https://notebook.hammer.rcac.purdue.ed ## What is Jupyter Hub -Jupyter (an acronym meaning Julia, Python and R) is a web-based interactive environment. Notebooks organize code, documentation, and results into a single document. JupyterHub provides a multi-user server that manages and proxies multiple instances of the single-user Jupyter notebook server. +Jupyter is an acronym meaning Julia, Python and R. Jupyter supports many programming languages and allows you to organize projects in notebooks that contain code, explanations, and results, with various export formatting options. ## Getting Started -Navigate to [https://notebook.hammer.rcac.purdue.edu](https://notebook.hammer.rcac.purdue.edu) and log in with your Purdue career account credentials. After logging in, you will see your home directory in the file browser on the left side. You can create new notebooks using the "New" dropdown, which supports Bash, R, and Python kernels. +Navigate to [https://notebook.hammer.rcac.purdue.edu](https://notebook.hammer.rcac.purdue.edu) and log in with your Purdue career account credentials. After logging in, you will see your home directory in the file browser. To create a new notebook, click the **New** dropdown menu and select from the available kernels: Bash, R, or Python. ## Create Your Own Environment You can create custom conda environments and register them as Jupyter kernels so that your notebooks use the packages you need. -### Step 1: Create a conda environment +1. Load the anaconda module: -```bash -$ module load anaconda -$ conda create -n myenv python=3.10 -$ conda activate myenv -``` + ```bash + $ module load anaconda + ``` -### Step 2: Install ipykernel in your environment +2. Create a conda environment with your required packages: -```bash -$ conda install ipykernel -$ python -m ipykernel install --user --name myenv --display-name "Python (myenv)" -``` + ```bash + $ conda create -n MyEnvName python=3.10 numpy scipy + ``` -### Step 3: Install your desired packages +3. Activate the environment: -```bash -$ conda install numpy scipy matplotlib -# or use pip -$ pip install -``` + ```bash + $ conda activate MyEnvName + ``` -### Step 4: Reload JupyterHub +4. Install the environment as a Jupyter kernel: -After installing the kernel, reload the JupyterHub page. Your new environment will appear in the kernel selector when creating or switching kernels in a notebook. + ```bash + $ ipython kernel install --user --name MyEnvName --display-name "descriptive name" + ``` -## Running Notebooks - -Once logged in, you can: - -* Create new notebooks from the Launcher or File menu -* Upload existing notebooks using the upload button in the file browser -* Run cells interactively using `Shift+Enter` or the Run menu -* Open a terminal from the Launcher to run shell commands - -## Accessing Scratch Space - -Your scratch directory is available at `/scratch/hammer/$USER`. You can access it from within a notebook using Python: - -```python -import os -scratch = os.environ.get('RCAC_SCRATCH', f'/scratch/hammer/{os.environ["USER"]}') -print(scratch) -``` - -## Limitations - -* JupyterHub on Hammer runs on the front-end login nodes. Do not run long, memory-intensive, or CPU-heavy computations directly in notebooks on the front-end. Use the notebook interface to submit jobs to the scheduler instead. -* For heavy computational workloads, consider submitting batch jobs via the [Running Jobs](run_jobs/index.md) section. +5. Reload the Jupyter dashboard. Your new environment will appear in the kernel selector when creating or switching kernels in a notebook. You can also switch kernels at any time from the **Kernel** menu. [**Back to Hammer User Guide**](index.md) diff --git a/docs/userguides/hammer/overview.md b/docs/userguides/hammer/overview.md index 6ee8192f..38fef41a 100644 --- a/docs/userguides/hammer/overview.md +++ b/docs/userguides/hammer/overview.md @@ -10,11 +10,13 @@ search: # Hammer Overview -Hammer is optimized for Purdue's communities utilizing loosely-coupled, high-throughput computing. Hammer was established in April 2015 through a partnership with HP and Intel and has been expanded annually, with each year's nodes kept in production for five years. +Hammer is optimized for Purdue's communities utilizing loosely-coupled, high-throughput computing. Hammer was established in April 2015 through a partnership with HP and Intel and has been expanded annually, with each year's nodes kept in production for five years. Hammer was expanded again in late 2016. Hammer will be expanded annually, with each year's purchase of nodes to remain in production for 5 years from their initial purchase. + +To purchase access to Hammer today, go to the [Cluster Access Purchase](https://www.rcac.purdue.edu/purchase) page. Please subscribe to our Community Cluster Program Mailing List to stay informed on the latest purchasing developments or contact us via email at [rcac-cluster-purchase@lists.purdue.edu](mailto:rcac-cluster-purchase@lists.purdue.edu) if you have any questions. ## Hammer Specifications -All Hammer compute nodes are connected via 10 Gbps or 25 Gbps Ethernet interconnects. +Most Hammer nodes consist of identical hardware. All Hammer compute nodes are connected via 10 Gbps or 25 Gbps Ethernet interconnects. Hammer Front-Ends diff --git a/docs/userguides/hammer/run_jobs/slurm/submit_script.md b/docs/userguides/hammer/run_jobs/slurm/submit_script.md index 337dc183..581d0a31 100644 --- a/docs/userguides/hammer/run_jobs/slurm/submit_script.md +++ b/docs/userguides/hammer/run_jobs/slurm/submit_script.md @@ -12,38 +12,29 @@ search: Once you have a [job submission file](creating_the_submission_script.md), you may submit this script to SLURM using the `sbatch` command. SLURM will find, or wait for, available resources matching your request and run your job there. -On Hammer, you specify the queue (account) using the `-A` or `--account=` option. To check the queues available to you, use the `slist` command. For a description of Hammer's queues, visit [Hammer Queues](queues.md). +On Hammer, you specify the queue (account) using the `-A` option. To check the queues available to you, use the `slist` command. For a description of Hammer's queues, visit [Hammer Queues](queues.md). -## Named Queue +!!! note + Each Hammer compute node has 20 processor cores. SLURM jobs on Hammer receive exclusive access to compute nodes by default. -To submit a job to your research group's named queue: +To submit a job to one compute node: -```bash -$ sbatch --account=myqueuename myjobsubmissionfile ``` - -## Standby Queue - -To submit a job to the standby queue (available to all users, lower priority, max 4 hours): - -```bash -$ sbatch --account=standby myjobsubmissionfile +$ sbatch --nodes=1 myjobsubmissionfile ``` -## Debug Queue +To submit a job to the standby queue: -To submit a short debugging job to the debug queue (max 2 nodes, max 30 minutes): - -```bash -$ sbatch --account=debug --nodes=1 myjobsubmissionfile +``` +$ sbatch --nodes=1 -A standby myjobsubmissionfile ``` ## General Information By default, each job receives 30 minutes of *wall time*, or clock time. If you know that your job will not need more than a certain amount of time to run, request less than the maximum wall time, as this may allow your job to run sooner. To request 1 hour and 30 minutes of wall time: -```bash -$ sbatch -t 01:30:00 --account=myqueuename myjobsubmissionfile +``` +$ sbatch -t 1:30:00 --nodes=1 -A standby myjobsubmissionfile ``` The `--nodes=` or `-N` value indicates how many compute nodes you would like for your job, and `--ntasks=` or `-n` value indicates the number of tasks you want to run. @@ -52,8 +43,14 @@ In some cases, you may want to request multiple nodes. To utilize multiple nodes To request 2 compute nodes: -```bash -$ sbatch -t 01:30:00 -N 2 -n 16 --account=myqueuename myjobsubmissionfile +``` +$ sbatch --nodes=2 myjobsubmissionfile +``` + +To request GPU resources: + +``` +$ sbatch --nodes=1 --ntasks=4 --gpus-per-node=1 myjobsubmissionfile ``` If more convenient, you may also specify any command line options to `sbatch` from within your job submission file, using a special form of comment: @@ -62,13 +59,11 @@ If more convenient, you may also specify any command line options to `sbatch` fr #!/bin/sh -l # FILENAME: myjobsubmissionfile -#SBATCH --account=myqueuename +#SBATCH -A myqueuename #SBATCH --nodes=1 -#SBATCH --ntasks=1 #SBATCH --time=1:30:00 #SBATCH --job-name myjobname -# Print the hostname of the compute node on which this job is running. /bin/hostname ``` From 3057a721b8467577426bc081a82b157ca463490a Mon Sep 17 00:00:00 2001 From: Guangzhen Jin Date: Thu, 2 Jul 2026 10:46:57 -0400 Subject: [PATCH 4/8] Init hammer ug. --- docs/assets/images/userguides/secdiagram.png | Bin 0 -> 39981 bytes docs/userguides/hammer/compile.md | 2 +- docs/userguides/hammer/faqs.md | 295 +++++------------- docs/userguides/hammer/index.md | 5 +- docs/userguides/hammer/jupyter.md | 53 ---- docs/userguides/hammer/overview.md | 12 +- .../hammer/run_jobs/examples/apps.md | 7 +- .../run_jobs/examples/apps/apptainer.md | 13 + docs/userguides/hammer/run_jobs/index.md | 3 +- .../hammer/run_jobs/slurm/queues.md | 53 +--- docs/userguides/hammer/storage/ftp_sftp.md | 2 +- docs/userguides/hammer/storage/hsi.md | 2 +- docs/userguides/hammer/storage/htar.md | 2 +- docs/userguides/hammer/storage/scp.md | 2 +- docs/userguides/hammer/storage/sharing.md | 2 +- .../hammer/storage/windows_network_drive.md | 2 +- mkdocs.yml | 5 +- 17 files changed, 111 insertions(+), 349 deletions(-) create mode 100644 docs/assets/images/userguides/secdiagram.png delete mode 100644 docs/userguides/hammer/jupyter.md create mode 100644 docs/userguides/hammer/run_jobs/examples/apps/apptainer.md diff --git a/docs/assets/images/userguides/secdiagram.png b/docs/assets/images/userguides/secdiagram.png new file mode 100644 index 0000000000000000000000000000000000000000..06dc886a4da562ce77ecac77469831a90347f646 GIT binary patch literal 39981 zcmY(rWmp`+wl<2pySoPs?(XgoTmr$}-QC@t;1)Ev6I=qp-JRfmo9uJ;`R)&%d6=2* zuC89SYOPl$LP1O#jv1Ozk%1`K#dOG-HccmZ`%krV-`nIt#@ z{(-fZ(slv?fl>JQ1C3?@IRya`0+ALIR&xhE&4J8TA6ywWkl`sowKzIIS2MOqPDOer z36u(&)l-p?=A2!tPM&30n++$qaJ%Sn=es{&Yad&0H^1x0+EQEpr0Rj5&Wi>*`-3^QJD?C`BKM4s8%*V@SoIf+cEb{++19<50s|9KAu7zsph^Z-2Ax%g(B;9EL}&rh$D_*ux0DX2pLKGoV+ zhauIE=^0C73PZ%#D79W1*KYV-t$DH88)QD2o5SN$aT3$zurt&jhODQ^MEjp3F+Pqw zc7b8hj}p4ZVpy{c(RiWH1n2vV&y7 zaJYd&i{ge;>z!E~Hp?w;c8L_y-^6p4n;ushJ$~5EOc#jiG=4+nb+tC0{((ebdwL*v8Mpu*7pDt`}M;F2Fo1?iT>xoQu z=|rlvPOCpT?QUMTr{(Zz|9M~IICVNn6swJ_1j1x>;HpQ>ue0aJ&K_wHT z0lvA~>Y!fp2#J|>+SiTBGuL)CRO{W6;cm3(&D>{#u; zFijN!?jhBaP$b%o424=D`}zI?y4=R&?=G!ojc!3-h}ZqO&FC|5l^^C)cV~ZU#eOBe zygr@OmVHs%;&$3cP+>^a`nL+=NP(yv&QFc>#tuNh{Y=2;e0VhX9aI>F#dx6m{cYue zO}Ev)KNM-O?`D?RuhDi+g5T5TIZl#BekcyV#bpfZ&6n4+Q87TpJ0DM1tgc^yEht2cmn+dt#%VmEKuNxYx-`k7ocZCEfCc-!(ezGq8 zwV!30?il2rH`g3Gh`Cq{Dy9pkOYbk&$X9X1f?aMGx%F(Y{}!sDFhuZH-KH#RVh18< zG(R?juKWEuzZwy(YKi4sv(2*eQC}E5w!ljk@?}(|K_Y7o{tBU<3^hNFUx&oDE%lP)9F83mKgmvUAUm2{Mldd zz!r&!BkNIM;j`J?Jb7xe$`+nF*Vc_{c-^h-e)HUVzX(|#N5c)88+pTKvG6NxOin~Zh${ei~2;I}mgLCpKxGr!ke$4l)n2Rio^I>on@W}7?fCAlldPcRQ8 zU`GC1hG`@lcN@({X$gP)OtzA!n;jk?pFysCZkG4o!qbM+D?{~eD~)j`+F(xn{rJ3~ z`@@DS3}Uus3MHv~N-pAPys`6?0epHbIDb6tcN`m2IqDebT-x z{`@;5N&Iy@9aWI{@$dd%efb;2dWqJr69~}QAGrKx(Mb?bGZpHUo7_A;kCfwuvB|(L z5Co$YwdH>MmlB?r(VKp~+YPxUP#vEhavh3@&)q*wf{$*!&FNsPNOCGyfD%m*;*yxc z>+Xfy8y1@YRyTZ`0VA(q6|G0ezE|-QpIru{%Nqy&T|Q){P&@`Jrig22IF6V}zvJPe zo0!_wS|ffpP?}VG)%|L*N(w;}BFhbe_>^*X7e&}Vx6Ngx8S|5d^=hkf9wI&&Wq&O} zlO7jcNzeU;U$do_8Z}olM>JO75#R;FXU%Y#~{!^ph>GI6scS(Hl_jB^I`2!l`pRs^W zsdN%hKj|b&*(4s9pKKO51E>W9k%ai%uBTiMruExA>4}L70zO00(n(ab)O+Vp!ErE? zLGbFbW2p@IoR$=8>;o*wv+g2i->0%4iyikgs=v6r9e*lfO+lfSgTsKJj}j{Lzzacc z^*O;Z7bVH(a@`&{=l8nY8-GMi6^HBNS|rn3ZVZ9L8qa1SU%vTmF-swpt|YBgCD%NS z^%I6b(6>YTdLNrn7lz@pN{P&Ee==>x=dW-KU>yzXvtLIq&4Okc8!hHspZBvC>rJ4^ znZUkan2!qUGB?O#2@8>Lisnja6TCFo5ldQ6<#JxMZ1`#ZL`Dq$3Vtc7o5f)#A)L!D zo65A@EPk56sz{_Q@Z~NggvaPljb5elkNrHqH{8hNo)e+|(ir?CDtWv}Q>l44(4o%K zJU=39HhXJ9^E+$h2?+ciLsPYW-=v|KpajhZ98{Pbn|f$u0vv9$@jq+r#II*9b$vEC z%0Xr{b_*5r-ccFRfE#)ezi>| z9`#pqV(OxDGKWRcH8JW;`Ax60s|>ZY_(jzOCv<)yQo zsv!&{eh#H9)+AFlu=TEdOM64M)RWryu8?!AGLtw$3s%r?FQgLqaFv6G#X+>*z0fo#}~iLUg&U9uBh~@=GkH5TJ0ZH z`OzEBCmeR`9sap^J8^`9>t#lwRGUNcnFQR9!Tpi-dz@4-`tE1TP1P%n4lGO^7!klu zEMN1s;nQN&A4-z(8={;MTRPFSh6Ke@q6qQi50lQ%n_^;Lm?#k>HM*q+v+6Hxj(>N5 z=?QDkKG1`)S7;h^Sudql>xg0pBvQ%vv8f3Z-l1C%}yVdZpcW$`lh zmz%vnAtC5@S0$A|_H`_k5{>ASc7v&(ZddehGGCjMYL1T{3T$r@l_F!jprHREwsDnS z-$kHMnKYN>d}WLKQiI~jLJrSYneRx1hppb27qe){yCEWn!C$_G{?+rkYqZ!{2fvlU zG{Oe0dNG^Ke*8KdTk!QzwDUI-q7s^`5yt2SVSwVvyr`YyTOVZUE+H>aA?tD(6^gN2 z%^PP9Gl4LIZwfMhrDQhV9qBgcqE~O&{e@1Q$!WD;Z0Vln>2h)o)OBp1G-^(#>rG+_ zxXFT%3rrsf>D- z2H0X8-=;xO?5j5GP*lYo@vR|5Y!J5RjeUL*yQWFOH<(VIYL>v|GS}#KdR}dd6EHR~ z-0fHE9MZ2l=vZIo7u=Hv%Ox|Dt{5j#DP({CI*Ob~DeCBcJf0C0hOGF0^gaHz2!)S~ zGVK;MKX1C9*X?{<<|>TX&veWEWPxESK8M+;kH_WMd%e-3P%NTMS$R97q67<`tVcJt z2OJuLShHdvuP`1Kr%9?rCS{*VOQ}vMV1FVDy>ML-=ek|q9$;Lppo&|x|BgjDZHzQS8B}^_5lfutG`U68n4j8?Dc%@r_1Y;6+v{N zxs|687)C2FfmHafuP2 zfZYj-MZJA_yuMpNW=4644zM5rC8z6DbE9}}-dqF8fs})7w|lxf;rw=KILln|T`oa{ zQsIijKM^u_=l8E9gujt1B%o`+#%psoSdmVvS{hBnpJ^YP&29dAlN4#{Jyeefubdjf zL+&ghba%R>jxbbALK&19#{hxo9-Q`|f?|Zwu#yPG^j1Qb~DA2(wAlV%cPgPAw;- zst|?KsxA3fGF>2)=W*a_rW>{&&GLG@sv)?G+L3G%EGCq>`Iy&RCgISmZhKBe@ zhai=rtkACCP<$f*0pz7HH4vk-MTebco3+RlRUXA#Ja%VUgKormyXk!6!AM}C4D2}h z>KOPu5A?nt(mU>r4!X+@;|tmn7(qu^D48vB7Q2;(9zA)jnSdI_>%fMW zU|7pqJ2Y{$B44@*mkHO`VyDZ6w`iB$5&ISQ)r0L9jsufJyYAOeD*UC;8a1#Q5`W0O z0B~p}Dcl2Y&Cg$05u?h^R$A_l*V;9wa^?CPk?t@AZX3>2*oMQ22sxvJ6U<5IdOAt1 zI%2XoAb*o3>UFvzO2a}Ctk{r67K%rXXY%8}LK<_V+B@qFO4mhTlfyo-nicqX-b?FO>t33H=iTWqX@?@om*X`F{Va7X-e&>zUE*H=!F z^VD|*-&7p;#@jsRs3<6lk5*ck7l+vg(6z(cN<#t4wE0M)kEh*K(!4_M#4?ff|>|^QnSGXH)(ByDR zrB~|>;}|N9DsUl~FKWuu${BJX-Fk_8W}6{t=@lYz*3G(DYZ{v}TSiBStWN!U z)E5E?hwUnb$szL!jbK=blNUovfw}hm0@hEJ+ z`!%-`*)%G<%MJ%#+STp2X<@_UcpewaQcfys^rl`{8(TVRoEG=;VLNN)&&TwKX{fBz zu*#gziY**^;GSlT^b}H1pM<&tugEAPp>kNJ{pBTJ*?^{#j`BdTO1~*Gr}DS)_RI`N z;U`Xo-8VFWtc0eM4X|yYpC!sDkhT5QHBnG1nH3>_oA@K^8PiFV2nN+)Z0Z%!X)v%9 zH$`hE7~ZHvg88cI1>Sbi$Mue0PiF#)zRx+8uh;sjM@NeHK3r5Q+;eown8*ci%(~0A zy=A;*=?^{}P`2zh7cxs@l|xCuW`HgDF`_r;>SXqe&3+l^kbAz_nj}R zPBhvoVJ(9gK;Owbm4_qz+fCj1UhBC_?1}!;qOTLJuxT*4f+L|XXS1<-47Z+|-*9;I zzEIfE%`nhyMreY+!H#IxaQOXA+NOBf*xIew=UQv+7$TG4J^j6ubI`t0KgL*q4IWKt zQ@(@HExI7`yT$Z_Wi>-67eFD~yL6!m zkqu9#3JG=ra3uR3eA5XYpXJ60on~fJCLr65Z1#?l2jW*I7lMoSj3nc5qY>7E^W7>M z8lGC;zsVsYMFI6;ct4JfII&if(W%Gr?{c@(MHcG^`_)%f(=>zIJ zubV^Vxw<&==uUC?_?1F&cz7jJ3N6SFy!eeO-Uef-<8ioLH6srg3GZrvdOlV|l`*(1 z&Zbi~<^9phpAEmBh3Zp2IA%Q@zn)Pda2^B%7AP@~o7ek|A}!b*8^;vyJA+NoZwIl2 zNG_l?sboh02DI4?U_Dm`e5+1jp6@L9CJC&5sXMuC{k%#|u~rbJjV zxqOMF)wivV1^_1wUtWiwNPwPK)Rt-@-yzs@2A}QQ9W+Eq#GNO{n?6B-61e(tQ7apVm6vs{fY<>V4AlmInIhe{VXN5dtQB2}#npuHH z>ctw*i^GF_E>IMF{k?mf+*c09SycAutc=o68zJfU91|0Oh|lKVG9*IW%qzV;@UXHc z1^Ti;uhW%%ljrk9TfKlwxoHF;RQ^K<$;%`I$5Q((5CJl6a`W*#BEkD(izC;yi z5k#_b?&z5U@C}{ST&cYIRBjBsJyL0y1<5Q1xSeu=vG{oK57S9L`^}z+B&vi^!c78> zv7>7M$~s6@RofrW8N;3RH>_FlyZp)zr)(Zl zJ&jg1H0g)q-ejlI&JZ5ERUyIe5T`?jk~l#PN%*Zn-QgCC6<1&cS{hqsEv`8{rrd6C ze3I)sG+4ec>yV0P9*ze?^-RN*$GT{jd|+f-mwfvwMaZQ7mgELq-n`9r#6W8kYR7oo zEDA@0q`7Yz*=)12&COCKP$3!#MN8d?Vz@Syk)TSYIFzM5U!iU!z%>BvYBaY$A&EpR z;TOQ{-?k(WTI9sFB-ZxBBy8;xmHcwBFJOp4riH{d@hE&DJ#fKW_i+l#wM6N zquUUa4s(D=3;?+?TEd!aptU!}@5dB!;yDio=#*wPNVbeb!_F7ml1!8?8;2OaBRMp} znRgxD(1dd3mAGB357=7+?JDT%Ua!rI>kW;r!Y?#RE>`V&u~zEgN}h!|d(uTuCo~k^ zP8Ve~7)%JUK2*9o*^;h65dC@!x@-OwdSqfAHrG=vB;Prt;aL5$Om@rxTP)| zcPD?Y#+Xnw2?QL2bsk`2FKG2UxKeW^NP|(K-E~_70EoL%iVIc^|Bmmzv0T+JlRHTe zDUsjhF9r2b`3;TgY_YV{Rv)C^e#rH~m0yvqMF^Y_10AW@XQeR2XQz{vFQQa*_Ow6i3G8T;d3lu`~B%-sgWex_&F&S>PjC3p;x{CJefNk=dnDHY|w7L@gCkFkE`l zFe=U^8=U#|a1)>7J=4X%ZlXLep2e#vnCKsd3PTtgB+B$sp`mB_WBbZJNVNGUna1rK zM#Dt%>^dYU1!6Y=mw)$UmG+McN1TxQ!5x(rf}x?$NVvDRR)4tS5ZO6Sm^Cbp%bE}T zUP~HDmAQsvvJ=QzX~+r8_Jt&J*t8okh<(%P)GPcs3O1jkLe_FSy|@|f^uCaK$iw7Y zF%P<*E~Hejtmpz*U{a-k(|P;btC293_xtM^uN#*gDDnt^)V2X=EE=RLLOt9P-c(oJfTn z4hDdQT2;v8YXjPpL$~M%d84~wWA@ond3?*&IwSB6u)JTj(8v|01a$}}(NYl8EfEdizcut$l0l9}AVL)BtAO_IKZfzo_^|9wPl>EQM)mGfI=OxSeX>U#ECN zmlOs`4uQ;h{7EbcEwBtPicY@@=X*P@2_IJJvCv7MShBW;6MnII)@(2=I!-$jGEp=; zR3}nf-vBH+m&`gwP!4Sa=g&`(IPL~K3X~gt=Nv&p&O~cp6<`7(8!J zEsCL0rIJeJHLLYw%0I7Pq0$-VM`A+qXTN?PO1`5;5Ta1WrdJD3I^mAF2%}Zq9*EfS z6UvW~zpB(gtd}|G^FZ-3)ClYeot0wtU2O&U#s2Ue7@T%WIZkIRw9TO+(J-Vk%@;kl z#VXNgHmSuVm|!P?rGqjS%d=LVa}t;!s&p$Hqu3Pz*KG)6^PiAaWxU65<)60_wwU2C z>C?GQBo;Eu=ZdA{nG2jk`HL%39s6j&Ub|jXmDi;@y4{Nmg(aM#rEvpAr*nhE&n~*( zyZqjL(-8z{ASi}B6YSHepmtPYp)o;Ep@#h4`CZYhGhr;(4Zj~i=#6u)G+Us@#|O;_j(2@gFR%HJg(lwj)fK zBBjdz$vdjzgm4VGs*nqnXkfIUL7n}qX@rD6JMGK)R*R-9kpbfqhy^NAfpyU0$MsO5 z?=9;^%1Dm3*)8mf%O9gR!U8oH(CV`;3bq&SaYLQvc;VS>*OD3o1Q0zkFyX=dGIpZh zu6Q8i?#76|ZG@weFD~}2S4%gG3b@2*NuSjHhn@vWls@|xXs6~*W=1dH#0O+l#~pDP z)2Y;n{^~YBRq_6IFZe8T6=OwA%kqzibw>bgq4%^;QSK0f?bvqmCib=AW@aus%K$I| zm-XxAgqY8cDuwCVvESj~=e}7 z&|$`&_WMb6cljKQXE*^}5z^C2i`~X@la)ih*4h*kpsR@gY-8!~vj#5+Q4~e z+HKbWMCsCJy+{&ywMc8tHe9s-zkNXs1|SWFDtq*YWZA6Ci?F>9ClaB;@5{$}MU%vJoYK8!a{+ z{f>29C^2Xw1fCr1?xJE?hl=BC<5G9+Nl)JY8M@g)3%Q#SX@*o5A8T4P6k!PFy>t12?13&5)mXB> z9a&F8uzIBiA-ALHQo~nFFbiw!FsuH=TtUBFUw|u=rZCrawv%ub`&wfd;=&qcF?0XW zs!}4CK`I&w@aQE9Im`Mk4FKsEOUT;?(XLWed<6&!QV9aaL}Cpd)F#YHYDy0rHEi}2 z1-AZlWwn8~*sQd)Ytb7Zk{tl5r&v68I`heF#{EQ7B8i?DgyEmJCr0pJS}fJ8zp(SL zsD2I%77l`*6Om(6DU~Y7tl)u$p6f5HNCzTyE-MBN4AbmhDwoe=6yWpA?6;PiEL{$# zL0=oMjn8J-R7!F`n>uBv0CP<^h=?%!cW=zzF z4xa7T^LZu_3m^@!atyHdP(DR2clq$5StwMxr3;Zkf}(@TrqbhbTPBOL`a$utP3q18 zv}YCv!|?8BsmzA32OA~5Jx8Q%>Xc7E!p~mjHHUUAMYEY{ncZPp6Si>pEitZZsNhd# zu6Bm@MpI;maljY(2?V@xh60t-b;~+YaSkB>TAe)l3PLdqk?=|U`L5IR-t2v>qs=J? zyHa)<6kVNX9pe(Hj8xm+%iCjsM}ul7_;siX zGp)YdVi&jEm!i?1&}j3=7GNr1Fb`*IOs}-?9;^vYYYe)(Rya2XfB?a{{R~Pvgw^fQ z>(4k%|Na>wfXZhWLOcp1gWZdRg8-o%kSv9|u*XzLoCoibtQZ@$7!@jykzxz8BH9Iz z1UC_`N&|K6%%ZSL{vcGGwJ8xK9L9q|7!tsDg+42zWr{$;t2__2WTSk+)X0`1l#XZ6 z;lN3d&*BuNW^V|>KKZ?=&d}C@0~&h!OSSY;a;jj;Ffy6e$qd64C`#a(rJ=uMU1KxW z-SGLIE*A8M0Rk(!Olzidk@IhO1au-?yOzRq1n0%pZH}zwFMrl1xQWVZH~R>%$($BBYA>?mC@MGDgruSj=UN)gBf_W2)Duw(It zzk}EYhP80D;8PgvmTKax3)Fe@wQ)}bYorXvt8J{hsO$ade0A^+T17r4lta*{{?t9K z>9Q?3EJ(Qe+hP&xe(ydHUwBl29*heaGH5S6fvof8`QpH@K+ogq&-KB#lXU!P+4WWr z^etjK9KCQrSCvl&(h}e^1?b}Ba8Z%#nwV`e*;tH+#CpS~ND+?Ze;tPH>M{FuL3$vm zIt4n9aSj3uD791@g+o5f%dlFXfJ-c1(LyYIY&EVf7#PSi*ikD&n)MguI53$~*3T7W z%f^fIET*K1Xwh?RQG+~HlQ^)oAa(`XC}xlvg+DE6B!34$5xSJ74o|Zu#8_Q%oez$X zZF3=J#z8;%Jf8s_M-_+&fJb@ZW*=z>P#Bbw{(9s1a~<+B;|ai*9i8S=Rx40Enw#Rg zp~-y|D^h733|8NPY=94~FC(fGW)MUw8dhkX}!qU6m z=uk9VaqTVszh&}?3yB^KDjb0$e)70=bsM5BxJ;>qVUzjsjj3>m(JqHB(}I!9kW}RS zD%2nz@UgaYg?wn{3Q1x}`94SMV4`R%qJ6w9P;OPlfw` z@`8NOhI8;Hb2I^t(JX*IkbrEHF|^<4D;h0OToDO@NGy#=c;!o!lhKp;CuEC$Qf_89 znl+luJ%pNV@^rosa2`P+6!mwcnZO}867C@aFw;|(1RP-!1o9rNbX7p=#pO$YU(URW zK)N;olTSF5VI-8ob-+CmG6s^A9rW6mjH?uY#suRJ)OfRq5TLap`IaekQe4xo>YgW< zLzS7-F|ec%$p%b%IIj5Okr*>A5MX=UUFWlq-@|#}@kMD=H)H^btRx_%^OB>GK!NFp zspG`ggh&_J5urlh6qRyg1$#haU+_<%!PgBMaLU&?nr-`0kD{6}BnjND5J}Z%f(I9e zGN0r$Iv6dufJIv_=0OkeG)BGAeJ5QQ>sO}!Ef1OOIa)cDB@d+7 zifI9`Z?W}qX!ln& zPec^Z;KZ^H9i{ zJy;Spzhl%+Z3e5kV>ozj?KGvyPq~BU4I@mNQ0s?W4xgvUJU=A15+AVGiqS;&6J)^` zdw>Wuuy*mn((?FOylN2_jS6XZk?}bZTRB9K40WDT3k0OlY1j`O_3?~ zvw_(faa}@3wwQ%}$+uYVXahU^oAQak$MNFr6>e_~n@QjM|EDH)@O;0X61>>xCicw; zs=B0_oVl*lsP3bks59!{?2@({tr^{Igvs96n@Ad-nwomRo6P0?Q{~~bYUZ8HNa%NZ z(RUyS%jJW3!4@A}W^$EC8HPl-4MYF;GugHC@532DRYWD9s|%FJvGOblVqg@EK(-p1 z!(JC|-8;3*wm)5IL0%6xX&RBOj7XD3VJ7QoL&(NJ#ujjxrTE!+mC)XQ;~HCH11OD{ zxqRK`sP@{y1E?8vLcQJyeg$0jsYs6}WE+3K-C$SO_u z!97jC1w9{%!9QL2q+WqBoNz)w`a;%K&nyu;*RQiW2sPyKh5I=mii zHZ-n7e~2Thm)G-YGWYfOJUC3cWF|ZP)jTJwUGB0<0DVp%li2;HP4t*%;?#)^^pBXE zyQHmQQv%P?s`>z|gM1He@Y!rUy+k(E{u_h$Pkw2bl1jDe<%X|g$N~@kCU)H8kXf|R z#ZU-1)3+zJ+`kGl^EO5?KVe*mlsLkI;eqaZEdn5O7TIIblzjtU*W>LR3i75-oT9(U zKup+Ns5^s7J|wF9Y%k?TLap7}Q+LZxvo8*Unl;0E?U|XZ)vDAT4kRnnSC_=|aYTcY z{oh&~YV9`OS6URmd#u&(>;%K!R$mLXQY#itW?UD0Tz{trOy)L6*^M7ir$WNQC3UnB$d>TMW#%%0sdKx;n!L@Arv zVSiPK7LP#0wSju7>?>yxG0%}j`*dM05^C8}G_apv!K45(HeIf_ z_h2k7&R&R?QXd5b6sfUKuVJCWaKj8as^Nh7iomkAD&asVyXsn{^hiqKb;Jl{e(LP? zIb_}*CRS78XUG-^Ef-WVyx>IUe6>!C7%X~Wj|6KWirOlakq;KJL@7{rZv3=a0Wgip zJV84<(_?0@57A8kAT4e+RpLa0HTP%YYlXI~)u~hy|H7m{{Wr-v2TS01mOFrgt}KCk zu2?=wUOII=!=;|aiU?ON9hsP~?qKvxy6-fv$atnL{yysNjO9~-P~>*}A^`jz^-+?* zKwyIMFnfb*DzVCV3X?3t0K#}BRsxtsX0e@YjOW?xYXTZ*Vm|kLC*@Kk*^eEthhfEd zDPmM5X7pjNN{|iDU0cFsVm3x9nTmchx|n2I)TB@hCXLBJBhGjrTo?x_^EU7Lbf^%f zh;XAk)#0h z6WvpvB=t z5zQ)4X+S(_wzk}4G8}#M_x2ALe1OR4`@r3qayWV-vvY{NkqHCXxqtVTnxMOVe|#4fvM) z-0Nk%GDYerZ4>N;i0KdzKFbA@)o-dKP`!b4iE+0u5A~blaEJOgB#o!bro>5vj){Sk zx(?w)^F_BzTX(Q01RI7;!^_lbw2Y{U=88@4S>9Zln4QV8Y1X?M?p7snt zLkIf9g1Sj_$<4bDGcYQ(brdno!u>N|T#84j#w@!W*Tv3$Gn|_FDUZL4o1GN+iF}|X zj+no11FG4I%FC~TrXG6l@D#vP!9Lh$|M&#=3t4L;N(SY3tKMNGTVa64gT;9kO|MF9^VPu+)a1SYfG;#%tlXW5n7!0M}H&ca#-0fO) zGt$Q&ov`(>SZe{m-1D7;SFDh5uPwNI*j*j zssluX@Kh4l*H)n>UBD@aOuS_4R{bIFw`#Z+uunu!_{TYO*?3{$$xLC?w%?6N- zOKu71m;MiW`wutek^n&>FBmhQ;APxiGoG<>KAjHecKamZr~?UFzg0Jyg~Ib+gA9`d zP}MW}w#~Br*C0dpVUS7TBz68jgUp9sLI1_E#NyxiKi*eIK?&`rvlBV|ueA^8!i~5( z9`o4rP<#EN%ZO4}@l!ou{8H!b@-uKRP+Qk<2`V<%`E|iY9oBiOj-ZQd93|iX|H74Bd%50V`Cg z|7X%74wyS&l*<;-Y;w9>q*cdnjwSrGKc-oWRjd1_%H*DJ>4#W2N|)(v==UkT4u=zk z?yVj5QQ!XITS5+vkg(|Yt*42VPYZTS9Zq%;B9Ca)a!SpvJHYW?g08b7z~h6-0n_d$9t5)ZA~kjK+X16jxm`EwrB>-qJh6RxJr}9kN%he*D({5If7YEj|K|gl+lXWeFmM|lNpnNbU0vjeWb#wk6!Yh zc~Ft0&i%L*D3hjt?@FVSr!qHl+f7=pcKN?h)T)omjZuD}`S|ST>cLj(fVOjTW7n@JcJD<%b4FDZ3_K-0p{l6px zSh7O9!9A1N7-FoM4t&-EWR;3HWLLrwsk6U#4H*Mk%%3@kYf zm`^+?zqmW>48%r!rLjy-{*_da`74!{Kd$altI=4m87<|c+h$J z84;o(BcV%Cf-tDK!-SYEQFy%BMlBL3(TyOZgg?+c>vpkLES5@8!|^q~PRxkQ;}dpC zq!IQ;oUT8sbasDV7T5ABTM_Ya(idn%>__54JLTRq3I79m>_7SGKN(O29$3&K@E+xV zT2Q9xLu{L4XFy+R0EYYJNC)f-fiavDJTZ8SQ8aK2h~ggF2gyU?jLIzQDVl~?uJ?cJ zQwQ2dV))x6Q}o}&VD(|QY+4Uf`p@D7CeED_NZIatRw)u61;M|WTmbd}B&$y30*U`U z*QE>~RJ$DgLl^V!YX1T;1PH_hPhydnf5&{J&=eqlZKc$z<5B*L8{mDdk2|Tl6$r-r zZ<70j3PjTX!@AGQfBEF$2t`mk(DvsN|AF{GK;?nzeFqZ=HzP zjOrC?XUold_Zw2M+OQwzz2OK>jhEO2y1q{uRa~7OGR>v;>rq5Z#ZmWS9-OhY^4aBq z)Ru`r&aEW7boo;QK*+GkKLH&|d==nk07^YoXk4gFaWwajdE$#`{=G*E0bH`tb0QOv z!xC{j76bL_95vD>z;=s6=$}Y&=I(yYh73wQ4+EAeW(cVB8D~F4{sKNvRlqlYk0b!f z76+Czit7(kvpbY|`5-z>hx?T=AZUt8qhI>zVpSj#BJg}OhdcKj;F6ZmU1SMACXNH* zp)pA9j;Z@a<)>T*;Bfr;H44kfxdgTNE;MDJ&ptSXlhPR~ya!Ot00z-88W%v)bR_sx z<{5)08io)-$m{BlyBqNFFnPiJUT-zKeP2;roR5Fg%AjZxI&2U8iYE=Srz2gL4Bmoq zkSYI(+g8)Sz}0LFbq zVVWC;#|Z5o=Jm(S@&ouW1mUz=-{-Xd{Vf1Som4hyw1?F-_?7DFF>(U_MvVT@4`g z*}#Z>A4rQJbhKQeA?QC?U@Sl3b;Wf+?SCZ@d%O#Ps*AyK_`Dndaksu@|s7wG?nwjy(;t2nk1EhLY2KlU|M&-TakA zjbmQ7xBDjudMuUpTK&7iU?gS~3aQA*JPGB$M$fo+#w-43<~B6USjO;CT=IY_bx3 z*bJJcmZd>~5Wx(X{3QT8|5UBx5p2J;4v$SL(t4>NRi#yL90&nx&(>ks3r77*% zEQ!{!1wtj;w{%1iTWY~vSmOkjNHfz*d`zU?p+IscPWK16LejsuFXqubUBrh{f%a~S}>i= z&H&#A@)s^ZF}uxE?|p3NcH}*=%>c_D)C>Ih0e_I#v+Eh3Y68=5GK4Uuj=gxh9YDbo z>ob&CBFnPYhjDYlsE0-=gYkD>Dk4zmkknt2cGp!Nj}r+B*7_Z3=rIt;KOJ88j9B2p z6<2zP2rA-313>bN!~LYu3kDgTKm_yr_y|Pt$&}#x%i}>FzY<~19O{B+J{fU&Uj}7e zoDj)`Ga+bbGtf6SPZ(YMz2o`)n8y+ws=AlKdYgnvs+;$UI~R<0+jEx zYxsYDYr>MbOb-Bc-wY=PR+{a?A~+Y^A4gNbAmJV33s`0`kT`Nm9Rr=)fn6ep$id&J zup&V|@3UVo*zeX-$@5l#ps!BP4X*IQco9UCz6e3Px)Z?*PZVaGuqU^mkpJLSe z8H|swiRR^lrx3G$8!#jnmmWnWpZUA?3wy2PeA55N-Cw^|`Mlo)DBa!N-CY9GjdV$O zN_R+iH%LpDqymC;gGh&TcZVQ|XYlp@e6Mr z_`0~4uz`ae57Y_V5$|6ZfKJYB*n=M^cYX^)fs93m$MJmDRPizxzI9HyA`gZ8O)g?`h3G#BG!OH=Cx>j=~Bx7%KY-O%Y6S0 z+KF>`!^R0^u8Kjcck&^|^~k+bqN=qq0j=97SFkL&msAn`B$};z4UpVrud_nR7<~3M zK+XH>dkJL=xnGbxm|q3fu(Rc^*Y+7Kv(mmnFTNQoJ^;B4!=`^6Pa{TY?mEB%O`2Q zht{lJ!<5esQ&a@L4PKQ~$Ja3m1INZLNyPUcK)*2ddG^QCW2b^c_0dU%@BiFi9&m*( zBXE6)Kv6PZSIIJoxPin^IrYndUvP z{4kS<$K|HOR!U<~+mM)5asvw>VDoNNIf8WDY1e&7zs06xtLv@Zr^^ot(o()pKOfZGw+<*!#|0oI8(-O!b?t=~556XOWEo?JH|+`6J&g1>ydJ;FpR z)`+ZjTm>L-YPj4{$2|%BmX^`<*L+XyEOOYSdrj$?#g*3HBKWUnbWHDlM zQp?6uVF}tqCXgmeN+FPU0t6hSn4=6@-ithqCKt>0Kq~$ablczhg6u6=qn5tC#lGJR z2n*@`0=F)lW9>A>Lf_px6$MikqJnC)<8AJJ337OM2yF^AO5}PnQURFI`PcIgj&@Q$ETElX*nNUvUDJtnK z^f=BQguk~7#ikrN&ei;c$fso~=!z<_Fd2R1oixkfOt8)e78 zG>F0;?v)>|7l1{^D~Y{Az^>S&mT9(Ia=l7p1l!yS^JSkYz<7q{RVENH393E$JC?<1 z-mo=*>lB-2}z}m_{uMW$#}Br-<6(_A>dLyJe@Yxy|Z@Ppog7hx3_S zdj!Ad^CGVy=SQ=&d!A`-9?q0iaw%po1WV&@E;g72Jg#~f0|x~FlmdmXnm{tp_nNd# zzp!L%XG*epT&RMLzWLGr-GGKE1!(^cpPbIBkcT&EeULMU_$Wa~KZ5H$RY<0eD{L6p zv_MjBOJ3$GhS{VA3tah~H?Zk_vrETnj*v!3Abp)s*y{gqg+b2d@7>}`tQmZhMQ9`K zjJjv2dFRG+XZ)jpTE=m<^)lgfxsqQ>06L>B>o@gCc{c_S@{u4Lovgfny61E|1r1h{ ztd|MAIY^GpX%RewcMO$bl>K?ZR{kd60=DkM2+xlmG2p@wR80X_*5CP1v#s~1Pw%6P zSXA$^c_S_1%9>)1Gx9Dh6nc8{c>>Q}IDvVV3%&A(es{ETWEBW`;qW(e9}lLAL2!Hm z>=(KSXf1@1Eb$_}$n35Hz+XsW(xM}QgPi5L+#1x{{Ixx>ooh|irkhbA7J))oIBMMN zcE^HpQ`i$4E$f_e^$sc?CD#BLGJsh1DT{mIl+zS1{Sg&Mazfb#SN{ASSpfj90Yefr z?IPfiuxP%;%*pSxW9xJ5+>zLXCOLEh8*lB;!=;1=puf}yJq%ogF2>&99%;o$4<$|ufrtqLy~yunCy*JW zdJl4Ox>M>=-`H|bEcEJ~H~o^SD5v>*#tLiF{`5CJmCC@JAV}EF*NlA7rMFU()2)1+ z#!EFjO(M-oh3$Z>tGnzeAqeiD>mBC2$j4HJ;o;TFQy~{So;bfu`q%YUwPmbRE zMh$whqDoF$go6wxdT=hh-~nJg8iO*z;EYIbt}{Oj@Td9+(1n1-x6KxVjC)Kstu@U_ z@b1U+sL7%~vClX7ApZ39MUF2S{KyyC*0wFi)DBEy$)4{o78m=JuuFRU_zVqKUt3@S z79q2M2toZY1kA5q=Lx+zCpB@v#(_*w0SBh7fZskMflhKT4xvx2v`Ne&jJBbxLeSSe z@~g8ZWxD8d)@O%)x#YJkw&q9JZh?W-C)E|ET*kT**KcS#k&krv^z@<(4cY zE?z+wjIv5lyZgi3hf}Ib;Fl;2o4A|d3V5CnK(}>>p~MDb>?(%wF80=)^ki?gnDCZ@&@E#9wTxj(*ciIfPh3Cl%7HSEX!55q>ru#i4ye0oj5? zl9!B1bh6kVQkdpZ-@0XQDwO>TfY22!HOfL~;Vs+(gqmM;QMqF}L*G_jH*NXSUh zD3>p$ibN;A1LUO1*o}-0rlffc6%XA_AgFo*l8J|L`QlmfuepCGtqM~e(Z6TS{M0DT zDI8r;rY`KYU%_b@Jcz(`Z6n4W5h1AS_U#_1H86J^6=T zG3e30EbDP;&Kq%7Tn70R3IcH6#zdLyRma0q_xp7!=@ddBDEa#)uDs?>XqT&|Jb#S@`byXL{5YpB#F1Q7dZi;#Jc{_~ypAe*Z=lPi^zyUkWa)RJNrewkP0d z<&dbklue^aQD_`Cc%=3OgBa)P7kL;z3sti z=Vbz*3%hih|2+^zTkrW5pEbY>qUCmp}c4p&WG84ZJp_*4);&5`5!vp)`q( zFRepAn3YwZ%x6yEha=r2qV*NgfgS$rO{I3PR!{R zg49MKokI0nr^22==-G;AkF-Kf1_})>y(x{-_nZEUs9zOOLXZKWimP^HA^PT7adb1N z+Zq~XhK)#*?@nqha9YHnG|IVlwOXP?G{yLpVe5@tv)1JF#Z3LGpcE>%aPwxX+fWU8 zb1^bIc|XfRek%A%25~XKx0-saM^ie7;Y|(QOr$5FQjaOdDGa#RC)^xIR?X7s^*}FA za)Z=j8ipg!K3K%C5gkU~#GhpXW%3X^oEJ)!>`~qE*7nbgekrdK+%kr4L&KJP1+r{H zwxlOSpb_3;7{ zc8pOrZ5?Me6_TPyGtJuq37UlTi}V+oVu|c13-s#iG38v&jW1Y+-lZ|P$)%Z0hD3F$ zqfzJ!!w$A1dGzS;lO|ARZ%+xCd8@u6x@Fh**rsRr6L4cy-T)p%dM|z0{P8iCdr*di zJg_aPPwu~^*}ayl+?o1ps(?a7GG<++>52|@4BbI655o|tqm88^x@zI=dWrRJ@c23gemzbPgf9~|>?B?G8J>{qE z84NdTERlcZc@ovyTM@j6ETJwDw*@z8N6dRuWr1?Q0OKgRjAUcsUMkd0ZO*kK(KI7o z%3sDA;iI5m2&498!d|JcPt|O;@Yq|S+gW^>t>S1$=LHJD4MsZMBR5*<>8r&iMni`t z+)5x}W~wAcqhL=B z+~WKr)V$DiOzVmkeC=!9Tk2+Y+XJ}L*Rlo)_A1LX_Ic?hO_ieqf@PLrmGl3@dl47` zx{Sa`Bch4+zJ1BH(P4>8d-;NpB%-9YM?@<4hi2b|u9Aqm+f-J6bKYvHInDn}E;oe0 z4yrXl%ciV9fa?lH7qx$nq_5TCaC){K{J1@`72PN$^RH z4iE*+uyIV8oFg)yxR?(eX&_3J_%lkqjJ+2G`rccs6hYN>7ze2)c=$==e2vlt+`J1D9_J0U` zFh_*g#Tb8BpH?PfS@~&r}Te-9>#BG`%r2C;HnCp)VTE+wpsYxVe2qb#b zoPM{-l-jvCH2+|ARLCDrv8Z92Nx!zVVG_t+Ppm1vp|O@_wti(=TA_06Z2wK&n*c~` zTk1!K5$X@Q)2S4*w+TX$GT?R#%lnL8_9n`iLMof!?3Q*uF0!6i)C41O{ng%w6)o zPhDIPW`$%hYQTwZ1AuaVUn{~yT0KpN3Zxu#I<;-nUOepp$n`1n8NfF6yD*}meR3}O zkOhER5)bgUwrWwv1;v;2fTD2?k0Qo};7hMQ=)4Dd%X^d>9sn4@6!a7oyYl!C7oTv` zBK2)@*S#fTLhu%ZGUFjKV<$M@KH(3Z6N~J9kB#Q?J&95>DxD4X|D`od34s+R%){wn z@u1cl&kroR^$?=lKu7x7Zcd^^t=^=E0-uQxCKv((15p;DTdo-Zu3?-nRrrbQ_xr{c zz)kI5=SCp2vpbgAXMOVXb2V6^E(pOQHA5c?U#lw5iU9MHuZ1+HRspY@f`t-fi6}Z) z-D$zvz6_44;CFztXI!C5sY!pm|6}N#4u(Q<$^UhI&^aXq7MjkwAbei^cMI?|iw%;` zZu=9_I;uJisqW`Npx@UZg-1Y^7z*!YL-naM4x};u2NMB~V2AtRH1H|{I)2<&^7Q}4 z3dP3ti%Mv}JqW_&9niL#p8leqed&;DgfK7Oq7v-?hWo!!Ptp3a^c(EZ6o7`mWSYUB z)|d9MNzx+1LjIuQu$e5h7)ep1?+O#qZ=0oi`H~m{H3c6DB}xSjJwg}`6gbH!-qfTBfJ}_IijBMufTj+Q0M$113MfT0|^MUVvsSQ*#+QZCPk_gco+bSLH#x} zsY@P&p%4TcEk>?@^bWai^EyBr0t2S^MZ*;Kpu>QA;Rure+>iht{oJv*`3)G}{*VBZ z_TOYxB>op|L2H6lWyBl=BpzVpZvS8RvcDvv**h$4|4SEw&oM?{T0F`wR`t&v_9d(J z|6Nod3`j>708$YWUP#ao20#zGj6i0EZSEUL>3{^L;!w8{RNu%Vr z1z_6`Ks0D5pU9k-Of3rxq=wS_*YfDbIY_`6)%nUZ@Ad7O4nyrVEX)RO*_%9I0cu=Hy zg!sd8*bMG_Lg9PZMzdT11Pz?`Vlk;@I{hD_3V<#Jq?F8*Fl@YmD>0x0Sr(4SIX~XL zQwMdPf2q}A49XC2AJPUBP_t5fAd$SwVX2Xr&tZc!SJ=n(WU&GA8_K>4^eAr0J;3R$ z>kYxMw4eG2DQHtGw)8W^YHBnUN0e}uoPftQU z0r{fsOj*F~QM$;x3G=-l1uA`c<;mq45*xr4s=)tB9&|lAnJ_}}I2QTU{nmyAu#i+B zIP3)(o#d8NFwF)?1e`ZOZwOPd<0k{`kDKcQ7;=^giKMUi3=#HB_9yZbM2n`c6@6K| zx9w?r0LPUfsmL4XK;lNi=A=)J{VxYVwcekveFNBQH^$A$lH1Q_Tc+>eoC4t5j{<%S zLnG{62s!}CuV|Dcp0yi6Wx+fRq0xq=F}YPl;Z=X7H(c?d?uyGrj39*ETcj`=JDso5DNGiAFj6lYEKjM`kpWHiZ+aGLy1!S9c(e*IYUJo zO#lN`p*C85)`tl4z$Z?HG={j%WGd+ofd8}F?)C5+bbX{HteI1&t%Ox*AR5bHbw z@gHCWKCW=>RHcn0gVlp>3Zdbk5Z58~PHh$Q?-8aJ=to9JlBGyC7($n?>yiYP<)iO?fQ~i>qExHE6 zh!z^vc!?nYzs~`pRce$YoUgXGgr4>W7yIsvvZKH|guRJ=n~a9qgHkvygAqCz z$0iLG<^eLJ?8cqK+%O#+Ph3wLpn8nr*kxnM5bLbQpAq5rY}crrX6~a@NasuRTO4aB z<<2j5xoR8l3;ie}Xyf}_H4S4nC$Gt&R3dsowXV|0dMAStWwGv=XIAC>}%?E5QCwVN+_l!W6quj5*^fFXH*KH7s<>fr!*!Q zJ&Hzt&9T9b4=5kR%6I3ff{v}OBnU5cYIKXtbe}FOq27a_0hzl?VUOPFev8AA9eiJS zzXBlX5~|$=JA{je3trnQ-QU#N2kTw0IXmoS-VA_t_a~$Qs(P{cb@b)*gSuSM0JI%i zC$*^c`*;+1WHltsb@tWJoAKkLu@L)BOgG_C*(0+;F*fxkE9JpWK!qk+K*5n?Q;^w< zG=O;%bs5IOfx+_L#GZ)9Mit092Fa(p;V4BZyEC;a)oDAW)Vc6_oK;EJscE~Vr!WAA zz9PyM4vi#gBLgB7%O{&O${I_&P{MP)qo!2dG#*(aPA+r-ds139j9c0a4*M%`i%X$Z zyxNnC)50ufWhZVRCY6?+F7j!wssI)`YNCY6x41027;~#2BTuBt8azmyP>jvp+LXK6 zY>RC{BcB2@e+#kz{%`BM-2;4yA+0dW7@FY_W)6M_XPnq0dXxHp9q0eL*)^l8T zqg=1ZU5vVvX$Fe_`? zHT?mSbhzwqP{I4KW*Y9(BrJj7mx-3DoP}10b!?o0?Mzb;a7W0gz%SlH&)y|RQE?1X za&Z^J(sVuh-AX^Q#MmV;J|dfn4^#6ng4wY>GkGa>6|g&=jeTdxEE-khJgq8E=SZH`YAc!?6gnEZQk9PNKd=&`z;Oz?`*@VRhSYN>ny0n8Kh;Ojxh@jYnN@Hfb zF6v(|8P?+n1l!U}8$_bD>!F+A+g}F?LV<>7X3Y!g4uXURsa;tJN<7J| z%VeZuen)?c6lacnDiuCDikerUM_=Qrq#9$)-qV__D<R_E1zlG z!+pR2w$_x|4c5(O%$DmUqTMtpi*z9CQN;@SdoWvxjfG5LKaV2U!~pY+2Ai8Py&h5? zt_9%6X18DhlO5{$r;uXPnr%pBZ=32T=hgF>Fbp;#85Jld?z2dPq*5hTQn)2t6SO2e zH$p7=BC|wk>1}2gS!XsNfygoGu7e?F zrD9Y@(~7!9sII$=anZv}C8oO{q9{!vUT$G#g&W&%268FRg)&H(qSu{TC`~xmNn3=6 z#W&nrgpH;S$!U|w@q}7gw#8sFkDHFOWtk-@4sZ`HAqyV}DV$gtqdB0SpydjP#C?L> z7pE_CvMtlKF3N0@vBsi;R5owiVV+i@4Z;9BTX7VgILuLnh$0x}s<-HumC!_?uug=; z9jRm-07m>>&Pn)qHejngati} zNjT>Iv?SC~X$fM5TFpbN+y)1Ghda1xz)yukP(72t}uQXqJ!j zPZJE+S7wT?%u9#6l+(~9xW?fmTW4QyrLWztonbEQe+$+>Iz!YltW7}&c6`IpF#No3 zfzj^LpXH{D>bWpx&YGcvSO*w4?}bpSqg5e@Rg37Of$OS+u#t6$vFwZm1}kwL6K@9*x#&VMI`hnImI;uwhfktk!F}H z6g!#1Co@kn6JUB9k9&@X$06GsxD(+b9K`3O2zGchaKp?hGICGKEbR}#L3xn%eM&A- zh0k3Wf>H|{^B?XodkeojR30`+8jZiDME$*tgOzt+xYh&1#-aVbhG5WV0V6^VLO!4D z6JfTNumm#hhQ7JB%wTs6W?2Eu4LsLT8q2=ih+UXja%ANI@o!`(nrf|TJYzOU3*6h| zg>w7k2z{0c-JwPyOV&|V{3d8*0$(D3h%IL`43gdij^{~4#@wQa{-<8k3Wf9(xhZ*Y zw4({KrGwLO;oWvtEU;)tsx4G{J8IHPZKuXqlsnk_XY%^b;l;Nxa{OZhcjYv@`rP44 z-32adb1YLT^gC_Bb<9LmcoBK!YdQSIKxvwJi25W2q!2_VBz&p{2(eMw;EIETsDAE` z4J$mjXQQm^C@au$915>!IOX>AQhVgPNvq!(;`DljFhxQbLvb^Z@EDRj(&>!;s^sy% zt_e%q!n+h8f088+2xCMc6(d}~7{%ZYLflfu>s+~V#f-!Pu}^tYkYy+>Lf_6h&ZOca zk`#+O&0raobPNXr1+3PgPf>>foG60x{orZr=S0f7*t{NjcGPCIJ0DD^Num01@Nz)n zhagZq)G6DN0g|nMV(}Mef9UHfJb~8&G^UIverk&`rqf!fJQm!j_Kum9gpG)da=WFkaYlbf6gJ>3k>&YZl7-d9)YHaOy%l&xuV`q`334E0>@sS{?QXd7RBAppbLrB0KF4My z4N%079;9XEjU8Q|O(TFR9TO#EtqzD=?oz#)6z5eRI&v^3s z?u!X*#6kJ2Hf$@8HnIO-xejmTQQur!vLv4_|K-t@)#u$1;`vOLSll4Av8l!0Ar2nr zDbu8V4LU`_{NBkz-6ErtNQ{^*tO&USsT7qtj()WDR<;a?8dme_1k)AGaW>AoJaI3F z{9dD(p@Yr4Z#cFjDY(-D4rvV-j~&CCx^EeMB}kqBiVu1A*z^(?L716sq)MHPZzaxC zDn`zU(IjjTb(>Db)pCc(8_knd8UEwO&dYXx9h%`jGshYizVQtD{d!*JqV_1mHm7K2 zxQ{6t_lvL;SL}g7zqvzC$ww><6~UT(!tJ;b_unQk40^VnSxi~BS=}B zsD_YVBxf+<-gXEe!*QCx23k2#n>3O{_Nk7c-6ELMaU6L>{~4pjzh_P^8{MiWF_%W` z)9i0Ajy%vABraK=q-0#*B<9aBKdBz%uswMd${CD?&2gu0zVH#_QRXmCn0HTFDV~AY z4~LpA1BxV?+F!UDnISS;G7pKpLX^tl&4s`2)zSPRMD%SnCCiHfNS7S)n2Th7=nVtT zi|AO}wVr5ER=+@#A#4tC?u4=2)Y4KAI2PNmlQuoGY?3ivbjJT<%)P)8ld=$FRe(ZO zFB$v}>V$MM=4rBAiNQHW3;@HqqM4CaFlg*&CJ9$}e)gy8m!8d~0WUBG0+jBLLP
    l7NFc5d|H8tdX)(Zs;yi1W{3P6vmq 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 T^RRWfQ - ThinLinc Login Popup -

    - -Select "End existing session" and try "Connect" again. - -To permanently avoid screen lock issue, right click desktop and select `Applications`, then `settings`, and select `Screensaver`. - -

    - ThinLinc Screensaver -

    - -Select "Applications", then "settings", and select "Screensaver". - -Under **Screensaver**, turn off the `Enable Screensaver`, then under **Lock Screen**, turn off the `Enable Lock Screen`, and close the window. - -

    - ThinLinc Disable Screensaver -

    - -Under "Screensaver" tab, turn off the "Enable Screensaver" option. - -

    - ThinLinc Disable Lock Screen -

    - -Under "Lock Screen" tab, turn off the "Enable Lock Screen" option. - ### I worked on Hammer after I graduated/left Purdue, but can not access it anymore -#### Problem +**Problem** You have graduated or left Purdue but continue collaboration with your Purdue colleagues. You find that your access to Purdue resources has suddenly stopped and your password is no longer accepted. -#### Solution +**Solution** Access to all resources depends on having a valid Purdue Career Account. Expired Career Accounts are removed twice a year, during Spring and October breaks (more details at the [official page](https://www.purdue.edu/apps/account/IAMO/Purdue_CareerAccount_Expiration.jsp)). If your Career Account was purged due to expiration, you will not be be able to access the resources. @@ -194,48 +148,45 @@ After your R4P is completed and Career Account is restored, please note two addi ### cannot connect to X server / cannot open display -#### Problem +**Problem** You receive the following message after entering a command to bring up a graphical window `cannot connect to X server` `cannot open display` -#### Solution +**Solution** This can happen due to multiple reasons: 1. Reason: Your SSH client software does not support graphical display by itself (e.g. SecureCRT or PuTTY). - * Solution: Try using a client software like ThinLinc or MobaXterm as described in the [SSH X11 Forwarding guide](accounts.md#ssh-x11-forwarding). + * Solution: Try using a client software like ThinLinc or MobaXterm as described in the [SSH X11 Forwarding guide](accounts.md#ssh-x11-forwarding). 2. Reason: You did not enable X11 forwarding in your SSH connection. - - * Solution: If you are in a Windows environment, make sure that X11 forwarding is enabled in your connection settings (e.g. in MobaXterm or PuTTY). If you are in a Linux environment, try - + * Solution: If you are in a Windows environment, make sure that X11 forwarding is enabled in your connection settings (e.g. in MobaXterm or PuTTY). If you are in a Linux environment, try `ssh -Y -l username hostname` - 3. Reason: If you are trying to open a graphical window within an interactive SLURM job, make sure you are using the `--x11` option with `srun` or `salloc` after following the previous step(s) for connecting to the front-end. Please see the example in the [Interactive Jobs guide](run_jobs/examples/slurm/interactive.md). 4. Reason: If none of the above apply, make sure that you are [within quota of your home directory](#usrbinxauth-error-in-locking-authority-file). ### bash: command not found -#### Problem +**Problem** You receive the following message after typing a command `bash: command not found` -#### Solution +**Solution** This means the system doesn't know how to find your command. Typically, you need to load a module to do it. ### bash: module command not found -#### Problem +**Problem** You receive the following message after typing a command, e.g. module load intel `bash: module command not found` -#### Solution +**Solution** The system cannot find the module command. You need to source the modules.sh file as below @@ -245,74 +196,61 @@ or `#!/bin/bash -i` -### Close Firefox / Firefox is already running but not responding +### What is the "debug" queue? ---8<-- "docs/snippets/firefox_lock.md" +The `debug` queue allows you to quickly start small, short, interactive jobs in order to debug code, test programs, or test configurations. You are limited to one running job at a time in the queue, and you may run up to two compute nodes for 30 minutes. -### Jupyter: database is locked / can not load notebook format +### Can I extend the walltime on a job? ---8<-- "docs/snippets/jupyter_lock.md" +In some circumstances, yes. Walltime extensions must be requested of and completed by staff. Walltime extension requests will be considered on named (your advisor or research lab) queues. **`standby` or `debug` queue jobs cannot be extended.** -### How do I know Non-uniform Memory Access (NUMA) layout on Hammer? +Extension requests are at the discretion of staff based on factors such as any upcoming maintenance or resource availability. Extensions can be made past the normal maximum walltime on named queues but these jobs are subject to early termination should a conflicting maintenance downtime be scheduled. -* You can learn about processor layout on Hammer nodes using the following command: +Please be mindful of time remaining on your job when making requests and make requests at least 24 hours before the end of your job AND during business hours. We cannot guarantee jobs will be extended in time with less than 24 hours notice, after-hours, during weekends, or on a holiday. - ``` - hammer-a003:~$ lstopo-no-graphics - ``` +We ask that you make accurate walltime requests during job submissions. Accurate walltimes will allow the job scheduler to efficiently and quickly schedule jobs on the cluster. Please consider that extensions can impact scheduling efficiency for all users of the cluster. -* For detailed IO connectivity: +Requests can be made by [contacting support](mailto:rcac-help@purdue.edu). We ask that you: - ``` - hammer-a003:~$ lstopo-no-graphics --physical --whole-io - ``` +* Provide numerical job IDs, cluster name, and your desired extension amount. +* Provide at least 24 hours notice before job will end (more if request is made on a weekend or holiday). +* Consider making requests during business hours. We may not be able to respond in time to requests made after-hours, on a weekend, or on a holiday. -* Please note that NUMA information is useful for advanced MPI/OpenMP optimizations. For most users, using default NUMA settings in MPI or OpenMP would give you the best performance. +### How do I know Non-uniform Memory Access (NUMA) layout on Hammer? + +* You can learn about processor layout on Hammer nodes using the following command: + ```bash + hammer-f003:~$ lstopo-no-graphics + ``` +* For detailed IO connectivity: + ```bash + hammer-f003:~$ lstopo-no-graphics --physical --whole-io + ``` +* Please note that NUMA information is useful for advanced MPI/OpenMP/GPU optimizations. For most users, using default NUMA settings in MPI or OpenMP would give you the best performance. ### Why cannot I use --mem=0 when submitting jobs? -#### Question +**Question** Why can't I specify `--mem=0` for my job? -#### Answer +**Answer** We no longer support requesting unlimited memory (`--mem=0`) as it has an adverse effect on the way scheduler allocates job, and could lead to large amount of nodes being blocked from usage. -!!! note - Most often we suggest relying on default memory allocation (cluster-specific). But if you have to request custom amounts of memory, you can do it explicitly. For example `--mem=20G`. +Most often we suggest relying on default memory allocation (cluster-specific). But if you have to request custom amounts of memory, you can do it explicitly. For example `--mem=20G`. If you want to use the entire node's memory, you can submit the job with the `--exclusive` option. -### Can I extend the walltime on a job? - -In some circumstances, yes. Walltime extensions must be requested of and completed by staff. Walltime extension requests will be considered on named (your advisor or research lab) queues. **Standby or debug queue jobs cannot be extended**. - -Extension requests are at the discretion of staff based on factors such as any upcoming maintenance or resource availability. Extensions can be made past the normal maximum walltime on named queues but these jobs are subject to early termination should a conflicting maintenance downtime be scheduled. - -Please be mindful of time remaining on your job when making requests and make requests at least 24 hours before the end of your job AND during business hours. We cannot guarantee jobs will be extended in time with less than 24 hours notice, after-hours, during weekends, or on a holiday. - -We ask that you make accurate walltime requests during job submissions. Accurate walltimes will allow the job scheduler to efficiently and quickly schedule jobs on the cluster. Please consider that extensions can impact scheduling efficiency for all users of the cluster. - -Requests can be made by [contacting support](https://www.rcac.purdue.edu/help). We ask that you: - -* Provide numerical job IDs, cluster name, and your desired extension amount. -* Provide at least 24 hours notice before job will end (more if request is made on a weekend or holiday). -* Consider making requests during business hours. We may not be able to respond in time to requests made after-hours, on a weekend, or on a holiday. - -### What is the debug queue? +## Data -The debug queue is intended for short interactive debugging sessions. It allows up to 2 compute nodes per job, has a maximum walltime of 30 minutes, and limits each user to 1 running job at a time. Jobs submitted to the debug queue are expected to start within minutes. To submit to the debug queue: +### My scratch files were purged. Can I retrieve them? -``` -$ sbatch --account=debug --nodes=1 myjobsubmissionfile -``` +Unfortunately, once files are purged, they are purged permanently and cannot be retrieved. Notices of pending purges are sent one week in advance to your Purdue email address. Be sure to regularly check your Purdue email or set up forwarding to an account you do frequently check. -## Data +**Can you tell me what files were purged?** -### My scratch files were purged — are they recoverable? - -No. Files in scratch directories are not backed up and are not recoverable once purged. Scratch files on Hammer are automatically purged after 60 days of inactivity. Please ensure that any important data is moved to your home directory, Data Depot, or Fortress archive before the purge deadline. +You can see a list of files removed with the command `lastpurge`. The command accepts a `-n` option to specify how many weeks/purges ago you want to look back at. ### How is my Data Secured on Hammer? @@ -325,130 +263,37 @@ Hammer is not approved for storing data at the L3 restricted (covered by HIPAA) For resources designed to support research with heightened security requirements, please look for resources within the [REED+ Ecosystem](https://www.rcac.purdue.edu/services/reedplus). -### Can I share data with outside collaborators? - -Yes! Globus allows convenient sharing of data with outside collaborators. Data can be shared with collaborators' personal computers or directly with many other computing resources at other institutions. See the Globus documentation on how to share data: - -* - -### HSI/HTAR: Unable to authenticate user with remote gateway (error 2 or 9) - -There could be a variety of such errors, with wordings along the lines of - -``` -Could not initialize keytab on remote server. -result = -2, errno = 2rver connection -*** hpssex_OpenConnection: Unable to authenticate user with remote gateway at 128.211.138.40.1217result = -2, errno = 9 -Unable to setup communication to HPSS... -ERROR (main) unable to open remote gateway server connection -HTAR: HTAR FAILED -``` - -and +**High Level Data Security Diagram** -``` -*** hpssex_OpenConnection: Unable to authenticate user with remote gateway at 128.211.138.40.1217result = -11000, errno = 9 -Unable to setup communication to HPSS... -*** HSI: error opening logging -Error - authentication/initialization failed -``` - -The root cause for these errors is an expired or non-existent keytab file (a special authentication token stored in your home directory). These keytabs are valid for 90 days and on most RCAC resources they are usually automatically checked and regenerated when you execute `hsi` or `htar` commands. However, if the keytab is invalid, or fails to generate, Fortress may be unable to authenticate you and you would see the above errors. This is especially common on those RCAC clusters that have their own dedicated home directories (such as Hammer), or on standalone installations (such as if you downloaded and installed HSI and HTAR on your non-RCAC computer). - -*This is a temporary problem and a permanent system-wide solution is being developed.* In the interim, the recommended workaround is to generate a new valid keytab file in your main research computing home directory, and then copy it to your home directory on Hammer. The `fortresskey` command is used to generate the keytab and can be executed on another cluster or a dedicated data management host `data.rcac.purdue.edu`: - -``` -$ ssh myusername@data.rcac.purdue.edu fortresskey -$ scp -pr myusername@data.rcac.purdue.edu:~/.private $HOME -``` +![System Security Diagram](/assets/images/userguides/secdiagram.png) -With a valid keytab in place, you should then be able to use `hsi` and `htar` commands to access Fortress from Hammer. Note that only one keytab can be valid at any given time (i.e. if you regenerated it, you may have to copy the new keytab to all systems that you intend to use `hsi` or `htar` from if they do not share the main research computing home directory). +**Notes on Data Security Configuration** -### HSI/HTAR: put: Error -5 on transfer +* Only research groups that have purchased access may access Hammer. +* All access to Hammer is through [Purdue Career Accounts](https://www.purdue.edu/securepurdue/iamoServices/index.php), managed by Purdue's identity and access management office. +* Scratch storage on Hammer is private only to the individual user, using POSIX file permissions. +* Scratch storage on Hammer is not encrypted at rest or in flight. +* Scratch storage on Hammer is not backed up. We recommend using Fortress and the Data Depot as part of your lab's data management strategy. +* Access to the PI's Data Depot space is only possible from HPC systems, or with the use of the Purdue VPN. +* Access to the PI's Data Depot space is directly controlled by the PI via UNIX groups, POSIX file permissions and ACLs. +* [Globus](https://transfer.rcac.purdue.edu) is provided as a tool for secure, high-performance file transfer and sharing. +* All compute nodes on Hammer are firewalled and accessible only from within the boundaries of research computing resources. +* Access to a compute node is limited to the specific user assigned to the node via the job scheduler. No more than 1 user may access any one compute node at a time. +* The Purdue research network is monitored with an intrustion detection system. +* Purdue system administrators use two-factor authentication for administrative access to research systems. +* All research systems are manged with version control, configuration management software and patched at regular intervals. +* Usage, access, system, and application data is centrally logged and reviewed. +* Physical access to data center facilties is restricted by swipe card access to data center and systems staff. -First, check your firewall settings, and ensure that there are no firewall rules interfering with connecting to Fortress. For firewall configuration, please see "[Do I need to do anything to my firewall to access Hammer?](#do-i-need-to-do-anything-to-my-firewall-to-access-hammer)" **If firewalls are not responsible:** - -Open the file named `/etc/hosts` on your workstation, especially if you run a Debian or Ubuntu Linux distribution. Look for a line like: - -``` -127.0.1.1 hostname.dept.purdue.edu hostname -``` - -Replace the IP address 127.0.1.1 with the real IP address for your system. If you don't know your IP address, you can find it with the command: +### Can I share data with outside collaborators? -``` -host `hostname --fqdn` -``` +Yes! Globus allows convenient sharing of data with outside collaborators. Data can be shared with collaborators' personal computers or directly with many other computing resources at other institutions. See the Globus documentation on how to share data: +* https://docs.globus.org/how-to/share-files/ ### Can I access Fortress from Hammer? -Yes. While Fortress directories are not directly mounted on Hammer for performance and archival protection reasons, they can be accessed from Hammer front-ends and nodes using any of the recommended methods of [HSI, HTAR or Globus](https://www.rcac.purdue.edu/knowledge/fortress/storage/transfer). +Yes. While Fortress directories are not directly mounted on Hammer for performance and archival protection reasons, they can be accessed from Hammer front-ends and nodes using any of the recommended methods of HSI, HTAR or Globus. ## Software -### Cannot use pip after loading ml-toolkit modules - -#### Question - -Pip throws an error after loading the machine learning modules. How can I fix it? - -#### Answer - -Machine learning modules (tensorflow, pytorch, opencv etc.) include a version of `pip` that is newer than the one installed with Anaconda. As a result it will throw an error when you try to use it. - -``` -$ pip --version -Traceback (most recent call last): - File "/apps/cent7/anaconda/5.1.0-py36/bin/pip", line 7, in - from pip import main -ImportError: cannot import name 'main' -``` - -The preferred way to use `pip` with the machine learning modules is to invoke it via Python as shown below. - -``` -$ python -m pip --version -``` - -### How can I get access to Sentaurus software? - -#### Question - -How can I get access to Sentaurus tools for micro- and nano-electronics design? - -#### Answer - -Sentaurus software license requires a signed NDA. Please contact [Dr. Mark Johnson, Director of ECE Instructional Laboratories](https://engineering.purdue.edu/Mark-Johnson) to complete the process. - -Once the licensing process is complete and you have been added into a `cae2` Unix group, you could use Sentaurus on RCAC community clusters by loading the corresponding environment module: - -``` -module load sentaurus -``` - -### Julia package installation - -Users do not have write permission to the default julia package installation destination. However, users can install packages into home directory under `~/.julia`. - -Users can side step this by explicitly defining where to put julia packages: - -``` -$ export JULIA_DEPOT_PATH=$HOME/.julia -$ julia -e 'using Pkg; Pkg.add("PackageName")' -``` - -## About Research Computing - -### Can I get a private server from RCAC? - -#### Question - -Can I get a private (virtual or physical) server from RCAC? - -#### Answer - -Often, researchers may want a private server to run databases, web servers, or other software. RCAC currently has [Geddes](https://www.rcac.purdue.edu/compute/geddes), a Community Composable Platform optimized for composable, cloud-like workflows that are complementary to the batch applications run on Community Clusters. Funded by the National Science Foundation under grant OAC-2018926, Geddes consists of Dell Compute nodes with two 64-core AMD Epyc 'Rome' processors (128 cores per node). - -To purchase access to Geddes today, go to the [Cluster Access Purchase](https://www.rcac.purdue.edu/purchase) page. Please subscribe to our Community Cluster Program Mailing List to stay informed on the latest purchasing developments or contact us (rcac-cluster-purchase@lists.purdue.edu) if you have any questions. -[**Back to Hammer User Guide**](index.md) diff --git a/docs/userguides/hammer/index.md b/docs/userguides/hammer/index.md index a6870ccb..a5ff0473 100644 --- a/docs/userguides/hammer/index.md +++ b/docs/userguides/hammer/index.md @@ -19,9 +19,8 @@ Hammer is optimized for Purdue's communities utilizing loosely-coupled, high-thr - [**Hammer Overview**](overview.md) - [**Accounts**](accounts.md) -- [**Software**](software.md) -- [**Running Jobs**](run_jobs/index.md) - [**File Storage and Transfer**](storage.md) +- [**Software**](software.md) - [**Compiling Source Code**](compile.md) -- [**Jupyter Hub**](jupyter.md) +- [**Running Jobs**](run_jobs/index.md) - [**Frequently Asked Questions**](faqs.md) diff --git a/docs/userguides/hammer/jupyter.md b/docs/userguides/hammer/jupyter.md deleted file mode 100644 index 2c7869b9..00000000 --- a/docs/userguides/hammer/jupyter.md +++ /dev/null @@ -1,53 +0,0 @@ ---- -tags: - - Hammer -authors: - - jin456 -resource: Hammer -search: - boost: 2 ---- - -# Using Jupyter Hub - -Hammer provides a JupyterHub instance at [https://notebook.hammer.rcac.purdue.edu](https://notebook.hammer.rcac.purdue.edu). - -## What is Jupyter Hub - -Jupyter is an acronym meaning Julia, Python and R. Jupyter supports many programming languages and allows you to organize projects in notebooks that contain code, explanations, and results, with various export formatting options. - -## Getting Started - -Navigate to [https://notebook.hammer.rcac.purdue.edu](https://notebook.hammer.rcac.purdue.edu) and log in with your Purdue career account credentials. After logging in, you will see your home directory in the file browser. To create a new notebook, click the **New** dropdown menu and select from the available kernels: Bash, R, or Python. - -## Create Your Own Environment - -You can create custom conda environments and register them as Jupyter kernels so that your notebooks use the packages you need. - -1. Load the anaconda module: - - ```bash - $ module load anaconda - ``` - -2. Create a conda environment with your required packages: - - ```bash - $ conda create -n MyEnvName python=3.10 numpy scipy - ``` - -3. Activate the environment: - - ```bash - $ conda activate MyEnvName - ``` - -4. Install the environment as a Jupyter kernel: - - ```bash - $ ipython kernel install --user --name MyEnvName --display-name "descriptive name" - ``` - -5. Reload the Jupyter dashboard. Your new environment will appear in the kernel selector when creating or switching kernels in a notebook. You can also switch kernels at any time from the **Kernel** menu. - -[**Back to Hammer User Guide**](index.md) diff --git a/docs/userguides/hammer/overview.md b/docs/userguides/hammer/overview.md index 38fef41a..81fe2ad8 100644 --- a/docs/userguides/hammer/overview.md +++ b/docs/userguides/hammer/overview.md @@ -16,23 +16,21 @@ To purchase access to Hammer today, go to the [Cluster Access Purchase](https:// ## Hammer Specifications -Most Hammer nodes consist of identical hardware. All Hammer compute nodes are connected via 10 Gbps or 25 Gbps Ethernet interconnects. +Currently, all Hammer nodes consist of identical hardware with the exception for some of them hosting an Nvidia T4 GPU. All Hammer nodes have 128 HT-enabled processor cores, 512 GB of RAM, and 10 Gbps Ethernet interconnects. Hammer Front-Ends | Front-Ends | Number of Nodes | Processors per Node | Cores per Node | Memory per Node | Retires in | | --- | --- | --- | --- | --- | --- | -| | 2 | Two Haswell CPUs @ 2.60GHz | 20 | 64 GB | 2020 | +| | 2 | Intel(R) Xeon(R) CPU E5-2420 v2 @ 2.20GHz | 12 | 101 GB | 2020 | Hammer Sub-Clusters | Sub-Cluster | Number of Nodes | Processors per Node | Cores per Node | Memory per Node | Retires in | | --- | --- | --- | --- | --- | --- | -| A | 198 | Two Haswell CPUs @ 2.60GHz | 20 | 64 GB | 2020 | -| B | 40 | Two Haswell CPUs @ 2.60GHz | 40 | 128 GB | 2021 | -| C | 27 | Two Sky Lake CPUs @ 2.60GHz | 48 | 192 GB | 2022 | -| D | 18 | Two Sky Lake CPUs @ 2.60GHz | 48 | 192 GB | 2023 | -| E | 15 | Two Intel Xeon Gold CPUs @ 2.60GHz | 48 | 96 GB | 2024 | +| F[000-012] | 13 | Two AMD EPYC 7702 @ 2GHz w/ One nVidia Tesla T4 GPU | 256 | 512GB | 2020 | +| F[013-015] | 3 | Two AMD EPYC 7702 @ 2GHz | 256 | 512GB | 2020 | +| G | 40 | Two AMD EPYC 7702 @ 2GHz | 256 | 512GB | 2021 | Hammer nodes run Rocky Linux 8 and use Slurm (Simple Linux Utility for Resource Management) as the batch scheduler for resource and job management. The application of operating system patches occurs as security needs dictate. All nodes allow for unlimited stack usage, as well as unlimited core dump size (though disk space and server quotas may still be a limiting factor). diff --git a/docs/userguides/hammer/run_jobs/examples/apps.md b/docs/userguides/hammer/run_jobs/examples/apps.md index f2d577a4..158964d8 100644 --- a/docs/userguides/hammer/run_jobs/examples/apps.md +++ b/docs/userguides/hammer/run_jobs/examples/apps.md @@ -15,13 +15,14 @@ The following examples demonstrate job submission files for some common real-wor ## In This Section - [Gaussian](apps/gaussian.md) -- [Mathematica](apps/mathematica.md) +- [Machine Learning](apps/learning.md) - [Matlab](apps/matlab.md) -- [Octave](apps/octave.md) - [Python](apps/python.md) - [R](apps/r.md) - [Spark](apps/spark.md) +- [Apptainer](apps/apptainer.md) - [Windows](apps/windows.md) -- [Machine Learning](apps/learning.md) +- [Mathematica](apps/mathematica.md) +- [Octave](apps/octave.md) [**Back to the Running Jobs section**](../index.md) diff --git a/docs/userguides/hammer/run_jobs/examples/apps/apptainer.md b/docs/userguides/hammer/run_jobs/examples/apps/apptainer.md new file mode 100644 index 00000000..f31aa4be --- /dev/null +++ b/docs/userguides/hammer/run_jobs/examples/apps/apptainer.md @@ -0,0 +1,13 @@ +--- +tags: + - Hammer +authors: + - jin456 +resource: Hammer +search: + boost: 2 +--- + +{{ apptainer_snippet("hammer") }} + +[**Back to the Specific Applications section**](../apps.md) diff --git a/docs/userguides/hammer/run_jobs/index.md b/docs/userguides/hammer/run_jobs/index.md index 9c3c3b11..64f34818 100644 --- a/docs/userguides/hammer/run_jobs/index.md +++ b/docs/userguides/hammer/run_jobs/index.md @@ -37,8 +37,7 @@ Batch jobs submitted via SLURM have four main steps: A number of example jobs are available for you to look over and adapt to your own needs. The first few are generic examples, and latter ones go into specifics for particular software packages. -- [Specific Applications](examples/apps.md) -- [Hadoop](examples/hadoop.md) - [Generic SLURM Jobs](examples/slurm.md) +- [Specific Applications](examples/apps.md) [**Back to Hammer User Guide**](../index.md) diff --git a/docs/userguides/hammer/run_jobs/slurm/queues.md b/docs/userguides/hammer/run_jobs/slurm/queues.md index 1e576a34..78b8161a 100644 --- a/docs/userguides/hammer/run_jobs/slurm/queues.md +++ b/docs/userguides/hammer/run_jobs/slurm/queues.md @@ -12,60 +12,21 @@ search: On Hammer, jobs are submitted to named queues (also called accounts). Each research partner who has purchased access to Hammer receives a dedicated queue named after their research group. In addition, all users have access to the `standby` and `debug` queues. -!!! note - Hammer is optimized for **high-throughput computing (HTC)**. The maximum job size is **8 processor cores**. By default, SLURM jobs on Hammer have exclusive access to compute nodes — a job requesting fewer than a full node's cores still occupies the entire node. +## "mylab" Queues -## Named (mylab) Queues - -Each research partner on Hammer has a dedicated queue named after their research group (e.g., `mylab`). These queues provide priority access to the resources purchased by that group. - -* Jobs submitted to a named queue have high priority and are expected to start within 4 hours. -* The maximum walltime for jobs in a named queue is **336 hours** (14 days). -* Named queue jobs withdraw resources from the group's purchased allocation while running. - -To submit a job to your named queue: - -```bash -$ sbatch --account=myqueuename myjobsubmissionfile -``` - -To check what queues you have access to, use the `slist` command. +Hammer, as a community cluster, has one or more queues dedicated to and named after each partner who has purchased access to the cluster. These queues provide partners and their researchers with priority access to their portion of the cluster. Jobs in these queues are typically limited to 336 hours. **The expectation is that any jobs submitted to your research lab queues will start within 4 hours, assuming the queue currently has enough capacity for the job** (that is, your lab mates aren't using all of the cores currently). ## Standby Queue -The `standby` queue is available to all Hammer users and allows jobs to run on otherwise idle resources across the cluster. - -* Jobs in the standby queue have lower priority; there is no guaranteed start time. -* The maximum walltime for standby jobs is **4 hours**. -* Standby jobs use idle resources and do not count against your group's purchased allocation. - -To submit a job to the standby queue: - -```bash -$ sbatch --account=standby myjobsubmissionfile -``` +Additionally, community clusters provide a "standby" queue which is available to all cluster users. This "standby" queue allows users to utilize portions of the cluster that would otherwise be idle, but at a lower priority than partner-queue jobs, and with a relatively short time limit, to ensure "standby" jobs will not be able to tie up resources and prevent partner-queue jobs from running quickly. Jobs in standby are limited to 12 hours. **There is no expectation of job start time.** If the cluster is very busy with partner queue jobs, or you are requesting a very large job, jobs in standby may take hours or days to start. ## Debug Queue -The `debug` queue is intended for short, interactive debugging sessions to help you test and troubleshoot your job scripts before submitting longer runs. - -* Each user may have **1 running job** in the debug queue at a time. -* Jobs may use up to **2 compute nodes**. -* The maximum walltime is **30 minutes**. -* Debug jobs are expected to start within minutes. - -To submit a job to the debug queue: +The debug queue allows you to quickly start small, short, interactive jobs in order to debug code, test programs, or test configurations. You are limited to one running job at a time in the queue, and you may run up to two compute nodes for 30 minutes. The expectation is that debug jobs should start within a couple of minutes, assuming all of its dedicated nodes are not taken by others. -```bash -$ sbatch --account=debug --nodes=1 myjobsubmissionfile -``` +## List of Queues -## Queue Summary +To see a list of all queues on Hammer that you may submit to, use the `slist` command -| Queue | Who Can Use | Max Walltime | Expected Start | Notes | -| --- | --- | --- | --- | --- | -| Named (mylab) | Research group members | 336 hours | Within 4 hours | Dedicated, high priority | -| standby | All users | 4 hours | No guarantee | Uses idle resources | -| debug | All users | 30 minutes | Within minutes | 1 running job/user, max 2 nodes | +This lists each queue you can submit to, the number of nodes allocated to the queue, how many are available to run jobs, and the maximum walltime you may request. Options to the command will give more detailed information. This command can be used to get a general idea of how busy an individual queue is and how long you may have to wait for your job to start. -[**Back to the Running Jobs section**](../index.md) diff --git a/docs/userguides/hammer/storage/ftp_sftp.md b/docs/userguides/hammer/storage/ftp_sftp.md index d3371d5e..0d9e042d 100644 --- a/docs/userguides/hammer/storage/ftp_sftp.md +++ b/docs/userguides/hammer/storage/ftp_sftp.md @@ -8,6 +8,6 @@ search: boost: 2 --- ---8<-- "docs/snippets/ftp_sftp.md" +{{ ftp_sftp_snippet("hammer") }} [**Back to the Storage section**](../storage.md) diff --git a/docs/userguides/hammer/storage/hsi.md b/docs/userguides/hammer/storage/hsi.md index 35b35c75..fb7b1bc9 100644 --- a/docs/userguides/hammer/storage/hsi.md +++ b/docs/userguides/hammer/storage/hsi.md @@ -8,6 +8,6 @@ search: boost: 2 --- ---8<-- "docs/snippets/hsi.md" +{{ hsi_snippet(resource) }} [**Back to the Storage section**](../storage.md) diff --git a/docs/userguides/hammer/storage/htar.md b/docs/userguides/hammer/storage/htar.md index ca2898ef..2e0a5e5f 100644 --- a/docs/userguides/hammer/storage/htar.md +++ b/docs/userguides/hammer/storage/htar.md @@ -8,6 +8,6 @@ search: boost: 2 --- ---8<-- "docs/snippets/htar.md" +{{ htar_snippet(resource) }} [**Back to the Storage section**](../storage.md) diff --git a/docs/userguides/hammer/storage/scp.md b/docs/userguides/hammer/storage/scp.md index 028e0076..513c4ad5 100644 --- a/docs/userguides/hammer/storage/scp.md +++ b/docs/userguides/hammer/storage/scp.md @@ -8,6 +8,6 @@ search: boost: 2 --- ---8<-- "docs/snippets/scp.md" +{{ scp_file_snippet("hammer") }} [**Back to the Storage section**](../storage.md) diff --git a/docs/userguides/hammer/storage/sharing.md b/docs/userguides/hammer/storage/sharing.md index a68fbf45..e5692cea 100644 --- a/docs/userguides/hammer/storage/sharing.md +++ b/docs/userguides/hammer/storage/sharing.md @@ -8,6 +8,6 @@ search: boost: 2 --- ---8<-- "docs/snippets/sharing.md" +{{ sharing_snippet("hammer") }} [**Back to the Storage section**](../storage.md) diff --git a/docs/userguides/hammer/storage/windows_network_drive.md b/docs/userguides/hammer/storage/windows_network_drive.md index 18cb6953..141e5c0e 100644 --- a/docs/userguides/hammer/storage/windows_network_drive.md +++ b/docs/userguides/hammer/storage/windows_network_drive.md @@ -8,6 +8,6 @@ search: boost: 2 --- ---8<-- "docs/snippets/windows_network_drive.md" +{{ windows_network_drive("hammer") }} [**Back to the Storage section**](../storage.md) diff --git a/mkdocs.yml b/mkdocs.yml index ceeaee25..a8b612a4 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -185,11 +185,10 @@ nav: - userguides/hammer/index.md - Hammer Overview: userguides/hammer/overview.md - Accounts: userguides/hammer/accounts.md - - Software: userguides/hammer/software.md - - Running Jobs: userguides/hammer/run_jobs/index.md - File Storage and Transfer: userguides/hammer/storage.md + - Software: userguides/hammer/software.md - Compiling Source Code: userguides/hammer/compile.md - - Jupyter Hub: userguides/hammer/jupyter.md + - Running Jobs: userguides/hammer/run_jobs/index.md - Frequently Asked Questions: userguides/hammer/faqs.md - Rossmann: https://www.rcac.purdue.edu/knowledge/rossmann - Weber: https://www.rcac.purdue.edu/knowledge/weber From 1a8a41b99cde6008f318f87137d0cc0d777f4a87 Mon Sep 17 00:00:00 2001 From: Guangzhen Jin Date: Thu, 2 Jul 2026 15:52:26 -0400 Subject: [PATCH 5/8] Modify overview. Add FAQs. --- docs/userguides/hammer/faqs.md | 36 ++++++++++++++++++++++++++++++ docs/userguides/hammer/overview.md | 16 ++++++------- 2 files changed, 44 insertions(+), 8 deletions(-) diff --git a/docs/userguides/hammer/faqs.md b/docs/userguides/hammer/faqs.md index 11c7d1af..4a045d78 100644 --- a/docs/userguides/hammer/faqs.md +++ b/docs/userguides/hammer/faqs.md @@ -296,4 +296,40 @@ Yes. While Fortress directories are not directly mounted on Hammer for performan ## Software +### Cannot use pip after loading ml-toolkit modules +**Question** + +`pip` throws an error after loading the machine learning modules. How can I fix it? + +**Answer** + +Machine learning modules (`tensorflow`, `pytorch`, `opencv` etc.) include a version of `pip` that is newer than the one installed with Anaconda. As a result it will throw an error when you try to use it. + +```bash +$ pip --version +Traceback (most recent call last): + File "/apps/cent7/anaconda/5.1.0-py36/bin/pip", line 7, in + from pip import main +ImportError: cannot import name 'main' +``` + +The preferred way to use pip with the machine learning modules is to invoke it via Python as shown below. + +```bash +$ python -m pip --version +``` + +### How can I get access to Sentaurus software? + +**Question** + +How can I get access to Sentaurus tools for micro- and nano-electronics design? + +**Answer** + +Sentaurus software license requires a signed NDA. Please contact [Dr. Mark Johnson, Director of ECE Instructional Laboratories](https://engineering.purdue.edu/Mark-Johnson) to complete the process. + +Once the licensing process is complete and you have been added into a `cae2` Unix group, you could use Sentaurus on RCAC community clusters by loading the corresponding environment module: + +`module load sentaurus` \ No newline at end of file diff --git a/docs/userguides/hammer/overview.md b/docs/userguides/hammer/overview.md index 81fe2ad8..0450a04f 100644 --- a/docs/userguides/hammer/overview.md +++ b/docs/userguides/hammer/overview.md @@ -20,17 +20,17 @@ Currently, all Hammer nodes consist of identical hardware with the exception for Hammer Front-Ends -| Front-Ends | Number of Nodes | Processors per Node | Cores per Node | Memory per Node | Retires in | -| --- | --- | --- | --- | --- | --- | -| | 2 | Intel(R) Xeon(R) CPU E5-2420 v2 @ 2.20GHz | 12 | 101 GB | 2020 | +| Front-Ends | Number of Nodes | Processors per Node | Cores per Node | Memory per Node | +| --- | --- | --- | --- | --- | +| | 2 | Two Sky Lake CPUs @ 2.60GHz | 48 (Logical) | 192 GB | Hammer Sub-Clusters -| Sub-Cluster | Number of Nodes | Processors per Node | Cores per Node | Memory per Node | Retires in | -| --- | --- | --- | --- | --- | --- | -| F[000-012] | 13 | Two AMD EPYC 7702 @ 2GHz w/ One nVidia Tesla T4 GPU | 256 | 512GB | 2020 | -| F[013-015] | 3 | Two AMD EPYC 7702 @ 2GHz | 256 | 512GB | 2020 | -| G | 40 | Two AMD EPYC 7702 @ 2GHz | 256 | 512GB | 2021 | +| Sub-Cluster | Number of Nodes | Processors per Node | Cores per Node | Memory per Node | +| --- | --- | --- | --- | --- | +| F [000-012] | 13 | Two AMD EPYC 7702 @ 2GHz, one Nvidia Tesla T4 GPU | 256 | 512GB | +| F [013-015] | 3 | Two AMD EPYC 7702 @ 2GHz | 256 | 512GB | +| G | 40 | Two AMD EPYC 7702 @ 2GHz | 256 | 512GB | Hammer nodes run Rocky Linux 8 and use Slurm (Simple Linux Utility for Resource Management) as the batch scheduler for resource and job management. The application of operating system patches occurs as security needs dictate. All nodes allow for unlimited stack usage, as well as unlimited core dump size (though disk space and server quotas may still be a limiting factor). From 76af6f682e18ac5a749abd03299423c4d2610617 Mon Sep 17 00:00:00 2001 From: Guangzhen Jin Date: Thu, 2 Jul 2026 16:02:41 -0400 Subject: [PATCH 6/8] Remove unused md files. --- .../hammer/run_jobs/examples/hadoop.md | 149 ------------------ 1 file changed, 149 deletions(-) delete mode 100644 docs/userguides/hammer/run_jobs/examples/hadoop.md diff --git a/docs/userguides/hammer/run_jobs/examples/hadoop.md b/docs/userguides/hammer/run_jobs/examples/hadoop.md deleted file mode 100644 index 68cb7c09..00000000 --- a/docs/userguides/hammer/run_jobs/examples/hadoop.md +++ /dev/null @@ -1,149 +0,0 @@ ---- -tags: - - Hammer -authors: - - jin456 -resource: Hammer -search: - boost: 2 ---- - -# Hadoop - -## HBase - -[Apache HBase](http://hbase.apache.org/) is the Hadoop database, a distributed, scalable, big data store. HBase is an open-source, distributed, versioned, non-relational database modeled after Google's [Bigtable: A Distributed Storage System for Structured Data](http://research.google.com/archive/bigtable.html) by Chang et al. Just as Bigtable leverages the distributed data storage provided by the Google File System, Apache HBase provides Bigtable-like capabilities on top of Hadoop and HDFS. - -## Hive - -[Apache Hive](https://hive.apache.org/) is a data warehouse infrastructure built on top of Hadoop for providing data summarization, query, and analysis. Hive provides a mechanism to project structure onto this data and query the data using a SQL-like language called HiveQL. At the same time this language also allows traditional map/reduce programmers to plug in their custom mappers and reducers when it is inconvenient or inefficient to express this logic in HiveQL. - -Load java module: - -``` -$ module load java -``` - -Export environment variables: - -``` -$ source /etc/default/hadoop -$ export HIVE_HOME=/apps/hathi/hive/ -$ export PATH=$HIVE_HOME/bin:$HIVE_HOME/hcatalog/bin:$PATH -``` - -To access Hive: - -``` -$ hive -15/09/10 15:14:16 INFO Configuration.deprecation: mapred.reduce.tasks is deprecated. Instead, use mapreduce.job.reduces -15/09/10 15:14:16 INFO Configuration.deprecation: mapred.min.split.size is deprecated. Instead, use mapreduce.input.fileinputformat.split.minsize -15/09/10 15:14:16 INFO Configuration.deprecation: mapred.reduce.tasks.speculative.execution is deprecated. Instead, use mapreduce.reduce.speculative -15/09/10 15:14:16 INFO Configuration.deprecation: mapred.min.split.size.per.node is deprecated. Instead, use mapreduce.input.fileinputformat.split.minsize.per.node -15/09/10 15:14:16 INFO Configuration.deprecation: mapred.input.dir.recursive is deprecated. Instead, use mapreduce.input.fileinputformat.input.dir.recursive -15/09/10 15:14:16 INFO Configuration.deprecation: mapred.min.split.size.per.rack is deprecated. Instead, use mapreduce.input.fileinputformat.split.minsize.per.rack -15/09/10 15:14:16 INFO Configuration.deprecation: mapred.max.split.size is deprecated. Instead, use mapreduce.input.fileinputformat.split.maxsize -15/09/10 15:14:16 INFO Configuration.deprecation: mapred.committer.job.setup.cleanup.needed is deprecated. Instead, use mapreduce.job.committer.setup.cleanup.needed - -Logging initialized using configuration in jar:file:/apps/hathi/apache-hive-0.14.0-bin/lib/hive-common-0.14.0.jar!/hive-log4j.properties -SLF4J: Class path contains multiple SLF4J bindings. -SLF4J: Found binding in [jar:file:/usr/lib/gphd/hadoop/lib/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class] -SLF4J: Found binding in [jar:file:/apps/hathi/apache-hive-0.14.0-bin/lib/hive-jdbc-0.14.0-standalone.jar!/org/slf4j/impl/StaticLoggerBinder.class] -SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation. -SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory] -hive> -``` - -To create and browse Hive tables: - -``` -$ hive> CREATE TABLE pokes_user (foo INT, bar STRING); -OK -Time taken: 1.56 seconds -$ hive> CREATE TABLE invites_user (foo INT, bar STRING) PARTITIONED BY (ds STRING); -OK -Time taken: 0.125 seconds -$ hive> SHOW TABLES; -OK -invites_user -pokes_user -Time taken: 0.114 seconds, Fetched: 2 row(s) -``` - -To browse Hive tables from hdfs: - -* Go to -* Click on "Browse the filesystem" -* Navigate to "/user/hive/warehouse" - -To run the HCatalog Server from the command-line: - -``` -$ cd /apps/hathi/hive -$ hcatalog/bin/hcat -``` - -For more information, refer to [GettingStarted - Apache Hive - Apache Software Foundation.](https://cwiki.apache.org/confluence/display/Hive/GettingStarted#GettingStarted-SimpleExampleUseCases) - -## Pig - -[Apache Pig](http://pig.apache.org/) is a platform for analyzing large data sets that consists of a high-level language for expressing data analysis programs, coupled with infrastructure for evaluating these programs. - -Before to use Pig, setup environment variables: - -``` -$ module load java -$ export PATH=/apps/hathi/pig/bin:$PATH -``` - -The following steps walk through how to run Pig in interactive mode. Before to run, you should put the `/etc/passwd` file from you local system to `hdfs:///user/yourusername/`. These Pig Latin statements extract all user IDs from the `/etc/passwd` file. - -First, invoke the Grunt shell: - -``` -$ pig -x mapreduce -15/10/06 16:32:01 INFO pig.ExecTypeProvider: Trying ExecType : LOCAL -15/10/06 16:32:01 INFO pig.ExecTypeProvider: Trying ExecType : MAPREDUCE -15/10/06 16:32:01 INFO pig.ExecTypeProvider: Picked MAPREDUCE as the ExecType -2015-10-06 16:32:01,856 [main] INFO org.apache.pig.Main - Apache Pig version 0.15.0 (r1682971) compiled Jun 01 2015, 11:44:35 -2015-10-06 16:32:01,857 [main] INFO org.apache.pig.Main - Logging error messages to: /path/to/pig/pig_1444163521852.log -2015-10-06 16:32:01,908 [main] INFO org.apache.pig.impl.util.Utils - Default bootup file /path/to/.pigbootup not found -2015-10-06 16:32:02,808 [main] INFO org.apache.hadoop.conf.Configuration.deprecation - mapred.job.tracker is deprecated. Instead, use mapreduce.jobtracker.address -2015-10-06 16:32:02,808 [main] INFO org.apache.hadoop.conf.Configuration.deprecation - fs.default.name is deprecated. Instead, use fs.defaultFS -2015-10-06 16:32:02,809 [main] INFO org.apache.pig.backend.hadoop.executionengine.HExecutionEngine - Connecting to hadoop file system at: hdfs://hathi-adm.rcac.purdue.edu:8020 -2015-10-06 16:32:02,816 [main] INFO org.apache.hadoop.conf.Configuration.deprecation - mapred.used.genericoptionsparser is deprecated. Instead, use mapreduce.client.genericoptionsparser.used -2015-10-06 16:32:04,362 [main] INFO org.apache.hadoop.conf.Configuration.deprecation - fs.default.name is deprecated. Instead, use fs.defaultFS -grunt> -``` - -Then, enter the Pig Latin statements interactively at the grunt prompt: - -``` -$ grunt> A = load 'passwd' using PigStorage(':'); -$ grunt> B = foreach A generate $0 as id; -$ grunt> dump B; -``` - -The following steps walk through how to run Pig in batch mode. - -First, save the following statements in the Pig script (id.pig): - -``` -/* id.pig */ - -A = load 'passwd' using PigStorage(':'); -- load the passwd file -B = foreach A generate $0 as id; -- extract the user IDs -store B into 'id.out'; -- write the results to a file name id.out -``` - -Then, run the Pig script in batch mode: - -``` -$ pig -x mapreduce id.pig -``` - -This is generate output in `hdfs:///user/yourusername/id.put/`. - -To learn programming in Pig, refer to: [Pig Overview](http://pig.apache.org/docs/r0.15.0/) - -[**Back to the Running Jobs section**](../index.md) From 7402b32c9c4e40e5e173217eb66fc965bbe2127c Mon Sep 17 00:00:00 2001 From: Guangzhen Jin Date: Fri, 10 Jul 2026 14:49:44 -0400 Subject: [PATCH 7/8] Remove Spark sections. --- docs/userguides/hammer/run_jobs/examples/apps.md | 1 - .../hammer/run_jobs/examples/apps/spark.md | 13 ------------- 2 files changed, 14 deletions(-) delete mode 100644 docs/userguides/hammer/run_jobs/examples/apps/spark.md diff --git a/docs/userguides/hammer/run_jobs/examples/apps.md b/docs/userguides/hammer/run_jobs/examples/apps.md index 158964d8..765e6321 100644 --- a/docs/userguides/hammer/run_jobs/examples/apps.md +++ b/docs/userguides/hammer/run_jobs/examples/apps.md @@ -19,7 +19,6 @@ The following examples demonstrate job submission files for some common real-wor - [Matlab](apps/matlab.md) - [Python](apps/python.md) - [R](apps/r.md) -- [Spark](apps/spark.md) - [Apptainer](apps/apptainer.md) - [Windows](apps/windows.md) - [Mathematica](apps/mathematica.md) diff --git a/docs/userguides/hammer/run_jobs/examples/apps/spark.md b/docs/userguides/hammer/run_jobs/examples/apps/spark.md deleted file mode 100644 index 6a9cf340..00000000 --- a/docs/userguides/hammer/run_jobs/examples/apps/spark.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -tags: - - Hammer -authors: - - jin456 -resource: Hammer -search: - boost: 2 ---- - ---8<-- "docs/snippets/examples/apps/spark.md" - -[**Back to the Specific Applications section**](../apps.md) From 1b3dbf1f217f1d21817b71119431493cb9d68382 Mon Sep 17 00:00:00 2001 From: Guangzhen Jin Date: Fri, 10 Jul 2026 14:51:43 -0400 Subject: [PATCH 8/8] Re-organize navbar --- mkdocs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mkdocs.yml b/mkdocs.yml index a8b612a4..d5ca2c43 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -180,7 +180,6 @@ nav: - Web Server: userguides/geddes/examples/webserver.md - R Shiny: userguides/geddes/examples/r-shiny.md - Troubleshooting: userguides/geddes/troubleshooting.md - - Negishi: https://www.rcac.purdue.edu/knowledge/negishi - Hammer: - userguides/hammer/index.md - Hammer Overview: userguides/hammer/overview.md @@ -190,6 +189,7 @@ nav: - Compiling Source Code: userguides/hammer/compile.md - Running Jobs: userguides/hammer/run_jobs/index.md - Frequently Asked Questions: userguides/hammer/faqs.md + - Negishi: https://www.rcac.purdue.edu/knowledge/negishi - Rossmann: https://www.rcac.purdue.edu/knowledge/rossmann - Weber: https://www.rcac.purdue.edu/knowledge/weber - Storage User Guides: