From 11e5079d5f4ef42df9bdc3b0a6984807628e59da Mon Sep 17 00:00:00 2001 From: hkashgar Date: Thu, 11 Jun 2026 19:52:21 -0500 Subject: [PATCH 01/26] negishi userguide --- docs/userguides/negishi/accounts.md | 27 ++++ docs/userguides/negishi/biography.md | 17 +++ docs/userguides/negishi/index.md | 23 ++++ docs/userguides/negishi/overview.md | 51 ++++++++ .../creating_the_submission_script.md | 53 ++++++++ docs/userguides/negishi/run_jobs/index.md | 47 +++++++ docs/userguides/negishi/run_jobs/queues.md | 118 ++++++++++++++++++ .../negishi/run_jobs/submit_script.md | 117 +++++++++++++++++ docs/userguides/negishi/software.md | 88 +++++++++++++ 9 files changed, 541 insertions(+) create mode 100644 docs/userguides/negishi/accounts.md create mode 100644 docs/userguides/negishi/biography.md create mode 100644 docs/userguides/negishi/index.md create mode 100644 docs/userguides/negishi/overview.md create mode 100644 docs/userguides/negishi/run_jobs/creating_the_submission_script.md create mode 100644 docs/userguides/negishi/run_jobs/index.md create mode 100644 docs/userguides/negishi/run_jobs/queues.md create mode 100644 docs/userguides/negishi/run_jobs/submit_script.md create mode 100644 docs/userguides/negishi/software.md diff --git a/docs/userguides/negishi/accounts.md b/docs/userguides/negishi/accounts.md new file mode 100644 index 00000000..235dd26a --- /dev/null +++ b/docs/userguides/negishi/accounts.md @@ -0,0 +1,27 @@ +--- +tags: + - Negishi +authors: + - hkashgar +resource: negishi +search: + boost: 2 +--- + + +{% set resource = "negishi" %} + +{{ 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" diff --git a/docs/userguides/negishi/biography.md b/docs/userguides/negishi/biography.md new file mode 100644 index 00000000..db49fe23 --- /dev/null +++ b/docs/userguides/negishi/biography.md @@ -0,0 +1,17 @@ +--- +tags: + - Negishi +authors: + - hkashgar +search: + boost: 2 +--- + +# Biography of Ei-ichi Negishi + +![Portrait of Ei-ichi Negishi](../../assets/images/userguides/negishi/bio_negishi.jpg){ align=right } + + +Ei-ichi Negishi (1935-2021) was the Herbert C. Brown Distinguished Professor in the Department of Chemistry at Purdue. He came to Purdue in 1966 as a postdoctoral researcher in the lab of the Late Herbert C. Brown, and published 33 papers with Prof. Brown up through the time that Prof. Brown was awarded the Nobel Prize in Chemistry in 1979. With the award of the Nobel to Ei-ichi Negishi in 2010, Purdue has the rare distinction of a pair of Nobel Prize awards in two closely related areas. Professor Negishi’s Nobel Prize was awarded in recognition of his work on palladium-catalyzed cross-coupling chemistry (known world-– wide as the Negishi coupling). That work was described by the Nobel Foundation as "great art in a test tube". This is certainly appropriate as great scientists regard themselves as artists and explorers. The impact of that work was widespread, as it had been used in synthetic organic chemistry research worldwide, as well as in the commercial production of an array of pharmaceuticals and molecules used in the electronics industry. In recognition of and consistent with this idea, Ei-ichi and co-recipient Akira Suzuki were recently awarded Japan's highest cultural award, the "Order of Culture", bestowed in Nov. 2010 by the Emperor. + +Professor Negishi was a prolific researcher, with ~400 publications on an array of problems in synthetic organic chemistry, leading to numerous awards. To name just a few, the list includes the Chemical Society of Japan Award (1997), the American Chemical Society Award in Organometallic Chemistry (1998), the McCoy Award (1998), the Sigma Xi Award at Purdue (2003), the Nobel Prize in Chemistry (2010), the Order of Culture in Japan (2010), the American Chemical Society Award for Creative Work in Synthetic Organic Chemistry (2010), the Indiana Sagamore of the Wabash (2011) and the Purdue Order of the Griffin (2011). He was elected to the American Academy of Arts and Sciences in 2011. Professor Negishi was leading the Negishi-Brown Institute, which had continued his work on catalytic organic synthesis. Dr. Negishi was passionate about the prospects for catalytic approaches to the reduction of carbon dioxide to enable large scale production of useful products from this environmental waste product. It is very fitting that Purdue bestow an honorary doctorate degree on Professor Negishi, whose accomplishments and contributions will have a permanent impact on Purdue’s stature and global recognition. diff --git a/docs/userguides/negishi/index.md b/docs/userguides/negishi/index.md new file mode 100644 index 00000000..329d38e8 --- /dev/null +++ b/docs/userguides/negishi/index.md @@ -0,0 +1,23 @@ +--- +#tags: +# - Negishi +authors: + - hkashgar +search: + boost: 2 +--- + +# Negishi User Guide + +Negishi is a Community Cluster optimized for communities running traditional, tightly-coupled science and engineering applications. + +- [**Negishi Overview**](overview.md) +- [**Biography of Negishi**](biography.md) +- [**Accounts**](accounts.md) +- [**Software**](software.md) +- [**Running Jobs**](run_jobs/index.md) +- [**File Storage and Transfer**](storage.md) +- [**Gateway (Open OnDemand)**](gateway.md) +- [**Compiling Source Code**](compile.md) +- [**Frequently Asked Questions**](faq.md) + diff --git a/docs/userguides/negishi/overview.md b/docs/userguides/negishi/overview.md new file mode 100644 index 00000000..4366f8ec --- /dev/null +++ b/docs/userguides/negishi/overview.md @@ -0,0 +1,51 @@ +--- +tags: + - Negishi +authors: + - hkashgar +resource: Negishi +search: + boost: 2 +--- + +# Negishi Overview + +Negishi is a Community Cluster optimized for communities running traditional, tightly-coupled science and engineering applications. Negishi is being built through a partnership with Dell and AMD over the summer of 2022. Negishi consists of Dell compute nodes with two 64-core AMD Epyc "Milan" processors (128 cores per node) and 256 GB of memory. All nodes have 100 Gbps HDR Infiniband interconnect and a 6-year warranty. + +New with Negishi is that access is being offered on the basis of each 64-core Rome processor, or a half-node share. To purchase access to Negishi 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. + +## Negishi Interactive + +The interactive tier on our Negishi cluster provides entry-level access to high performance computing. This includes login to the system, data storage on our high-performance *scratch* filesystem, and a small allocation that allows jobs submitted to an "interactive" account limited to a few cores. This subscription is useful for getting workloads off your personal machine, integrated with more robust research computing and data systems, and a platform for smaller workloads. Transitioning to a larger allocation with priority scheduling is easy and simple. + +## Negishi Namesake + +Negishi is named in honor of Dr. Ei-ichi Negishi, the Herbert C. Brown Distinguished Professor in the Department of Chemistry at Purdue. More information about his life and impact on Purdue is available in a [Biography of Negishi](./biography.md). + +## Negishi Specifications + +All Negishi compute nodes have 128 processor cores, 256 GB memory and 100 Gbps HDR100 Infiniband interconnects. + +### Negishi Front-Ends + +| Front-Ends | Number of Nodes | Processors per Node | Cores per Node | Memory per Node | Retires in | +| --- | --- | --- | --- | --- | --- | +| | 8 | Two AMD EPYC 7763 64-Core Processors @ 2.2GHz | 128 | 512 GB | 2028 | + +### Negishi Sub-Clusters + +| Sub-Cluster | Number of Nodes | Processors per Node | Cores per Node | Memory per Node | Retires in | +| --- | --- | --- | --- | --- | --- | +| A | 450 | Two AMD Epyc 7763 “Milan” CPUs @ 2.2GHz | 128 | 256 GB | 2028 | +| B | 6 | Two AMD Epyc 7763 “Milan” CPUs @ 2.2GHz | 128 | 1 TB | 2028 | +| C | 16 | Two AMD Epyc 7763 “Milan” CPUs @ 2.2GHz | 128 | 512 GB | 2028 | +| G | 5 | Two AMD Epyc 7313 “Milan” CPUs @ 3.0GHz, Three AMD MI210 GPUs (64GB) | 32 | 512 GB | 2028 | + +Negishi 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 Negishi, the following set of compiler and message-passing libraries for parallel code are recommended: + +* GCC 12.2.0 +* OpenMPI or MVAPICH2 + + diff --git a/docs/userguides/negishi/run_jobs/creating_the_submission_script.md b/docs/userguides/negishi/run_jobs/creating_the_submission_script.md new file mode 100644 index 00000000..21f2c913 --- /dev/null +++ b/docs/userguides/negishi/run_jobs/creating_the_submission_script.md @@ -0,0 +1,53 @@ +--- +tags: + - Negishi +authors: + - hkashgar +resource: Negishi +search: + boost: 2 +--- + +# Creatting the Slurm Job Submission Script + +### 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 that includes special comments to specify sbatch options. It will set any required environment variables, load any necessary modules, create or modify files and directories, and run any applications that you need. A simple submission script to the {{ resource }} cpu partition looks like: + +``` bash +#!/bin/bash +# FILENAME: myjobsubmissionfile + +#SBATCH --account=myLabAccount +#SBATCH --partition=cpu +#SBATCH --qos=normal +#SBATCH --nodes=1 +#SBATCH --ntasks=1 +#SBATCH --time=1-00:00:00 + +# 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/negishi/run_jobs/index.md b/docs/userguides/negishi/run_jobs/index.md new file mode 100644 index 00000000..3e448eae --- /dev/null +++ b/docs/userguides/negishi/run_jobs/index.md @@ -0,0 +1,47 @@ +--- +tags: + - Negishi +authors: + - hkashgar +resource: Negishi +search: + boost: 2 +--- + +# Running Jobs + +Jobs are submitted on {{ resource }} 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 Negishi. Always use SLURM to submit your work as a job. + +Before creating your submission script, learn more about how to use Slurm accounts, partitions, and QOS options: + +- [**Basics of using Slurm accounts, partitions, and QOS options**](queues.md) + +Batch jobs submitted via SLURM have four main steps: + +- [**Creating the submission script**](creating_the_submission_script.md) +- [**Submitting the script as a job**](submit_script.md) +- [**Monitoring the job**](monitoring_job.md) +- [**Checking the job output**](checking_output.md) + +### Other useful topics + +- [**Holding a job**](holding_job.md) +- [**Job Dependencies**](job_dependencies.md) +- [**Cancelling a job**](cancelling_job.md) +- [**GPU Usage Monitoring**](gpu_usage_monitoring.md) + +### Example jobs + +- [**Generic SLURM jobs**](generic_slurm_jobs.md) +- [**Python**](python_example.md) +- [**R**](r_example.md) +- [**Apptainer**](apptainer_example.md) +- [**Matlab**](matlab_example.md) +- [**Ansys**](ansysfluent_example.md) +- [**Gaussian**](gaussian_example.md) +- [**MPI**](mpi_jobs.md) +- [**OpenMP**](openmp_jobs.md) +- [**GPU**](gpu_jobs.md) diff --git a/docs/userguides/negishi/run_jobs/queues.md b/docs/userguides/negishi/run_jobs/queues.md new file mode 100644 index 00000000..c5b4d8e9 --- /dev/null +++ b/docs/userguides/negishi/run_jobs/queues.md @@ -0,0 +1,118 @@ +--- +tags: + - Negishi +authors: + - hkashgar +resource: Negishi +search: + boost: 2 +--- + +# Slurm accounts, partitions, and QOS options +## Queues + +On Negishi, the required options for job submission deviates from some of the other community clusters you might have experience using. In general every job submission will have four parts: “`sbatch --ntasks=1 --cpus-per-task=4 --partition=cpu --account=rcac --qos=standby`” + +1. The number and type of resources you want (`--ntasks=1 --cpus-per-task=4`) +2. The partition where the resources are located (`--partition=cpu`) +3. The account the resources should come out of ( `--account=rcac`) +4. The quality of service (QOS) this job expects from the resources (`--qos=standby`) + +Table Summary of Changes + +| Use Case | Old Syntax | New Syntax | +| --- | --- | --- | +| Submit a job to your group's account | `sbatch -A mygroup` | `sbatch -A mygroup -p cpu` | +| Submit a standby job | `sbatch -A standby` | `sbatch -A mygroup -p cpu -q standby` | +| Submit a highmem job | `sbatch -A highmem` | `sbatch -A mygroup -p highmem` | +| Submit a gpu job | `sbatch -A gpu` | `sbatch -A mygroup -p gpu` | +| Submit a job to your group's interactive account | `sbatch -A interactive` | `sbatch -A mygroup -p negishi -q interactive` | + +If you have used other clusters, you will be familiar with the first item. If you have not, you can read about how to format the request [on our job submission page.](https://www.rcac.purdue.edu/index.php/knowledge/negishi/run/slurm/submit) The rest of this page will focus on the last three items. + +## Partitions + +On Negishi, the various types of nodes on the cluster are organized into distinct partitions. This allows jobs to different node types to be charged separately and differently. This also means that Instead of only needing to specify the account name in the job script, the desired partition must also be specified. Each of these partitions is subject to different limitations and has a specific use case that will be described below.  + +### CPU Partition + +This partition contains the resources a group purchases access to when they purchase CPU resources on Negishi and is made up of 446 Bell-A nodes. Each of these nodes contains two Zen 3 AMD EPYC 7763 64-core processors for a total of 128 cores and 256 GB of memory for a total of more than 57,000 cores in the partition. Memory in this partition is allocated proportional to your core request such that each core is given about 2 GB of memory per core requested. Submission to this partition can be accomplished by using the option: `-p cpu` or `--partition=cpu`. + +The purchasing model for this partition allows groups to purchase high priority access to some number of cores. When an account uses resources in this account by submitting a job tagged with the `normal` QOS, the cores used by that job are withdrawn from the account and deposited back into the account when the job terminates. + +When using the CPU partition, jobs are tagged by the `normal` QOS by default, but they can be tagged with the `standby` QOS if explicitly submitted using the `-q standby` or `--qos=standby` option. + +1. Jobs tagged with the `normal` QOS are subject to the following policies: + 1. Jobs have a high priority and should not need to wait very long before starting. + 2. Any cores requested by these jobs are withdrawn from the account until the job terminates. + 3. These jobs can run for up to two weeks at a time. +2. Jobs tagged with the `standby` QOS are subject to the following policies: + 1. Jobs have a low priority and there is no expectation of job start time. If the partition is very busy with jobs using the `normal` QOS or if you are requesting a very large job, then jobs using the `standby` QOS may take hours or days to start. + 2. These jobs can use idle resources on the cluster and as such cores requested by these jobs are not withdrawn from the account to which they were submitted. + 3. These jobs can run for up to four hours at a time. + +Available QOSes: `normal`, `standby` + +### Highmem Partition + +This partition is made up of 6 Bell-B nodes which have four times as much memory as a standard Bell-A node, and access to this partition is given to all accounts on the cluster to enable work that has higher memory requirements. Each of these nodes contains two Zen 2 AMD EPYC 7763 64-core processors for a total of 128 cores and 1 TB of memory. Memory in this partition is allocated proportional to your core request such that each core is given about 8 GB of memory per core requested. Submission to this partition can be accomplished by using the option: `-p highmem` or `--partition=highmem`. + +When using the Highmem partition, jobs are tagged by the `normal` QOS by default, and this is the only QOS that is available for this partition, so there is no need to specify a QOS when using this partition. Additionally jobs are tagged by a highmem partition QOS that enforces the following policies + +1. There is no expectation of job start time as these nodes are a shared resources that are given as a bonus for purchasing access to high priority access to resources on Negishi +2. You can have 2 jobs running in this partition at once +3. You can have 8 jobs submitted to thie partition at once +4. Your jobs must use more than 64 of the 128 cores on the node otherwise your memory footprint would fit on a standard Negishi-A node +5. These jobs can run for up to 24 hours at a time. + +Available QOSes: `normal` + +### GPU Partition + +This partition is made up of 5 Negishi-G nodes. Each of these nodes contains two AMD MI210s and two Zen 2 AMD EPYC 7313 16-core processors for a total of 32 cores and 512GB of memory. Memory in this partition is allocated proportional to your core request such that each core is given about 8 GB of memory per core requested. You should request cores proportional to the number of GPUs you are using in this partition (i.e. if you only need one of the two GPUs, you should request half of the cores on the node) Submission to this partition can be accomplished by using the option: `-p gpu` or `--partition=gpu`. + +When using the gpu partition, jobs are tagged by the `normal` QOS by default, and this is the only QOS that is available for this partition, so there is no need to specify a QOS when using this partition. Additionally jobs are tagged by a gpu partition QOS that enforces the following policies + +1. There is no expectation of job start time as these nodes are a shared resources that are given as a bonus for purchasing access to high priority access to resources on Negishi +2. You can use up to 2 GPUs in this partition at once +3. You can have 8 jobs submitted to thie partition at once +4. These jobs can run for up to 24 hours at a time. + +Available QOSes: `normal` + +### Login Partition + +This partition contains the resources a group purchases access to when they purchase "interactive access" on Negishi. Interactive access allows submission of jobs directly to the front ends for immediate job start times. These jobs can only request up to 4 CPUs and 8 GB of memory each and interactive users can only have one job at a time. Submission to this partition can be accomplished by using the option: `-p login` or `--partition=login`. In order to use this partition, you must submit using the interactive QOS which enforces the following policies: + +1. You can have one job running at a time. +2. You can use up to 4 cores and 8 GB of memory at a time. +3. Jobs can run for up to 24 hours. + +Available QOSes: `interactive` + +## Accounts + + +On the Negishi community cluster, users will have access to one or more accounts, also known as queues. These accounts are dedicated to and named after each partner who has purchased access to the cluster, and they provide partners and their researchers with priority access to their portion of the cluster. These accounts can be thought of as bank accounts that contain the resources a group has purchased access to which may include some number of cores. To see the list of accounts that you have access to on Negishi as well as the resources they contain, you can use the command `slist`. + +On Negishi, you must explicitly define the account that you want to submit to using the `-A`or`--account=` option. + +## Quality of Service (QOS) + +On Negishi, we use a Slurm concept called a Quality of Service or a QOS. A QOS can be thought of as a tag for a job that tells the scheduler how that job should be treated with respect to limits, priority, etc. The cluster administrators define the available QOSes as well as the policies for how each QOS should be treated on the cluster. A toy example of such a policy may be "no single user can have more than 200 jobs that has been tagged with a QOS named *highpriority*". + +There are two classes of QOSes and a job can have both: + +1. Partition QOSes: A partition QOS is a tag that is automatically added to your job when you submit to a partition that defines a partition QOS. +2. Job QOSes: A Job QOS is a tag that you explicitly give to a job using the option `-q`or`--qos=`. By explicitly tagging your jobs this way, you can choose the policy that each one of your jobs should abide by. We will describe the policies for the available job QOSes in the partition section below. + +As an extended metaphor, if we think of a job as a package that we need to have shipped to some destination, then the partition can be thought of as the carrier we decide to ship our package with. That carrier is going to have some company policies that dictate how you need to label/pack that package, and that company policy is like the partition QOS. It is the policy that is enforced for simply deciding to use that carrier, or in this case, deciding to submit to a particular partition. + +The Job QOS can then be thought of as the various different types of shipping options that carrier might offer. You might pay extra to have that package shipped overnight. On the other hand you may choose to pay less and have your package arrive as available. Once we decide to go with a particular carrier, we are subject to their company policy, but we also have some degree of control through choosing one of their available shipping options. In the same way, when you choose to submit to a partition, you are subject to the limits enforced by the partition QOS, but you may be able to ask for your job to be handled a particular way by specifying a job QOS offered by the partition. + +In order for a job to use a Job QOS, the user submitting the job must have access to the QOS, the account the job is being submitted to must accept the QOS, and the partition the job is being submitted to must accept the QOS. The below list of job QOSes are QOSes that every user and every account of Negishi has access to: + +1. `normal`: The `normal` QOS is the default job QOS on the cluster meaning if you do not explicitly list an alternative job QOS, your job will be tagged with this QOS. The policy for this QOS provides a high priority and does not add any additional limits. +2. `standby`: The `standby` QOS must be explicitly used if desired by using the option `-q standby` or `--qos=standby`. The policy for this QOS gives access to idle resources on the cluster. Jobs tagged with this QOS are "low priority" jobs and are only allowed to run for up to four hours at a time, however the resources used by these jobs do not count against the resources in your Account. For users of our previous clusters, usage of this QOS replaces the previous `-A standby` style of submission. + +Some of these QOSes may not be available in every partition. Each of the partitions in the following section will enumerate which of these QOSes are allowed in the partition. diff --git a/docs/userguides/negishi/run_jobs/submit_script.md b/docs/userguides/negishi/run_jobs/submit_script.md new file mode 100644 index 00000000..6947682b --- /dev/null +++ b/docs/userguides/negishi/run_jobs/submit_script.md @@ -0,0 +1,117 @@ +--- +tags: + - Negishi +authors: + - hkashgar +cluster: Negishi +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 Negishi, in order to submit jobs, you need to specify the partition, account and Quality of Service (QoS) name to which you want to submit your jobs. To familiarize yourself with the partitions and QoS available on Negishi, visit [Negishi Queues and Partitions](./queues.md). To check the available partitions on Negishi, you can use the `showpartitions` , and to check your available accounts you can use `slist` commands. Slurm uses the term "Account" with the option `-A` or `--account=` to specify different batch accounts, the option `-p` or `--partition=` to select a specific partition for job submission, and the option `-q` or `--qos=` . + +``` +Partition statistics for cluster negishi at Wed Jul 30 13:07:17 EDT 2025 + Partition #Nodes #CPU_cores Cores_pending Job_Nodes MaxJobTime Cores Mem/Node + Name State Total Idle Total Idle Resorc Other Min Max Day-hr:mn /node (GB) + negishi-nodes up$ 6 0 768 768 0 0 1 infin infinite 128 257 + cpu up$ 446 0 57088 57067 0 163 1 infin infinite 128 257 + highmem up$ 6 0 768 768 0 0 1 infin infinite 128 1031 + cms up$ 16 0 4096 3840 0 9036 1 infin infinite 256 515 + gpu up 5 0 160 0 0 30 1 infin infinite 32 515 + negishi-login up$ 8 0 2048 2048 0 0 1 infin infinite 256 515 +negishi-profiling up 4 3 512 512 0 0 1 infin infinite 128 257 +``` + +### CPU Partition + +The CPU partition on Negishi has two Quality of Service (QoS) levels: **normal** and **standby**. To submit your job to one compute node on `cpu` partition and 'normal' QoS which has "high priority": + +``` +$ sbatch --nodes=1 --ntasks=1 --partition=cpu --account=accountname --qos=normal myjobsubmissionfile +$ sbatch -N1 -n1 -p cpu -A accountname -q normal myjobsubmissionfile +``` + + To submit your job to one compute node on `cpu` partition and 'standby' QoS which is has "low priority": + +``` +$ sbatch --nodes=1 --ntasks=1 --partition=cpu --account=accountname --qos=standby myjobsubmissionfile +$ sbatch -N1 -n1 -p cpu -A accountname -q standby myjobsubmissionfile +``` + +### GPU Partition + +On the GPU partition on **Negishi** you don’t need to specify the QoS name because only one QoS exists for this partition, and the default is **normal**. To submit your job to one compute node requesting one GPU on the `gpu` partition under the 'normal' QoS which has "high priority": + +``` +$ sbatch --nodes=1 --gpus-per-node=1 --ntasks=1 --cpus-per-task=64 --partition=gpu --account=accountname myjobsubmissionfile +$ sbatch -N1 --gpus-per-node=1 -n1 -c64 -p gpu -A accountname -q normal myjobsubmissionfile +``` + +### Highmem Partition + +To submit your job to a compute node in the highmem partition, you don’t need to specify the QoS name because only one QoS exists for this partition, and the default is **normal**. However, the **highmem** partition is *only* suitable for jobs with memory requirements that exceed the capacity of a standard node, so the number of requested tasks should be appropriately high. + +``` +$ sbatch --nodes=1 --ntasks=1 --cpus-per-task=64 --partition=highmem --account=accountname myjobsubmissionfile +$ sbatch -N1 -n1 -c64 -p gpu -A accountname myjobsubmissionfile +``` + +### Login Partition + +The login partition is reserved for Negishi users who have purchased "interactive" access to Negishi. As an access control, in order to submit to this partition, you must supply the **interactive**QoS as a job option as this is the only QoS accepted by the partition. This partition is meant to give near-immediate start times to computationally modest jobs. + +``` +$ sbatch --nodes=1 --ntasks=1 --cpus-per-task=4 --partition=login --qos=interactive --account=accountname myjobsubmissionfile +$ sbatch -N1 -n1 -c4 -p gpu -q interactive -A accountname 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: + +``` +$ sbatch -t 01:30:00 -N=1 -n=1 -p=cpu -A=accountname -q=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. + +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: + +``` +$ sbatch -t 01:30:00 -N=2 -n=16 -p=cpu -A=accountname -q=standby myjobsubmissionfile +``` + +By default, jobs on Negishi will share nodes with other jobs. + +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=accountname +#SBATCH --nodes=1 +#SBATCH --ntasks=1 +#SBATCH --partition=cpu +#SBATCH --qos=normal +#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 weeks. How long it takes for a job to start depends on the specific queue, the resources and time requested, and other jobs already waiting in that queue requested as well. 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](/knowledge/${resource.dir}/run/slurm/status), wait for the job to complete, and [check the job output](/knowledge/${resource.dir}/run/slurm/output). + +​ diff --git a/docs/userguides/negishi/software.md b/docs/userguides/negishi/software.md new file mode 100644 index 00000000..538c8a4f --- /dev/null +++ b/docs/userguides/negishi/software.md @@ -0,0 +1,88 @@ +--- +tags: + - Negishi +authors: + - hkashgar +resource: Negishi +search: + boost: 2 +--- + +{% set resource = "negishi" %} + +# Software on Negishi + +## Software Catalog + +A comprehensive list of centrally installed software applications can be found here: + +[Software Catalog](../../software/app_catalog.md) + +## Module system + +{{ 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 +|---------------------- Core Applications --------------------- + amduprof/3.4-502 hyper-shell/2.1.0 openblas/0.3.21 + anaconda/2021.05-py38 hyper-shell/2.4.0 openjdk/1.8.0_265-b01 + anaconda/2022.10-py39 hyper-shell/2.5.1 openjdk/11.0.17_8 + anaconda/2024.02-py311 (D) hyper-shell/2.5.2 ovito/3.11.0 +[MORE...] +``` +### 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 hypershell + +------------------------------------------------------------- + hypershell: +------------------------------------------------------------- + Description: + A cross-platform, high-throughput computing utility for processing shell commands over a + distributed, asynchronous queue. + + Versions: + hypershell/2.6.2 + hypershell/2.6.5 + hypershell/2.7.0 + +``` +### Load the module +Use the command specified in the 'module spider' output to load your software module: + +``` bash +module load hypershell/2.7.0 +``` + +### 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). + +## ROCm Containers + +Negishi's GPU sub-cluster (Sub-cluster G) is equipped with AMD MI210 GPUs. A selection of GPU-enabled ROCm application containers from the AMD Infinity Hub collection is installed. + +Users can download additional ROCm containers from the [AMD Infinity Hub](https://www.amd.com/en/technologies/infinity-hub/) and run them directly using Apptainer/Singularity. A subset of pre-downloaded ROCm containers wrapped into convenient software modules are also provided. + +To see the lists of ROCm containers available as modules, use: + +```bash +$ module avail rocm +``` + +More information on pre-downloaded ROCm containers can be found [here](./../../../software/rocm_catalog). + +## BioContainers + +Pre-downloaded bioinformatics containers with module wrappers are available. You can load them as standard modules: + +```bash +$ module load biocontainers +``` +More information on pre-downloaded ROCm containers can be found [here](https://biocontainer-doc.readthedocs.io/). From 1708ed8942212766a8f003e8860b9d21345224e5 Mon Sep 17 00:00:00 2001 From: hkashgar Date: Thu, 11 Jun 2026 19:53:17 -0500 Subject: [PATCH 02/26] negishi userguide --- mkdocs.yml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/mkdocs.yml b/mkdocs.yml index eff519a9..8e41e4d1 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -154,6 +154,17 @@ nav: - Gateway (Open OnDemand): userguides/gilbreth/gateway.md - Compiling Source Code: userguides/gilbreth/compile.md - Frequently Asked Questions: userguides/gilbreth/faqs.md + - Negishi: + - userguides/negishi/index.md + - Negishi Overview: userguides/negishi/overview.md + - Biography of Negishi: userguides/negishi/biography.md + - Accounts: userguides/negishi/accounts.md + - Software: userguides/negishi/software.md + - Running Jobs: userguides/negishi/run_jobs/index.md + - File Storage and Transfer: userguides/negishi/storage.md + - Gateway (Open OnDemand): userguides/negishi/gateway.md + - Compiling Source Code: userguides/negishi/compile.md + - Frequently Asked Questions: userguides/negishi/faq.md - Scholar: - userguides/scholar/index.md - Scholar Overview: userguides/scholar/overview.md From 694b2ebee74afa45ae0417c11882b1d84f90f33d Mon Sep 17 00:00:00 2001 From: hkashgar Date: Thu, 11 Jun 2026 20:14:57 -0500 Subject: [PATCH 03/26] negishi breadcrumbs --- docs/assets/data/breadcrumbs.json | 51 ++++++++++++++++++++++++++++++- 1 file changed, 50 insertions(+), 1 deletion(-) diff --git a/docs/assets/data/breadcrumbs.json b/docs/assets/data/breadcrumbs.json index e5c2500e..aa4b42a4 100644 --- a/docs/assets/data/breadcrumbs.json +++ b/docs/assets/data/breadcrumbs.json @@ -165,6 +165,55 @@ "Bell User Guide", "Frequently Asked Questions" ], + "/userguides/negishi/": [ + "Home", + "Negishi User Guide" + ], + "/userguides/negishi/overview/": [ + "Home", + "Negishi User Guide", + "Negishi Overview" + ], + "/userguides/negishi/biography/": [ + "Home", + "Negishi User Guide", + "Biography of Negishi" + ], + "/userguides/negishi/accounts/": [ + "Home", + "Negishi User Guide", + "Accounts" + ], + "/userguides/negishi/software/": [ + "Home", + "Negishi User Guide", + "Software" + ], + "/userguides/negishi/run_jobs/": [ + "Home", + "Negishi User Guide", + "Running Jobs" + ], + "/userguides/negishi/storage/": [ + "Home", + "Negishi User Guide", + "File Storage and Transfer" + ], + "/userguides/negishi/gateway/": [ + "Home", + "Negishi User Guide", + "Gateway (Open OnDemand)" + ], + "/userguides/negishi/compile/": [ + "Home", + "Negishi User Guide", + "Compiling Source Code" + ], + "/userguides/negishii/faqs/": [ + "Home", + "Negishi User Guide", + "Frequently Asked Questions" + ], "/userguides/gautschi/": [ "Home", "Gautschi User Guide" @@ -972,4 +1021,4 @@ "Home", "FAQs" ] -} \ No newline at end of file +} From 323d276416a385a93a08c10e2d2190b4766f5554 Mon Sep 17 00:00:00 2001 From: hkashgar Date: Thu, 11 Jun 2026 22:01:04 -0500 Subject: [PATCH 04/26] Add monitoring_job.md and checking_output.md --- .../negishi/run_jobs/checking_output.md | 13 ++++ .../negishi/run_jobs/monitoring_job.md | 76 +++++++++++++++++++ 2 files changed, 89 insertions(+) create mode 100644 docs/userguides/negishi/run_jobs/checking_output.md create mode 100644 docs/userguides/negishi/run_jobs/monitoring_job.md diff --git a/docs/userguides/negishi/run_jobs/checking_output.md b/docs/userguides/negishi/run_jobs/checking_output.md new file mode 100644 index 00000000..7439f281 --- /dev/null +++ b/docs/userguides/negishi/run_jobs/checking_output.md @@ -0,0 +1,13 @@ +--- +tags: + - Negishi +authors: + - hkashgar +cluster: Negishi +search: + boost: 2 +--- + +--8<-- "docs/snippets/checking_output.md" + +[**Back to the Running Jobs section**](index.md) diff --git a/docs/userguides/negishi/run_jobs/monitoring_job.md b/docs/userguides/negishi/run_jobs/monitoring_job.md new file mode 100644 index 00000000..8190bb01 --- /dev/null +++ b/docs/userguides/negishi/run_jobs/monitoring_job.md @@ -0,0 +1,76 @@ +--- +tags: + - Negishi +authors: + - hkashgar +cluster: Negishi +search: + boost: 2 +--- + +# Monitoring the Job + +Once a job is [submitted](./submit_script.md) there are several commands you can use to monitor the progress of the job. + +To see your jobs, use the `squeue -u` command and specify your username: + +(Remember, in our SLURM environment a queue is referred to as an 'Account') + +```bash +squeue -u myusername + + JOBID ACCOUNT NAME USER ST TIME NODES NODELIST(REASON) + 182792 standby job1 myusername R 20:19 1 negishi-a000 + 185841 standby job2 myusername R 20:19 1 negishi-a001 + 185844 standby job3 myusername R 20:18 1 negishi-a002 + 185847 standby job4 myusername R 20:18 1 negishi-a003 +``` + +To retrieve useful information about your queued or running job, use the `scontrol show job` command with your job's ID number. The output should look similar to the following: + +```bash +scontrol show job 3519 + +JobId=3519 JobName=t.sub + UserId=${user.username} GroupId=mygroup MCS_label=N/A + Priority=3 Nice=0 Account=(null) QOS=(null) + JobState=PENDING Reason=BeginTime Dependency=(null) + Requeue=1 Restarts=0 BatchFlag=1 Reboot=0 ExitCode=0:0 + RunTime=00:00:00 TimeLimit=7-00:00:00 TimeMin=N/A + SubmitTime=2019-08-29T16:56:52 EligibleTime=2019-08-29T23:30:00 + AccrueTime=Unknown + StartTime=2019-08-29T23:30:00 EndTime=2019-09-05T23:30:00 Deadline=N/A + PreemptTime=None SuspendTime=None SecsPreSuspend=0 + LastSchedEval=2019-08-29T16:56:52 + Partition=workq AllocNode:Sid=mack-fe00:54476 + ReqNodeList=(null) ExcNodeList=(null) + NodeList=(null) + NumNodes=1 NumCPUs=2 NumTasks=2 CPUs/Task=1 ReqB:S:C:T=0:0:*:* + TRES=cpu=2,node=1,billing=2 + Socks/Node=* NtasksPerN:B:S:C=0:0:*:* CoreSpec=* + MinCPUsNode=1 MinMemoryNode=0 MinTmpDiskNode=0 + Features=(null) DelayBoot=00:00:00 + OverSubscribe=OK Contiguous=0 Licenses=(null) Network=(null) + Command=/home/${user.username}/jobdir/myjobfile.sub + WorkDir=/home/${user.username}/jobdir + StdErr=/home/${user.username}/jobdir/slurm-3519.out + StdIn=/dev/null + StdOut=/home/${user.username}/jobdir/slurm-3519.out + Power= + +``` + +There are several useful bits of information in this output. + +- ```JobState``` lets you know if the job is Pending, Running, Completed, or Held. + +- ```RunTime``` and ```TimeLimit``` will show how long the job has run and its maximum time. + +- ```SubmitTime``` is when the job was submitted to the cluster. + +- ```NumNodes```, ```NumCPUs```, ```NumTasks``` and ```CPUs/Task``` are the number of +Nodes, CPUs, Tasks, and - CPUs per Task are shown. + +- ```WorkDir``` is the job's working directory. + +[**Back to the Running Jobs section**](index.md) From e5bc5bd8d04cc075089832e940a75b80b6c1f3d8 Mon Sep 17 00:00:00 2001 From: hkashgar Date: Thu, 11 Jun 2026 22:36:31 -0500 Subject: [PATCH 05/26] Add example generic jobs --- .../negishi/run_jobs/cancelling_job.md | 13 +++++ .../negishi/run_jobs/generic_slurm_jobs.md | 28 ++++++++++ .../negishi/run_jobs/holding_job.md | 13 +++++ docs/userguides/negishi/run_jobs/index.md | 3 +- .../negishi/run_jobs/job_dependencies.md | 13 +++++ .../negishi/run_jobs/job_submission_matrix.md | 27 ++++++++++ .../userguides/negishi/run_jobs/simple_job.md | 52 +++++++++++++++++++ .../negishi/run_jobs/submit_script.md | 3 +- 8 files changed, 150 insertions(+), 2 deletions(-) create mode 100644 docs/userguides/negishi/run_jobs/cancelling_job.md create mode 100644 docs/userguides/negishi/run_jobs/generic_slurm_jobs.md create mode 100644 docs/userguides/negishi/run_jobs/holding_job.md create mode 100644 docs/userguides/negishi/run_jobs/job_dependencies.md create mode 100644 docs/userguides/negishi/run_jobs/job_submission_matrix.md create mode 100644 docs/userguides/negishi/run_jobs/simple_job.md diff --git a/docs/userguides/negishi/run_jobs/cancelling_job.md b/docs/userguides/negishi/run_jobs/cancelling_job.md new file mode 100644 index 00000000..30a3e4c7 --- /dev/null +++ b/docs/userguides/negishi/run_jobs/cancelling_job.md @@ -0,0 +1,13 @@ +--- +tags: + - Negishi +authors: + - hkashgar +cluster: Negishi +search: + boost: 2 +--- + +--8<-- "docs/snippets/cancelling_job.md" + +[**Back to the Running Jobs section**](index.md) diff --git a/docs/userguides/negishi/run_jobs/generic_slurm_jobs.md b/docs/userguides/negishi/run_jobs/generic_slurm_jobs.md new file mode 100644 index 00000000..28d2b10f --- /dev/null +++ b/docs/userguides/negishi/run_jobs/generic_slurm_jobs.md @@ -0,0 +1,28 @@ +--- +tags: + - Negishi +authors: + - hkashgar +resource: Negishi +search: + boost: 2 +hide: + - toc +--- + +# 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. + +- [**Simple Job**](simple_job.md) +- [**Multiple Node Job**](multiple_node.md) +- [**Directives**](directives.md) +- [**Specific Types of Nodes**](specific_nodes.md) +- [**Interactive Jobs**](interactive_jobs.md) +- [**Serial Jobs**](serial_jobs.md) +- [**OpenMP**](openmp.md) +- [**MPI**](mpi.md) +- [**Monitoring Resources**](monitoring_resources.md) + + +[**Back to the Running Jobs section**](index.md) diff --git a/docs/userguides/negishi/run_jobs/holding_job.md b/docs/userguides/negishi/run_jobs/holding_job.md new file mode 100644 index 00000000..cb1cebda --- /dev/null +++ b/docs/userguides/negishi/run_jobs/holding_job.md @@ -0,0 +1,13 @@ +--- +tags: + - Negishi +authors: + - hkashgar +cluster: Negishi +search: + boost: 2 +--- + +--8<-- "docs/snippets/holding_job.md" + +[**Back to the Running Jobs section**](index.md) diff --git a/docs/userguides/negishi/run_jobs/index.md b/docs/userguides/negishi/run_jobs/index.md index 3e448eae..266bd011 100644 --- a/docs/userguides/negishi/run_jobs/index.md +++ b/docs/userguides/negishi/run_jobs/index.md @@ -18,6 +18,7 @@ Jobs are submitted on {{ resource }} via the SLURM (Simple Linux Utility for Res Before creating your submission script, learn more about how to use Slurm accounts, partitions, and QOS options: - [**Basics of using Slurm accounts, partitions, and QOS options**](queues.md) + - [**Job Submission Matrix**](job_submission_matrix.md) Batch jobs submitted via SLURM have four main steps: @@ -31,7 +32,7 @@ Batch jobs submitted via SLURM have four main steps: - [**Holding a job**](holding_job.md) - [**Job Dependencies**](job_dependencies.md) - [**Cancelling a job**](cancelling_job.md) -- [**GPU Usage Monitoring**](gpu_usage_monitoring.md) + ### Example jobs diff --git a/docs/userguides/negishi/run_jobs/job_dependencies.md b/docs/userguides/negishi/run_jobs/job_dependencies.md new file mode 100644 index 00000000..62b4d495 --- /dev/null +++ b/docs/userguides/negishi/run_jobs/job_dependencies.md @@ -0,0 +1,13 @@ +--- +tags: + - Negishi +authors: + - hkashgar +cluster: Negishi +search: + boost: 2 +--- + +--8<-- "docs/snippets/job_dependencies.md" + +[**Back to the Running Jobs section**](index.md) diff --git a/docs/userguides/negishi/run_jobs/job_submission_matrix.md b/docs/userguides/negishi/run_jobs/job_submission_matrix.md new file mode 100644 index 00000000..9510ebb6 --- /dev/null +++ b/docs/userguides/negishi/run_jobs/job_submission_matrix.md @@ -0,0 +1,27 @@ +--- +tags: + - Negishi +authors: + - hkashgar +resource: Negishi +search: + boost: 2 +hide: + - toc + +--- + +# Job Submission Matrix + + +| Job Type | Partition | QoS | Job Submission Options | Number of Cores Per Account | Number of Jobs Per Account | Priority Accrual | Max Walltime | +| --- | --- | --- | --- | --- | --- | --- | --- | +| PI Queue | cpu | normal | `-A "mygroup" -p cpu` | Limited to purchased cores | No limit | No Limit | 2 weeks | +| Standby Job | cpu | standby | `-A "mygroup" -p cpu -q standby` | 14272 Cores | 5000 | No Limit | 4 hours | +| Highmem Job | highmem | normal | `-A "mygroup" -p highmem` | 128 Cores | 2 | 1 | 24 hours | +| GPU Job | gpu | normal | `-A "mygroup" -p gpu` | 64 cores/3 GPUs/1 Node | 2 | 1 | 24 hours | +| Interactive-Tier Queues | interactive | normal | `-A "mygroup" -p interactive` | 4 cores | 1 per user | 1 | 24 hours | + +Note: The normal QOS is the default and does not need to be specified. + +[**Back to the Running Jobs section**](index.md) \ No newline at end of file diff --git a/docs/userguides/negishi/run_jobs/simple_job.md b/docs/userguides/negishi/run_jobs/simple_job.md new file mode 100644 index 00000000..8fc2eb9e --- /dev/null +++ b/docs/userguides/negishi/run_jobs/simple_job.md @@ -0,0 +1,52 @@ +--- +tags: + - Negishi +authors: + - hkashgar +resource: Negishi +search: + boost: 2 +--- + +# Simple Jobs + +Every SLURM job consists of a job submission file. A job submission file contains a list of commands that run your program and a set of resource (nodes, walltime, queue) requests. The resource requests can appear in the job submission file or can be specified at submit-time as shown below. + +This simple example submits the job submission file `hello.sub` to the `standby` queue on Negishi and requests a single node: + +```bash +#!/bin/bash +# FILENAME: hello.sub + +# Show this ran on a compute node by running the hostname command. +hostname + +echo "Hello World" +``` +``` +sbatch -A standby --nodes=1 --ntasks=1 --cpus-per-task=1 --gpus-per-node=1 --time=00:01:00 hello.sub +Submitted batch job 3521 +``` + +For a real job you would replace ```echo "Hello World"``` with a command, or sequence of commands, that run your program. + +After your job finishes running, the ```ls``` command will show a new file in your directory, the ```.out``` file: + +```bash +ls -l +hello.sub +slurm-3521.out +``` + +The file ```slurm-3521.out``` contains the output and errors your program would have written to the screen if you had typed its commands at a command prompt: + +```bash +cat slurm-3521.out + +a001.negishi.rcac.purdue.edu +Hello World +``` + +You should see the hostname of the compute node your job was executed on. Following should be the "Hello World" statement. + +[**Back to the Example Jobs section**](generic_slurm_jobs.md) diff --git a/docs/userguides/negishi/run_jobs/submit_script.md b/docs/userguides/negishi/run_jobs/submit_script.md index 6947682b..ca9774be 100644 --- a/docs/userguides/negishi/run_jobs/submit_script.md +++ b/docs/userguides/negishi/run_jobs/submit_script.md @@ -16,6 +16,7 @@ Once you have a [job submission file](./creating_the_submission_script.md), you ``` Partition statistics for cluster negishi at Wed Jul 30 13:07:17 EDT 2025 + Partition #Nodes #CPU_cores Cores_pending Job_Nodes MaxJobTime Cores Mem/Node Name State Total Idle Total Idle Resorc Other Min Max Day-hr:mn /node (GB) negishi-nodes up$ 6 0 768 768 0 0 1 infin infinite 128 257 @@ -114,4 +115,4 @@ After you submit your job with `SBATCH`, it may wait in queue for minutes, hours Once your job is submitted, you can [monitor the job status](/knowledge/${resource.dir}/run/slurm/status), wait for the job to complete, and [check the job output](/knowledge/${resource.dir}/run/slurm/output). -​ +​[**Back to the Running Jobs section**](index.md) From efbe25902c1d1fe8d7389c9b0d993de7fa1c7ece Mon Sep 17 00:00:00 2001 From: hkashgar Date: Thu, 11 Jun 2026 23:00:24 -0500 Subject: [PATCH 06/26] Add example generic jobs --- .../userguides/negishi/run_jobs/directives.md | 42 +++++++++++++++++++ .../negishi/run_jobs/interactive_jobs.md | 31 ++++++++++++++ .../negishi/run_jobs/multiple_node.md | 34 +++++++++++++++ .../negishi/run_jobs/serial_jobs.md | 41 ++++++++++++++++++ .../negishi/run_jobs/specific_nodes.md | 36 ++++++++++++++++ 5 files changed, 184 insertions(+) create mode 100644 docs/userguides/negishi/run_jobs/directives.md create mode 100644 docs/userguides/negishi/run_jobs/interactive_jobs.md create mode 100644 docs/userguides/negishi/run_jobs/multiple_node.md create mode 100644 docs/userguides/negishi/run_jobs/serial_jobs.md create mode 100644 docs/userguides/negishi/run_jobs/specific_nodes.md diff --git a/docs/userguides/negishi/run_jobs/directives.md b/docs/userguides/negishi/run_jobs/directives.md new file mode 100644 index 00000000..cc15bbd9 --- /dev/null +++ b/docs/userguides/negishi/run_jobs/directives.md @@ -0,0 +1,42 @@ +--- +tags: + - Negishi +authors: + - hkashgar +resource: Negishi +search: + boost: 2 +--- + +# SLurm Directives + +So far these examples have shown submitting jobs with the resource requests on the ```sbatch``` command line such as: + +```bash +sbatch -A standby --nodes=1 --time=00:01:00 hello.sub +``` + +The resource requests can also be put into job submission file itself. Documenting the resource requests in the job submission is desirable because the job can be easily reproduced later. Details left in your command history are quickly lost. Arguments are specified with the ```#SBATCH``` syntax: + +```bash +#!/bin/bash + +# FILENAME: hello.sub +#SBATCH -A myallocation -p queue-name +#SBATCH --nodes=1 --time=00:01:00 + +# Show this ran on a compute node by running the hostname command. +hostname + +echo "Hello World" +``` + +The ```#SBATCH``` directives must appear at the top of your submission file. SLURM will stop parsing directives as soon as it encounters a line that does not start with '#'. If you insert a directive in the middle of your script, it will be ignored. + +This job can be then submitted with: + +```bash +sbatch hello.sub +``` + +[**Back to the Example Jobs section**](generic_slurm_jobs.md) \ No newline at end of file diff --git a/docs/userguides/negishi/run_jobs/interactive_jobs.md b/docs/userguides/negishi/run_jobs/interactive_jobs.md new file mode 100644 index 00000000..36b9d370 --- /dev/null +++ b/docs/userguides/negishi/run_jobs/interactive_jobs.md @@ -0,0 +1,31 @@ +--- +tags: + - Negishi +authors: + - hkashgar +resource: Negishi +search: + boost: 2 +--- + +# Running interactive jobs on Negishi + +Interactive jobs are run on compute nodes, while giving you a shell to interact with. They give you the ability to type commands or use a graphical interface in the same way as if you were on a front-end login host. + +To submit an interactive job, use ```sinteractive``` to run a login shell on allocated resources. + +```sinteractive``` accepts most of the same resource requests as ```sbatch```, so to request a login shell on the cpu account while allocating 2 nodes and 128 total cores, you might do: + +```bash +sinteractive -A cpu -N2 -n256 +``` + +To quit your interactive job: + +```bash +exit or Ctrl-D +``` + +The above example will allocate the total of 256 CPU cores across 2 nodes. Note that if your multi-node job requests fewer than each node's full 128 cores per node, by default Slurm provides no guarantee with respect to how this total is distributed between assigned nodes (i.e. the cores may not necessarily be split evenly). If you need specific arrangements of your tasks and cores, you can use ```--cpus-per-task=``` and/or ```--ntasks-per-node=``` flags. See [Slurm documentation](https://slurm.schedmd.com/salloc.html) or ```man salloc``` for more options. + +[**Back to the Example Jobs section**](generic_slurm_jobs.md) diff --git a/docs/userguides/negishi/run_jobs/multiple_node.md b/docs/userguides/negishi/run_jobs/multiple_node.md new file mode 100644 index 00000000..7d2d6f85 --- /dev/null +++ b/docs/userguides/negishi/run_jobs/multiple_node.md @@ -0,0 +1,34 @@ +--- +tags: + - Negishi +authors: + - hkashgar +resource: Negishi +search: + boost: 2 +--- + +# Multiple Node Job + +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. + +This example shows a request for multiple compute nodes. The job submission file contains a single command to show the names of the compute nodes allocated: + +```bash +# FILENAME: myjobsubmissionfile.sub +#!/bin/bash +echo "$SLURM_JOB_NODELIST" +``` +``` +sbatch --nodes=2 --ntasks=256 --time=00:10:00 -A standby myjobsubmissionfile.sub +``` + +Compute nodes allocated: + +```bash +[014-015].negishi +``` + +The above example will allocate the total of 256 CPU cores across 2 nodes. Note that if your multi-node job requests fewer than each node's full 128 cores per node, by default Slurm provides no guarantee with respect to how this total is distributed between assigned nodes (i.e. the cores may not necessarily be split evenly). If you need specific arrangements of your tasks and cores, you can use `--cpus-per-task=` and/or `--ntasks-per-node=` flags. See [Slurm documentation](https://slurm.schedmd.com/sbatch.html) or `man sbatch` for more options. + +[**Back to the Example Jobs section**](generic_slurm_jobs.md) diff --git a/docs/userguides/negishi/run_jobs/serial_jobs.md b/docs/userguides/negishi/run_jobs/serial_jobs.md new file mode 100644 index 00000000..2bee0320 --- /dev/null +++ b/docs/userguides/negishi/run_jobs/serial_jobs.md @@ -0,0 +1,41 @@ +--- +tags: + - Negishi +authors: + - hkashgar +resource: Negishi +search: + boost: 2 +--- + +# Running Serial Jobs + +This shows how to submit one of the serial programs compiled in the section [Compiling Serial Programs](../../compile/compile_serial.md). + +Create a job submission file: + +```bash +#!/bin/bash +# FILENAME: serial_hello.sub + +./serial_hello +``` + +Submit the job: + +```bash +sbatch --nodes=1 --ntasks=1 --time=00:01:00 serial_hello.sub +``` + +After the job completes, view results in the output file: + +```bash +cat slurm-myjobid.out + +Runhost:a009.negishi.rcac.purdue.edu +hello, world +``` + +If the job failed to run, then view error messages in the file ```slurm-myjobid.out```. + +[**Back to the Example Jobs section**](generic_slurm_jobs.md) diff --git a/docs/userguides/negishi/run_jobs/specific_nodes.md b/docs/userguides/negishi/run_jobs/specific_nodes.md new file mode 100644 index 00000000..277c8d04 --- /dev/null +++ b/docs/userguides/negishi/run_jobs/specific_nodes.md @@ -0,0 +1,36 @@ +--- +tags: + - Negishi +authors: + - hkashgar +resource: Negishi +search: + boost: 2 +--- + + +# Specific Types of Nodes + +SLURM allows running a job on [specific types of compute nodes](../overview.md) to accommodate special hardware requirements (e.g. a certain CPU or GPU type, etc.) + +Cluster nodes have a set of descriptive features assigned to them, and users can specify which of these features are required by their job by using the constraint option at submission time. Only nodes having features matching the job constraints will be used to satisfy the request. + +**Example:** a job requires a compute node in an "A" sub-cluster: + + +``` +sbatch --nodes=1 --ntasks=128 --constraint=A myjobsubmissionfile.sub +``` + +Compute node allocated: + +``` +a003.negishi +``` + +Feature constraints can be used for both batch and interactive jobs, as well as for individual job steps inside a job. Multiple constraints can be specified with a predefined syntax to achieve complex request logic (see detailed description of the '--constraint' option in `man sbatch` or online Slurm documentation). + +Refer to [Detailed Hardware Specification](../overview.md) section for list of available sub-cluster labels, their respective per-node memory sizes and other hardware details. You could also use `sfeatures` command to list available constraint feature names for different node types. + + +[**Back to the Example Jobs section**](generic_slurm_jobs.md) From 4e6e9f535687d7d84d1ee70ed35a0e1b28c7654b Mon Sep 17 00:00:00 2001 From: hkashgar Date: Fri, 12 Jun 2026 12:39:18 -0500 Subject: [PATCH 07/26] add mpi and openmp pages --- .../negishi/run_jobs/generic_slurm_jobs.md | 2 - docs/userguides/negishi/run_jobs/mpi_jobs.md | 121 ++++++++++++++++++ .../negishi/run_jobs/openmp_jobs.md | 82 ++++++++++++ 3 files changed, 203 insertions(+), 2 deletions(-) create mode 100644 docs/userguides/negishi/run_jobs/mpi_jobs.md create mode 100644 docs/userguides/negishi/run_jobs/openmp_jobs.md diff --git a/docs/userguides/negishi/run_jobs/generic_slurm_jobs.md b/docs/userguides/negishi/run_jobs/generic_slurm_jobs.md index 28d2b10f..12da83f6 100644 --- a/docs/userguides/negishi/run_jobs/generic_slurm_jobs.md +++ b/docs/userguides/negishi/run_jobs/generic_slurm_jobs.md @@ -20,8 +20,6 @@ The following examples demonstrate the basics of SLURM jobs, and are designed to - [**Specific Types of Nodes**](specific_nodes.md) - [**Interactive Jobs**](interactive_jobs.md) - [**Serial Jobs**](serial_jobs.md) -- [**OpenMP**](openmp.md) -- [**MPI**](mpi.md) - [**Monitoring Resources**](monitoring_resources.md) diff --git a/docs/userguides/negishi/run_jobs/mpi_jobs.md b/docs/userguides/negishi/run_jobs/mpi_jobs.md new file mode 100644 index 00000000..78469845 --- /dev/null +++ b/docs/userguides/negishi/run_jobs/mpi_jobs.md @@ -0,0 +1,121 @@ +--- +tags: + - Negishi +authors: + - hkashgar +resource: Negishi +search: + boost: 2 +--- + +# MPI + +An MPI job is a set of processes that take advantage of multiple compute nodes by communicating with each other. OpenMPI and Intel MPI (IMPI) are implementations of the MPI standard. + +This section shows how to submit one of the MPI programs compiled in the section [Compiling MPI Programs](../compile/compile_mpi.md). + +Use `module load` to set up the paths to access these libraries. Use `module avail` to see all MPI packages installed on Negishi. + +## Example MPI Job Submission File + +Create a job submission file named `mpi_hello.sub`: + +```bash +#!/bin/bash +# FILENAME: mpi_hello.sub +#SBATCH --nodes=2 +#SBATCH --ntasks-per-node=128 +#SBATCH --time=00:01:00 +#SBATCH -A standby + +srun -n 256 ./mpi_hello +``` + +SLURM can run an MPI program with the `srun` command. The number of processes is requested with the `-n` option. If you do not specify the `-n` option, it will default to the total number of processor cores you request from SLURM. + +If the code is built with OpenMPI, it can be run with a simple `srun -n` command. If it is built with Intel IMPI, then you also need to add the `--mpi=pmi2` option: `srun --mpi=pmi2 -n 256 ./mpi_hello` in this example. + +## Submit the MPI Job + +Submit the MPI job: + +```bash +sbatch ./mpi_hello.sub +``` + +## View Results + +View results in the output file: + +```bash +cat slurm-myjobid.out +``` + +Example output: + +```text +Runhost:a010.negishi.rcac.purdue.edu Rank:0 of 256 ranks hello, world +Runhost:a010.negishi.rcac.purdue.edu Rank:1 of 256 ranks hello, world +... +Runhost:a011.negishi.rcac.purdue.edu Rank:128 of 256 ranks hello, world +Runhost:a011.negishi.rcac.purdue.edu Rank:129 of 256 ranks hello, world +... +``` + +If the job failed to run, view error messages in the output file. + +## Reducing MPI Ranks Per Node for Memory-Heavy Jobs + +If an MPI job uses a lot of memory and 128 MPI ranks per compute node use all of the memory of the compute nodes, request more compute nodes while keeping the total number of MPI ranks unchanged. + +Submit the job with double the number of compute nodes and modify the resource request to halve the number of MPI ranks per compute node. + +Create or modify `mpi_hello.sub`: + +```bash +#!/bin/bash +# FILENAME: mpi_hello.sub +#SBATCH --nodes=4 +#SBATCH --ntasks-per-node=64 +#SBATCH -t 00:01:00 +#SBATCH -A standby + +srun -n 256 ./mpi_hello +``` + +Submit the job: + +```bash +sbatch ./mpi_hello.sub +``` + +View results in the output file: + +```bash +cat slurm-myjobid.out +``` + +Example output: + +```text +Runhost:a010.negishi.rcac.purdue.edu Rank:0 of 256 ranks hello, world +Runhost:a010.negishi.rcac.purdue.edu Rank:1 of 256 ranks hello, world +... +Runhost:a011.negishi.rcac.purdue.edu Rank:64 of 256 ranks hello, world +... +Runhost:a012.negishi.rcac.purdue.edu Rank:128 of 256 ranks hello, world +... +Runhost:a013.negishi.rcac.purdue.edu Rank:192 of 256 ranks hello, world +... +``` + +## Notes + +- Use `slist` to determine which queues, specified by the `--account` or `-A` option, are available to you. +- The queue available to everyone on Negishi is `standby`. +- Invoking an MPI program on Negishi with `./program` is typically wrong, since this will use only one MPI process and defeat the purpose of using MPI. +- Unless using only one MPI process is what you want, which is rarely the case, use `srun` or `mpiexec` to invoke an MPI program. +- In general, the exact order in which MPI ranks write similar output to an output file is random. + + +[**Back to the Running Jobs section**](index.md) \ No newline at end of file diff --git a/docs/userguides/negishi/run_jobs/openmp_jobs.md b/docs/userguides/negishi/run_jobs/openmp_jobs.md new file mode 100644 index 00000000..4ddc4038 --- /dev/null +++ b/docs/userguides/negishi/run_jobs/openmp_jobs.md @@ -0,0 +1,82 @@ +--- +tags: + - Negishi +authors: + - hkashgar +resource: Negishi +search: + boost: 2 +--- + +# OpenMP + +A shared-memory job is a single process that takes advantage of a multi-core processor and its shared memory to achieve parallelization. + +This example shows how to submit an OpenMP program compiled in the section [Compiling OpenMP Programs](../compile/compile_openmp.md). + +!!! note + When running OpenMP programs, all threads must be on the same compute node to take advantage of shared memory. The threads cannot communicate between nodes. + +## Set `OMP_NUM_THREADS` + +To run an OpenMP program, set the environment variable `OMP_NUM_THREADS` to the desired number of threads. + +In `csh`: + +```csh +setenv OMP_NUM_THREADS 128 +``` + +In `bash`: + +```bash +export OMP_NUM_THREADS=128 +``` + +This should almost always be equal to the number of cores on a compute node. You may want to set it to another appropriate value if you are running several processes in parallel in a single job or node. + +## Example Job Submission File + +Create a job submission file named `omp_hello.sub`: + +```bash +#!/bin/bash +# FILENAME: omp_hello.sub +#SBATCH --nodes=1 +#SBATCH --ntasks=128 +#SBATCH --time=00:01:00 + +export OMP_NUM_THREADS=128 +./omp_hello +``` + +## Submit the Job + +Submit the job: + +```bash +sbatch omp_hello.sub +``` + +## View Results + +View the results from one of the sample OpenMP programs about task parallelism: + +```bash +cat omp_hello.sub.omyjobid +``` + +Example output: + +```text +SERIAL REGION: Runhost:negishi.a003.rcac.purdue.edu Thread:0 of 1 thread hello, world +PARALLEL REGION: Runhost:negishi.a003.rcac.purdue.edu Thread:0 of 128 threads hello, world +PARALLEL REGION: Runhost:negishi.a003.rcac.purdue.edu Thread:1 of 128 threads hello, world + ... +``` + +If the job failed to run, view error messages in the file `slurm-myjobid.out`. + +If an OpenMP program uses a lot of memory and 128 threads use all of the memory of the compute node, use fewer processor cores, or OpenMP threads, on that compute node. + +[**Back to the Running Jobs section**](index.md) \ No newline at end of file From 01c9d2b27d82c3a99534c23d2bef2febe52fd301 Mon Sep 17 00:00:00 2001 From: hkashgar Date: Fri, 12 Jun 2026 15:21:33 -0500 Subject: [PATCH 08/26] matlab pages --- docs/userguides/negishi/run_jobs/index.md | 6 +- docs/userguides/negishi/run_jobs/matlab.md | 33 ++++ .../run_jobs/matlab/implicit_parallelism.md | 35 ++++ .../negishi/run_jobs/matlab/interpreter.md | 98 +++++++++++ .../negishi/run_jobs/matlab/mdcs_parallel.md | 164 ++++++++++++++++++ .../negishi/run_jobs/matlab/parfor.md | 145 ++++++++++++++++ .../run_jobs/matlab/profile_manager.md | 29 ++++ .../negishi/run_jobs/matlab/spmd.md | 152 ++++++++++++++++ .../negishi/run_jobs/monitoring_resources.md | 91 ++++++++++ 9 files changed, 750 insertions(+), 3 deletions(-) create mode 100644 docs/userguides/negishi/run_jobs/matlab.md create mode 100644 docs/userguides/negishi/run_jobs/matlab/implicit_parallelism.md create mode 100644 docs/userguides/negishi/run_jobs/matlab/interpreter.md create mode 100644 docs/userguides/negishi/run_jobs/matlab/mdcs_parallel.md create mode 100644 docs/userguides/negishi/run_jobs/matlab/parfor.md create mode 100644 docs/userguides/negishi/run_jobs/matlab/profile_manager.md create mode 100644 docs/userguides/negishi/run_jobs/matlab/spmd.md create mode 100644 docs/userguides/negishi/run_jobs/monitoring_resources.md diff --git a/docs/userguides/negishi/run_jobs/index.md b/docs/userguides/negishi/run_jobs/index.md index 266bd011..4e273252 100644 --- a/docs/userguides/negishi/run_jobs/index.md +++ b/docs/userguides/negishi/run_jobs/index.md @@ -37,10 +37,10 @@ Batch jobs submitted via SLURM have four main steps: ### Example jobs - [**Generic SLURM jobs**](generic_slurm_jobs.md) -- [**Python**](python_example.md) +- [**Python**](python.md) - [**R**](r_example.md) -- [**Apptainer**](apptainer_example.md) -- [**Matlab**](matlab_example.md) +- [**Apptainer**](apptainer.md) +- [**Matlab**](matlab.md) - [**Ansys**](ansysfluent_example.md) - [**Gaussian**](gaussian_example.md) - [**MPI**](mpi_jobs.md) diff --git a/docs/userguides/negishi/run_jobs/matlab.md b/docs/userguides/negishi/run_jobs/matlab.md new file mode 100644 index 00000000..cc1bfb3a --- /dev/null +++ b/docs/userguides/negishi/run_jobs/matlab.md @@ -0,0 +1,33 @@ +--- +tags: + - Negishi +authors: + - hkashgar +resource: Negishi +search: + boost: 2 +--- + +# Matlab + +*MATLAB®* (MATrix LABoratory) is a high-level language and interactive environment for numerical computation, visualization, and programming. MATLAB is a product of [MathWorks](http://www.mathworks.com/). + +MATLAB, Simulink, Compiler, and several of the optional toolboxes are available to faculty, staff, and students. To see the kind and quantity of all MATLAB licenses plus the number that you are currently using you can use the `matlab_licenses` command: + +```bash +$ module load matlab +$ matlab_licenses +``` + +The MATLAB client can be run in the front-end for application development, however, computationally intensive jobs must be run on compute nodes. + +The following sections provide several examples illustrating how to submit MATLAB jobs to a Linux compute cluster. + +* [**Matlab Script (`.m` File)**](./matlab/interpreter.md) +* [**Implicit Parallelism**](./matlab/implicit_parallelism.md) +* [**Profile Manager**](./matlab/profile_manager.md) +* [**Parallel Computing Toolbox (parfor)**](./matlab/parfor.md) +* [**Parallel Toolbox (spmd)**](./matlab/spmd.md) +* [**Distributed Computing Server (parallel job)**](./matlab/mdcs_parallel.md) + +[**Back to the Running Jobs section**](index.md) \ No newline at end of file diff --git a/docs/userguides/negishi/run_jobs/matlab/implicit_parallelism.md b/docs/userguides/negishi/run_jobs/matlab/implicit_parallelism.md new file mode 100644 index 00000000..5b6b6e0d --- /dev/null +++ b/docs/userguides/negishi/run_jobs/matlab/implicit_parallelism.md @@ -0,0 +1,35 @@ +--- +tags: + - Negishi +authors: + - hkashgar +resource: Negishi +search: + boost: 2 +--- + +# Implicit Parallelism + +MATLAB implements *implicit parallelism* which is automatic multithreading of many computations, such as matrix multiplication, linear algebra, and performing the same operation on a set of numbers. This is different from the explicit parallelism of the Parallel Computing Toolbox. + +MATLAB offers implicit parallelism in the form of thread-parallel enabled functions. Since these processor cores, or threads, share a common memory, many MATLAB functions contain multithreading potential. Vector operations, the particular application or algorithm, and the amount of computation (array size) contribute to the determination of whether a function runs serially or with multithreading. + +When your job triggers implicit parallelism, it attempts to allocate its threads on all processor cores of the compute node on which the MATLAB client is running, including processor cores running other jobs. This competition can degrade the performance of all jobs running on the node. + +!!! note + When you know that you are coding a serial job but are unsure whether you are using thread-parallel enabled operations, run MATLAB with implicit parallelism turned off. Beginning with the R2009b, you can turn multithreading off by starting MATLAB with `-singleCompThread`: + + ```bash + $ matlab -nodisplay -singleCompThread -r mymatlabprogram + ``` + +When you are using implicit parallelism, make sure you request exclusive access to a compute node, as MATLAB has no facility for sharing nodes. + +For more information about MATLAB's implicit parallelism: + +* [Which MATLAB functions benefit from multithreaded computation?](http://www.mathworks.com/support/solutions/en/data/1-4PG4AN/index.html?solution=1-4PG4AN) +* [What is the difference between "MATLAB as a fully-multithreaded application" versus "multithreaded computation"?](http://www.mathworks.com/support/solutions/en/data/1-3P8CC5/index.html) +* [MathWorks Website](http://www.mathworks.com/) + + +[**Back to Matlab**](../matlab.md) diff --git a/docs/userguides/negishi/run_jobs/matlab/interpreter.md b/docs/userguides/negishi/run_jobs/matlab/interpreter.md new file mode 100644 index 00000000..92551876 --- /dev/null +++ b/docs/userguides/negishi/run_jobs/matlab/interpreter.md @@ -0,0 +1,98 @@ +--- +tags: + - Negishi +authors: + - hkashgar +resource: Negishi +search: + boost: 2 +--- + +# Matlab Script (.m File) + +This section illustrates how to submit a small, serial, MATLAB program as a job to a batch queue. This MATLAB program prints the name of the run host and gets three random numbers. + +Prepare a MATLAB script `myscript.m`, and a MATLAB function file `myfunction.m`: + +```M +% FILENAME: myscript.m + +% Display name of compute node which ran this job. +[c name] = system('hostname'); +fprintf('\n\nhostname:%s\n', name); + +% Display three random numbers. +A = rand(1,3); +fprintf('%f %f %f\n', A); + +quit; +``` + +```M +% FILENAME: myfunction.m + +function result = myfunction () + + % Return name of compute node which ran this job. + [c name] = system('hostname'); + result = sprintf('hostname:%s', name); + + % Return three random numbers. + A = rand(1,3); + r = sprintf('%f %f %f', A); + result=strvcat(result,r); + +end +``` + +Also, prepare a job submission file, here named `myjob.sub`. Run with the name of the script: + +```bash +#!/bin/bash +# FILENAME: myjob.sub + +echo "myjob.sub" + +# Load module, and set up environment for Matlab to run +module load matlab + +unset DISPLAY + +# -nodisplay: run MATLAB in text mode; X11 server not needed +# -singleCompThread: turn off implicit parallelism +# -r: read MATLAB program; use MATLAB JIT Accelerator +# Run Matlab, with the above options and specifying our .m file +matlab -nodisplay -singleCompThread -r myscript +``` + +[Submit the job](../submit_script.md) + +[View job status](../monitoring_job.md) + +[View results of the job](../checking_output.md) + +```bash +myjob.sub + + < M A T L A B (R) > + Copyright 1984-2011 The MathWorks, Inc. + R2011b (7.13.0.564) 64-bit (glnxa64) + August 13, 2011 + +To get started, type one of these: helpwin, helpdesk, or demo. +For product information, visit www.mathworks.com. + +hostname: a001.negishi.rcac.purdue.edu +0.814724 0.905792 0.126987 +``` + +Output shows that a processor core on one compute node (a001) processed the job. Output also displays the three random numbers. + +For more information about MATLAB: + +* [inv()](http://www.mathworks.com/help/techdoc/ref/inv.html) +* [Run a Batch Job](http://www.mathworks.com/help/distcomp/introduction-to-parallel-solutions.html#brjw1fx-2) +* [Archived MathWorks Documentation](http://www.mathworks.com/help/doc-archives.html) +* [MathWorks Website](http://www.mathworks.com/) + +[**Back to Matlab**](../matlab.md) diff --git a/docs/userguides/negishi/run_jobs/matlab/mdcs_parallel.md b/docs/userguides/negishi/run_jobs/matlab/mdcs_parallel.md new file mode 100644 index 00000000..934311c3 --- /dev/null +++ b/docs/userguides/negishi/run_jobs/matlab/mdcs_parallel.md @@ -0,0 +1,164 @@ +--- +tags: + - Negishi +authors: + - hkashgar +resource: Negishi +search: + boost: 2 +--- + +# Distributed Computing Server (parallel job) + +The MATLAB Parallel Computing Toolbox (PCT) enables a parallel job via the MATLAB Distributed Computing Server (DCS). The tasks of a parallel job are identical, run simultaneously on several MATLAB workers, or labs, and communicate with each other. + +This example illustrates an MPI-like program. + +The example shows how to submit a small MATLAB parallel job with four workers running one MPI-like task to a batch queue. The MATLAB program broadcasts an integer to four workers and gathers the names of the compute nodes running the workers and the lab IDs of the workers. + +This example uses the job submission command to submit a MATLAB script with a user-defined cluster profile. The profile scatters the MATLAB workers onto different compute nodes. + +This method uses: + +- the MATLAB interpreter +- the Parallel Computing Toolbox +- the Distributed Computing Server + +It requires and checks out six licenses: + +- one MATLAB license for the client running on the compute node +- one Parallel Computing Toolbox license +- four Distributed Computing Server licenses + +Four DCS licenses run the four copies of the parallel job. + +This job is completely off the front end. + +## MATLAB Script + +Prepare a MATLAB script named `myscript.m`: + +```matlab +% FILENAME: myscript.m + +% Specify pool size. +% Convert the parallel job to a pool job. +parpool('4'); +spmd + +if labindex == 1 + % Lab (rank) #1 broadcasts an integer value to other labs (ranks). + N = labBroadcast(1,int64(1000)); +else + % Each lab (rank) receives the broadcast value from lab (rank) #1. + N = labBroadcast(1); +end + +% Form a string with host name, total number of labs, lab ID, and broadcast value. +[c name] =system('hostname'); +name = name(1:length(name)-1); +fmt = num2str(floor(log10(numlabs))+1); +str = sprintf(['%s:%d:%' fmt 'd:%d '], name,numlabs,labindex,N); + +% Apply global concatenate to all str's. +% Store the concatenation of str's in the first dimension (row) and on lab #1. +result = gcat(str,1,1); +if labindex == 1 + disp(result) +end + +end % spmd +matlabpool close force; +quit; +``` + +## SLURM Job Submission File + +Prepare a job submission file. In this example, the file is named `myjob.sub`. + +Run with the name of the script: + +```bash +# FILENAME: myjob.sub + +echo "myjob.sub" + +module load matlab + +unset DISPLAY + +# -nodisplay: run MATLAB in text mode; X11 server not needed +# -r: read MATLAB program; use MATLAB JIT Accelerator +matlab -nodisplay -r myscript +``` + +## Set the Default Parallel Configuration + +Run MATLAB to set the default parallel configuration to your appropriate profile: + +```bash +matlab -nodisplay +``` + +Then, inside MATLAB: + +```matlab +defaultParallelConfig('myslurmprofile'); +quit; +``` + +## Submit the Job + +Submit the job as a single compute node with one processor core. + +Once this job starts, a second job submission is made. + +## Example Output + +The output may look similar to this: + +```text +myjob.sub + < M A T L A B (R) > + Copyright 1984-2011 The MathWorks, Inc. + R2011b (7.13.0.564) 64-bit (glnxa64) + August 13, 2011 + +To get started, type one of these: helpwin, helpdesk, or demo. +For product information, visit www.mathworks.com. +>Starting matlabpool using the 'myslurmprofile' configuration ... connected to 4 labs. +Lab 1: + negishi.a006.rcac.purdue.edu:4:1:1000 + negishi.a007.rcac.purdue.edu:4:2:1000 + negishi.a008.rcac.purdue.edu:4:3:1000 + negishi.a009.rcac.purdue.edu:4:4:1000 +Sending a stop signal to all the labs ... stopped. +Did not find any pre-existing parallel jobs created by matlabpool. +``` + +The output shows the name of one compute node, `a006`, that processed the job submission file `myjob.sub`. + +The job submission scattered four processor cores, or four MATLAB labs, among four different compute nodes: + +- `a006` +- `a007` +- `a008` +- `a009` + +These nodes processed the four parallel regions. + +## Scaling Up + +To scale this method for a real application: + +1. Increase the wall time in the submission command to accommodate a longer-running job. +2. Increase the wall time of `myslurmprofile` by using the MATLAB Cluster Profile Manager. +3. In the Cluster Profile Manager, use the `Parallel` menu to enter a new wall time in the `SubmitArguments` property. + +## Additional Resources + +- [MathWorks MATLAB Parallel Computing Toolbox User's Guide](https://www.mathworks.com/help/parallel-computing/) +- [MathWorks MATLAB Distributed Computing Server User's Guide](https://www.mathworks.com/help/matlab-parallel-server/) +- [MathWorks Website](https://www.mathworks.com/) + +[**Back to Matlab**](../matlab.md) diff --git a/docs/userguides/negishi/run_jobs/matlab/parfor.md b/docs/userguides/negishi/run_jobs/matlab/parfor.md new file mode 100644 index 00000000..1f27ccfd --- /dev/null +++ b/docs/userguides/negishi/run_jobs/matlab/parfor.md @@ -0,0 +1,145 @@ +--- +tags: + - Negishi +authors: + - hkashgar +resource: Negishi +search: + boost: 2 +--- + +# Parallel Computing Toolbox (`parfor`) + +The MATLAB Parallel Computing Toolbox (PCT) extends MATLAB with high-level parallel-processing features such as parallel `for` loops, parallel regions, message passing, distributed arrays, and parallel numerical methods. + +This example illustrates the fine-grained parallelism of a parallel `for` loop, or `parfor`, in a pool job. + +The examples below show a method for submitting a small parallel MATLAB program with a `parfor` loop as a job to a queue. The MATLAB program prints the name of the run host and shows the values of the variables `numlabs` and `labindex` for each iteration of the `parfor` loop. + +This method uses the job submission command to submit a MATLAB client, which calls the MATLAB `batch()` function with a user-defined cluster profile. + +## MATLAB `parfor` Script + +Prepare a MATLAB pool program in a MATLAB script with an appropriate filename. In this example, the file is named `myscript.m`. + +```M +% FILENAME: myscript.m +% SERIAL REGION +[c name] = system('hostname'); +fprintf('SERIAL REGION: hostname:%s\n', name) +numlabs = parpool('poolsize'); +fprintf(' hostname numlabs labindex iteration\n') +fprintf(' ------------------------------- ------- -------- ---------\n') +tic; + +% PARALLEL LOOP +parfor i = 1:8 + [c name] = system('hostname'); + name = name(1:length(name)-1); + fprintf('PARALLEL LOOP: %-31s %7d %8d %9d\n', name,numlabs,labindex,i) + pause(2); +end + +% SERIAL REGION +elapsed_time = toc; % get elapsed time in parallel loop +fprintf('\n') +[c name] = system('hostname'); +name = name(1:length(name)-1); +fprintf('SERIAL REGION: hostname:%s\n', name) +fprintf('Elapsed time in parallel loop: %f\n', elapsed_time) +``` + +The execution of a pool job starts with a worker executing the statements of the first serial region up to the `parfor` block, where it pauses. A set of workers, called the pool, executes the `parfor` block. When they finish, the first worker resumes by executing the second serial region. + +The code displays the names of the compute nodes running the batch session and the worker pool. + +## MATLAB Batch Script + +Prepare a MATLAB script that calls the MATLAB `batch()` function. This creates a four-lab pool on which to run the MATLAB code in `myscript.m`. + +In this example, the file is named `mylclbatch.m`. + +```M +% FILENAME: mylclbatch.m + +!echo "mylclbatch.m" +!hostname + +pjob=batch('myscript','Profile','myslurmprofile','Pool',4,'CaptureDiary',true); +wait(pjob); +diary(pjob); +quit; +``` + +## SLURM Job Submission File + +Prepare a job submission file with an appropriate filename. In this example, the file is named `myjob.sub`. + +```bash +#!/bin/bash +# FILENAME: myjob.sub + +echo "myjob.sub" +hostname + +module load matlab + +unset DISPLAY + +matlab -nodisplay -r mylclbatch +``` + +## Submit the Job + +Submit the job as a single compute node with one processor core. + +One processor core runs `myjob.sub` and `mylclbatch.m`. + +Once this job starts, a second job submission is made by MATLAB through the configured SLURM cluster profile. + +## Example Output + +The output may look similar to this: + +```text +myjob.sub + < M A T L A B (R) > + Copyright 1984-2013 The MathWorks, Inc. + R2013a (8.1.0.604) 64-bit (glnxa64) + February 15, 2013 + +To get started, type one of these: helpwin, helpdesk, or demo. +For product information, visit www.mathworks.com. + +mylclbatch.m a000.gautschi.rcac.purdue.edu +SERIAL REGION: hostname:a000.gautschi.rcac.purdue.edu + hostname numlabs labindex iteration + ------------------------------- ------- -------- --------- +PARALLEL LOOP: a001.gautschi.rcac.purdue.edu 4 1 2 +PARALLEL LOOP: a002.gautschi.rcac.purdue.edu 4 1 4 +PARALLEL LOOP: a001.gautschi.rcac.purdue.edu 4 1 5 +PARALLEL LOOP: a002.gautschi.rcac.purdue.edu 4 1 6 +PARALLEL LOOP: a003.gautschi.rcac.purdue.edu 4 1 1 +PARALLEL LOOP: a003.gautschi.rcac.purdue.edu 4 1 3 +PARALLEL LOOP: a004.gautschi.rcac.purdue.edu 4 1 7 +PARALLEL LOOP: a004.gautschi.rcac.purdue.edu 4 1 8 +SERIAL REGION: hostname:a001.gautschi.rcac.purdue.edu + +Elapsed time in parallel loop: 5.411486 +``` + +## Scaling Up + +To scale this method for a real application: + +1. Increase the wall time in the SLURM submission command to accommodate a longer-running job. +2. Increase the wall time of `myslurmprofile` by using the MATLAB Cluster Profile Manager. +3. In the Cluster Profile Manager, use the `Parallel` menu to enter a new wall time in the `SubmitArguments` property. + +## Additional Resources + +- [MathWorks MATLAB Parallel Computing Toolbox User's Guide](https://www.mathworks.com/help/parallel-computing/) +- [MathWorks MATLAB Parallel Server Documentation](https://www.mathworks.com/help/matlab-parallel-server/) +- [MathWorks Website](https://www.mathworks.com/) + +[**Back to Matlab**](../matlab.md) diff --git a/docs/userguides/negishi/run_jobs/matlab/profile_manager.md b/docs/userguides/negishi/run_jobs/matlab/profile_manager.md new file mode 100644 index 00000000..806f6981 --- /dev/null +++ b/docs/userguides/negishi/run_jobs/matlab/profile_manager.md @@ -0,0 +1,29 @@ +--- +tags: + - Negishi +authors: + - hkashgar +resource: Negishi +search: + boost: 2 +--- + +# Profile Manager + +MATLAB offers two kinds of profiles for parallel execution: the `local` profile and user-defined cluster profiles. The 'local' profile runs a MATLAB job on the processor core(s) of the same compute node, or front-end, that is running the client. To run a MATLAB job on compute node(s) different from the node running the client, you must define a Cluster Profile using the `Cluster Profile Manager`. + +To prepare a user-defined cluster profile, use the `Cluster Profile Manager` in the `Parallel` menu. This profile contains the scheduler details (queue, nodes, processors, walltime, etc.) of your job submission. Ultimately, your cluster profile will be an argument to MATLAB functions like `batch()`. + +For your convenience, a generic cluster profile is provided that can be downloaded: [`myslurmprofile.settings`](../../../../assets/scripts/userguides/myslurmprofile.settings) + +Please note that modifications are very likely to be required to make `myslurmprofile.settings` work. You may need to change values for number of nodes, number of workers, walltime, and submission queue specified in the file. As well, the generic profile itself depends on the particular job scheduler on the cluster, so you may need to download or create two or more generic profiles under different names. Each time you run a job using a Cluster Profile, make sure the specific profile you are using is appropriate for the job and the cluster. + +To import the profile, start a MATLAB session and select `Manage Cluster Profiles...` from the Parallel menu. In the Cluster Profile Manager, select `Import`, navigate to the folder containing the profile, select `myslurmprofile.settings` and click `OK`. Remember that the profile will need to be customized for your specific needs. If you have any questions, please contact us. + +For detailed information about MATLAB's Parallel Computing Toolbox, examples, demos, and tutorials: + +* [MATLAB - Parallel Computing Toolbox](http://www.mathworks.com/help/distcomp/index.html) +* [MATLAB Parallel Computing Toolbox: Introduction to Parallel Solutions](http://www.mathworks.com/help/distcomp/introduction-to-parallel-solutions.html) +* [MATLAB Parallel Computing Toolbox: Clusters and Cluster Profiles](https://www.mathworks.com/help/parallel-computing/discover-clusters-and-use-cluster-profiles.html) + +[**Back to Matlab**](../matlab.md) diff --git a/docs/userguides/negishi/run_jobs/matlab/spmd.md b/docs/userguides/negishi/run_jobs/matlab/spmd.md new file mode 100644 index 00000000..3904b563 --- /dev/null +++ b/docs/userguides/negishi/run_jobs/matlab/spmd.md @@ -0,0 +1,152 @@ +--- +tags: + - Negishi +authors: + - hkashgar +resource: Negishi +search: + boost: 2 +--- + +# Parallel Toolbox (`spmd`) + +The MATLAB Parallel Computing Toolbox (PCT) extends the MATLAB language with high-level parallel-processing features such as parallel `for` loops, parallel regions, message passing, distributed arrays, and parallel numerical methods. + +It offers a shared-memory computing environment with a maximum number of MATLAB workers running on the local configuration in addition to your MATLAB client. MATLAB Distributed Computing Server (DCS) can scale PCT applications up to the limit of your DCS licenses. + +This example shows how to submit a small parallel MATLAB program with a parallel region, using an `spmd` statement, as a MATLAB pool job to a batch queue. + +This method uses the job submission command to submit a MATLAB client to compute nodes. The MATLAB client interprets a MATLAB `.m` file with a user-defined cluster profile, which scatters the MATLAB workers onto different compute nodes. + +This method uses the MATLAB interpreter, the Parallel Computing Toolbox, and the Distributed Computing Server. It requires and checks out six licenses: + +- one MATLAB license for the client running on the compute node +- one Parallel Computing Toolbox license +- four Distributed Computing Server licenses + +Four DCS licenses run the four copies of the `spmd` statement. This job is completely off the front end. + +## MATLAB `spmd` Script + +Prepare a MATLAB script called `myscript.m`: + +```matlab +% FILENAME: myscript.m + +% SERIAL REGION +[c name] = system('hostname'); +fprintf('SERIAL REGION: hostname:%s\n', name) +p = parpool('4'); +fprintf(' hostname numlabs labindex\n') +fprintf(' ------------------------------- ------- --------\n') +tic; + +% PARALLEL REGION +spmd + [c name] = system('hostname'); + name = name(1:length(name)-1); + fprintf('PARALLEL REGION: %-31s %7d %8d\n', name,numlabs,labindex) + pause(2); +end + +% SERIAL REGION +elapsed_time = toc; % get elapsed time in parallel region +delete(p); +fprintf('\n') +[c name] = system('hostname'); +name = name(1:length(name)-1); +fprintf('SERIAL REGION: hostname:%s\n', name) +fprintf('Elapsed time in parallel region: %f\n', elapsed_time) +quit; +``` + +## SLURM Job Submission File + +Prepare a job submission file with an appropriate filename. In this example, the file is named `myjob.sub`. + +Run with the name of the script: + +```bash +#!/bin/bash +# FILENAME: myjob.sub + +echo "myjob.sub" +module load matlab + +unset DISPLAY + +matlab -nodisplay -r myscript +``` + +## Set the Default Parallel Configuration + +Run MATLAB to set the default parallel configuration to your job configuration: + +```bash +matlab -nodisplay +``` + +Then, inside MATLAB: + +```matlab +parallel.defaultClusterProfile('myslurmprofile'); +quit; +``` + +## Submit the Job + +Submit the job using `sbatch`. + +Once this job starts, a second job submission is made by MATLAB through the configured SLURM cluster profile. + +## Example Output + +The output may look similar to this: + +```text +myjob.sub + < M A T L A B (R) > + Copyright 1984-2011 The MathWorks, Inc. + R2011b (7.13.0.564) 64-bit (glnxa64) + August 13, 2011 + +To get started, type one of these: helpwin, helpdesk, or demo. +For product information, visit www.mathworks.com. + +SERIAL REGION: hostname:negishi.a001.rcac.purdue.edu +Starting matlabpool using the 'myslurmprofile' profile ... connected to 4 labs. + hostname numlabs labindex + ------------------------------- ------- -------- +Lab 2: + PARALLEL REGION: negishi.a002.rcac.purdue.edu 4 2 +Lab 1: + PARALLEL REGION: negishi.a001.rcac.purdue.edu 4 1 +Lab 3: + PARALLEL REGION: negishi.a003.rcac.purdue.edu 4 3 +Lab 4: + PARALLEL REGION: negishi.a004.rcac.purdue.edu 4 4 +Sending a stop signal to all the labs ... stopped. + +SERIAL REGION: hostname:negishi.a001.rcac.purdue.edu +Elapsed time in parallel region: 3.382151 +``` + +The output shows that one compute node, `a001`, processed the job submission file `myjob.sub` and the two serial regions. + +The job submission scattered four processor cores, or four MATLAB labs, among four different compute nodes: + +- `a001` +- `a002` +- `a003` +- `a004` + +These nodes processed the four parallel regions. The total elapsed time demonstrates that the jobs ran in parallel. + +## Additional Resources + +- [MathWorks MATLAB Parallel Computing Toolbox User's Guide](https://www.mathworks.com/help/parallel-computing/) +- [MathWorks MATLAB Distributed Computing Server User's Guide](https://www.mathworks.com/help/matlab-parallel-server/) +- [MathWorks Website](https://www.mathworks.com/) + + +[**Back to Matlab**](../matlab.md) diff --git a/docs/userguides/negishi/run_jobs/monitoring_resources.md b/docs/userguides/negishi/run_jobs/monitoring_resources.md new file mode 100644 index 00000000..cde9ba6c --- /dev/null +++ b/docs/userguides/negishi/run_jobs/monitoring_resources.md @@ -0,0 +1,91 @@ +--- +tags: + - Negishi +authors: + - hkashgar +resource: Negishi +search: + boost: 2 +--- + +# Monitoring Resources + +## Collecting System Resource Utilization Data + +Knowing the precise resource utilization an application had during a job, such as CPU load or memory, can be incredibly useful. This is especially the case when the application isn't performing as expected. + +One approach is to run a program like ```htop``` during an interactive job and keep an eye on system resources. You can get precise time-series data from nodes associated with your job using [XDmod](https://xdmod.rcac.purdue.edu/) as well, online. But these methods don't gather telemetry in an automated fashion, nor do they give you control over the resolution or format of the data. + +As a matter of course, a robust implementation of some HPC workload would include resource utilization data as a diagnostic tool in the event of some failure. + +The ```monitor``` utility is a simple command line system resource monitoring tool for gathering such telemetry and is available as a module. + +```bash +module load monitor +``` + +Complete documentation is available online at [resource-monitor.readthedocs.io](https://resource-monitor.readthedocs.io/en/latest/). A full manual page is also available for reference, ``man monitor```. + +In the context of a SLURM job you will need to put this monitoring task in the background to allow the rest of your job script to proceed. Be sure to interrupt these tasks at the end of your job. + +```bash +#!/bin/bash +# FILENAME: monitored_job.sh + + module load monitor + +# track per-code CPU load +monitor cpu percent --all-cores >cpu-percent.log & +CPU_PID=$! + +# track memory usage +monitor cpu memory >cpu-memory.log & +MEM_PID=$! + +# your code here + +# shut down the resource monitors +kill -s INT $CPU_PID $MEM_PID +``` + +A particularly elegant solution would be to include such tools in your ```prologue``` script and have the tear down in your ```epilogue``` script. + +For large distributed jobs spread across multiple nodes, ```mpiexec``` can be used to gather telemetry from all nodes in the job. The hostname is included in each line of output so that data can be grouped as such. A concise way of constructing the needed list of hostnames in SLURM is to simply use ```srun hostname | sort -u```. + +```bash +#!/bin/bash +# FILENAME: monitored_job.sh + +module load monitor + +# track all CPUs (one monitor per host) +mpiexec -machinefile <(srun hostname | sort -u) \ + monitor cpu percent --all-cores >cpu-percent.log & +CPU_PID=$! + +# track memory on all hosts (one monitor per host) +mpiexec -machinefile <(srun hostname | sort -u) \ + monitor cpu memory >cpu-memory.log & +MEM_PID=$! + +# your code here + +# shut down the resource monitors +kill -s INT $CPU_PID $MEM_PID +``` + +To get resource data in a more readily computable format, the ```monitor``` program can be told to output in CSV format with the ```--csv``` flag. + +```bash +monitor cpu memory --csv >cpu-memory.csv +``` + +For a distributed job you will need to suppress the header lines otherwise one will be created by each host. + +```bash +monitor cpu memory --csv | head -1 >cpu-memory.csv +mpiexec -machinefile <(srun hostname | sort -u) \ + monitor cpu memory --csv --no-header >>cpu-memory.csv +``` + +[**Back to the Example Jobs section**](generic_slurm_jobs.md) From cbbcd56e1fa3575ffe15285c4cb5ce2123f76931 Mon Sep 17 00:00:00 2001 From: hkashgar Date: Fri, 12 Jun 2026 16:23:25 -0500 Subject: [PATCH 09/26] update python documentation --- docs/userguides/negishi/run_jobs/python.md | 34 ++ .../negishi/run_jobs/python/conda.md | 87 +++++ .../run_jobs/python/environment_example.md | 65 ++++ .../run_jobs/python/example_python_job.md | 98 ++++++ .../negishi/run_jobs/python/numpy.md | 39 +++ .../negishi/run_jobs/python/packages.md | 307 ++++++++++++++++++ .../userguides/negishi/run_jobs/python/pip.md | 59 ++++ .../negishi/run_jobs/python/source.md | 64 ++++ 8 files changed, 753 insertions(+) create mode 100644 docs/userguides/negishi/run_jobs/python.md create mode 100644 docs/userguides/negishi/run_jobs/python/conda.md create mode 100644 docs/userguides/negishi/run_jobs/python/environment_example.md create mode 100644 docs/userguides/negishi/run_jobs/python/example_python_job.md create mode 100644 docs/userguides/negishi/run_jobs/python/numpy.md create mode 100644 docs/userguides/negishi/run_jobs/python/packages.md create mode 100644 docs/userguides/negishi/run_jobs/python/pip.md create mode 100644 docs/userguides/negishi/run_jobs/python/source.md diff --git a/docs/userguides/negishi/run_jobs/python.md b/docs/userguides/negishi/run_jobs/python.md new file mode 100644 index 00000000..5455e2dd --- /dev/null +++ b/docs/userguides/negishi/run_jobs/python.md @@ -0,0 +1,34 @@ +--- +tags: + - Negishi +authors: + - jin456 +resource: Negishi +search: + boost: 2 +--- + +# Python examples on Negishi + +Python is a high-level, general-purpose, interpreted, dynamic programming language. We suggest using Anaconda which is a Python distribution made for large-scale data processing, predictive analytics, and scientific computing. For example, to use the default Anaconda distribution: + +```bash +$ module load conda +``` + +For a full list of available Anaconda and Python modules enter: + +```bash +$ module spider conda +``` + +- [**Example Python Jobs**](python/example_python_job.md) +- [**Managing Environments with Conda**](python/conda.md) +- [**Managing Packages with Pip**](python/pip.md) +- [**Installing Packages**](python/packages.md) +- [**Installing Packages from Source**](python/source.md) +- [**Example: Create and Use Biopython Environment with Conda**](python/environment_example.md) +- [**Numpy Parallel Behavior**](python/numpy.md) + + +[**Back to the Running Jobs section**](index.md) diff --git a/docs/userguides/negishi/run_jobs/python/conda.md b/docs/userguides/negishi/run_jobs/python/conda.md new file mode 100644 index 00000000..2c3225bf --- /dev/null +++ b/docs/userguides/negishi/run_jobs/python/conda.md @@ -0,0 +1,87 @@ +--- +tags: + - Negishi + - Python +authors: + - hkashgar +resource: Negishi +search: + boost: 2 +--- + +# Managing Environments with Conda + +Conda is a package manager in Anaconda that allows you to create and manage multiple environments where you can pick and choose which packages you want to use. To use Conda you must load an Anaconda module: + +``` +$ module load conda +``` + +Many packages are pre-installed in the global environment. To see these packages: + +``` +$ conda list +``` + +To create your own custom environment: + +``` +$ conda create --name MyEnvName python=3.8 FirstPackageName SecondPackageName -y +``` + +The `--name` option specifies that the environment created will be named MyEnvName. You can include as many packages as you require separated by a space. Including the `-y` option lets you skip the prompt to install the package. By default environments are created and stored in the $HOME/.conda directory. + +To create an environment at a custom location: + +``` +$ conda create --prefix=$HOME/MyEnvName python=3.8 PackageName -y +``` + +To see a list of your environments: + +``` +$ conda env list +``` + +To remove unwanted environments: + +``` +$ conda remove --name MyEnvName --all +``` + +To remove a package from an environment: + +``` +$ conda remove --name MyEnvName PackageName +``` + +Installing packages when creating your environment, instead of one at a time, will help you avoid dependency issues. + +To activate or deactivate an environment you have created: + +``` +$ source activate MyEnvName +$ source deactivate MyEnvName +``` + +If you created your conda environment at a custom location using `--prefix` option, then you can activate or deactivate it using the full path. + +``` +$ source activate $HOME/MyEnvName +$ source deactivate $HOME/MyEnvName +``` + +To use a custom environment inside a job you must load the module and activate the environment inside your job submission script. Add the following lines to your submission script: + +``` +$ module load conda +$ source activate MyEnvName +``` + +For more information about Python: + +* [The Python Programming Language - Official Website](http://www.python.org/) +* [Anaconda Python Distribution - Official Website](https://store.continuum.io/cshop/anaconda/) +* [Conda User Guide](https://conda.io/projects/conda/en/latest/user-guide/) + +[**Return to the Python**](../python.md) \ No newline at end of file diff --git a/docs/userguides/negishi/run_jobs/python/environment_example.md b/docs/userguides/negishi/run_jobs/python/environment_example.md new file mode 100644 index 00000000..2d249003 --- /dev/null +++ b/docs/userguides/negishi/run_jobs/python/environment_example.md @@ -0,0 +1,65 @@ +--- +tags: + - Negishi + - Python +authors: + - hkashgar +resource: Negishi +search: + boost: 2 +--- + + +# Example: Create and Use Biopython Environment with Conda + +## Using conda to create an environment that uses the biopython package + +To use Conda you must first load the anaconda module: + +``` +module load conda +``` + +Create an empty conda environment to install biopython: + +``` +conda-env-mod create -n biopython +``` + +Now activate the biopython environment: + +``` +module load use.own +module load conda-env/biopython-py3.12.5 +``` + +Install the biopython packages in your environment: + +``` +conda install --channel anaconda biopython -y +Fetching package metadata .......... +Solving package specifications ......... +....... +Linking packages ... +[ COMPLETE ]|################################################################ +``` + +The `--channel` option specifies that it searches the anaconda channel for the biopython package. The `-y` argument is optional and allows you to skip the installation prompt. A list of packages will be displayed as they are installed. + +Remember to add the following lines to your job submission script to use the custom environment in your jobs: + +``` +module load conda +module load use.own +module load conda-env/biopython-py3.12.5 +``` + +If you need further help or run into any issues with creating environments, contact us. + +For more information about Python: + +* [The Python Programming Language - Official Website](http://www.python.org/) +* [Anaconda Python Distribution - Official Website](https://store.continuum.io/cshop/anaconda/) +* [Conda User Guide](https://conda.io/projects/conda/en/latest/user-guide/) + +[**Return to the Python**](../python.md) \ No newline at end of file diff --git a/docs/userguides/negishi/run_jobs/python/example_python_job.md b/docs/userguides/negishi/run_jobs/python/example_python_job.md new file mode 100644 index 00000000..ac86d742 --- /dev/null +++ b/docs/userguides/negishi/run_jobs/python/example_python_job.md @@ -0,0 +1,98 @@ +--- +tags: + - Negishi + - Python +authors: + - hkashgar +resource: Negishi +search: + boost: 2 +--- + +# Example Python Jobs + +## Example 1: Hello world + +Prepare a Python input file with an appropriate filename, here named ```hello.py```: + +```bash +# FILENAME: hello.py + +import string, sys +print("Hello, world!") +``` + +Prepare a job submission file with an appropriate filename, here named ```myjob.sub```: + +```bash +#!/bin/bash +# FILENAME: myjob.sub + +module load conda + +python hello.py +``` + +Then, submit your job via SLURM and view the output file, which should simply output: + +```bash +Hello, world! +``` + +## Example 2: Matrix multiply + +Save the following script as ```matrix.py```: + +```bash +# Matrix multiplication program + +x = [[3,1,4],[1,5,9],[2,6,5]] +y = [[3,5,8,9],[7,9,3,2],[3,8,4,6]] + +result = [[sum(a*b for a,b in zip(x_row,y_col)) for y_col in zip(*y)] for x_row in x] + +for r in result: + print(r) +``` + +Change the last line in the job submission file above to read: + +```bash +python matrix.py +``` + +The standard output file from this job will result in the following matrix: + +```bash +[28, 56, 43, 53] +[65, 122, 59, 73] +[63, 104, 54, 60] +``` + +## Example 3: Sine wave plot using numpy and matplotlib packages + +Save the following script as ```sine.py```: + +```bash +import numpy as np +import matplotlib +matplotlib.use('Agg') +import matplotlib.pyplot as plt + +x = np.linspace(-np.pi, np.pi, 201) +plt.plot(x, np.sin(x)) +plt.xlabel('Angle [rad]') +plt.ylabel('sin(x)') +plt.axis('tight') +plt.savefig('sine.png') +``` + +Change your job submission file to submit this script and the job will output a png file and blank standard output and error files. + +For more information about Python: + +- [**The Python Programming Language - Official Website**](https://www.python.org/) +- [**Anaconda Python Distribution - Official Website**](https://store.continuum.io/cshop/anaconda/) +- [**Conda User Guide**](https://conda.io/projects/conda/en/latest/user-guide/) + +[**Back to the Python**](../python.md) diff --git a/docs/userguides/negishi/run_jobs/python/numpy.md b/docs/userguides/negishi/run_jobs/python/numpy.md new file mode 100644 index 00000000..0d9ea78b --- /dev/null +++ b/docs/userguides/negishi/run_jobs/python/numpy.md @@ -0,0 +1,39 @@ +--- +tags: + - Negishi + - Python +authors: + - hkashgar +resource: Negishi +search: + boost: 2 +--- + +# Numpy Parallel Behavior + +The widely available Numpy package is the best way to handle numerical computation in Python. The `numpy` package provided by our `anaconda` modules is optimized using Intel's MKL library. It will automatically parallelize many operations to make use of all the cores available on a machine. + +In many contexts that would be the ideal behavior. On the cluster however that very likely is not in fact the preferred behavior because often more than one user is present on the system and/or more than one job on a node. Having multiple processes contend for those resources will actually result in lesser performance. + +Setting the `MKL_NUM_THREADS` or `OMP_NUM_THREADS` environment variable(s) allows you to control this behavior. Our anaconda modules automatically set these variables to 1 *if and only if* you do not currently have that variable defined. + +When submitting batch jobs it is always a good idea to be explicit rather than implicit. If you are submitting a job that you want to make use of the full resources available on the node, set one or both of these variables to the number of cores you want to allow numpy to make use of. + +``` +#!/bin/bash + +module load conda +export MKL_NUM_THREADS=128 +... +``` + +If you are submitting multiple jobs that you intend to be scheduled together on the same node, it is probably best to restrict numpy to a single core. + +``` +#!/bin/bash + +module load conda +export MKL_NUM_THREADS=1 +``` + +[**Return to the Python**](../python.md) \ No newline at end of file diff --git a/docs/userguides/negishi/run_jobs/python/packages.md b/docs/userguides/negishi/run_jobs/python/packages.md new file mode 100644 index 00000000..6d56a643 --- /dev/null +++ b/docs/userguides/negishi/run_jobs/python/packages.md @@ -0,0 +1,307 @@ +--- +tags: + - Negishi + - Python +authors: + - hkashgar +resource: Negishi +search: + boost: 2 +--- + +# Installing Packages + +Installing Python packages in an Anaconda environment is recommended. One key advantage of Anaconda is that it allows users to install unrelated packages in separate self-contained environments. Individual packages can later be reinstalled or updated without impacting others. If you are unfamiliar with Conda environments, please check our [Conda Guide](../conda.md). + +To facilitate the process of creating and using Conda environments, we support a script (`conda-env-mod`) that generates a module file for an environment, as well as an optional Jupyter kernel to use this environment in a JupyterHub notebook. + +You must load one of the `anaconda` modules in order to use this script. + +``` +$ module load conda +``` + +Step-by-step instructions for installing custom Python packages are presented below. + +## Step 1: Create a conda environment + +Users can use the `conda-env-mod` script to create an empty conda environment. This script needs either a name or a path for the desired environment. After the environment is created, it generates a module file for using it in future. Please note that `conda-env-mod` is different from the official `conda-env` script and supports a limited set of subcommands. Detailed instructions for using `conda-env-mod` can be found with the command `conda-env-mod --help`. + +* **Example 1:** Create a conda environment named `mypackages` in user's `$HOME` directory. + + ``` + $ conda-env-mod create -n mypackages + ``` + +* **Example 2:** Create a conda environment named `mypackages` at a custom location. + + ``` + $ conda-env-mod create -p /depot/mylab/apps/mypackages + ``` + + Please follow the on-screen instructions while the environment is being created. After finishing, the script will print the instructions to use this environment. + + ``` + ... ... ... + Preparing transaction: ...working... done + Verifying transaction: ...working... done + Executing transaction: ...working... done + +------------------------------------------------------+ + | To use this environment, load the following modules: | + | module load use.own | + | module load conda-env/mypackages-py3.8.5 | + +------------------------------------------------------+ + Your environment "mypackages" was created successfully. + ``` + +Note down the module names, as you will need to load these modules every time you want to use this environment. You may also want to add the `module load` lines in your jobscript, if it depends on custom Python packages. + +By default, module files are generated in your `$HOME/privatemodules` directory. The location of module files can be customized by specifying the `-m /path/to/modules` option to `conda-env-mod`. + +**Note:** The main differences between `-p` and `-m` are: 1) `-p` will change the location of packages to be installed for the env and the module file will still be located at the `$HOME/privatemodules` directory as defined in use.own. 2) `-m` will only change the location of the module file. So the method to load modules created with `-m` and `-p` are different, see Example 3 for details. + +* **Example 3:** Create a conda environment named `labpackages` in your group's Data Depot space and place the module file at a shared location for the group to use. + + ``` + $ conda-env-mod create -p /depot/mylab/apps/labpackages -m /depot/mylab/etc/modules + ... ... ... + Preparing transaction: ...working... done + Verifying transaction: ...working... done + Executing transaction: ...working... done + +-------------------------------------------------------+ + | To use this environment, load the following modules: | + | module use /depot/mylab/etc/modules | + | module load conda-env/labpackages-py3.8.5 | + +-------------------------------------------------------+ + Your environment "labpackages" was created successfully. + ``` + +If you used a custom module file location, you need to run the `module use` command as printed by the command output above. + +By default, only the environment and a module file are created (no Jupyter kernel). If you plan to use your environment in a JupyterHub notebook, you need to append a `--jupyter` flag to the above commands. + +* **Example 4:** Create a Jupyter-enabled conda environment named `labpackages` in your group's Data Depot space and place the module file at a shared location for the group to use. + + ``` + $ conda-env-mod create -p /depot/mylab/apps/labpackages -m /depot/mylab/etc/modules --jupyter + ... ... ... + Jupyter kernel created: "Python (My labpackages Kernel)" + ... ... ... + Your environment "labpackages" was created successfully. + ``` + +## Step 2: Load the conda environment + + +* The following instructions assume that you have used `conda-env-mod` script to create an environment named `mypackages` (Examples 1 or 2 above). If you used `conda create` instead, please use `conda activate mypackages`. + + ``` + $ module load use.own + $ module load conda-env/mypackages-py3.8.5 + ``` + + Note that the `conda-env` module name includes the Python version that it supports (Python 3.8.5 in this example). This is same as the Python version in the `conda` module. +* If you used a custom module file location (Example 3 above), please use `module use` to load the `conda-env` module. + + ``` + $ module use /depot/mylab/etc/modules + $ module load conda-env/labpackages-py3.8.5 + ``` + +## Step 3: Install packages + + +Now you can install custom packages in the environment using either `conda install` or `pip install`. + +### Installing with conda + +* **Example 1:** Install OpenCV (open-source computer vision library) using conda. + + ``` + $ conda install opencv + ``` + +* **Example 2:** Install a specific version of OpenCV using conda. + + ``` + $ conda install opencv=4.5.5 + ``` + +* **Example 3:** Install OpenCV from a specific anaconda channel. + + ``` + $ conda install -c anaconda opencv + ``` + +### Installing with pip + +* **Example 4:** Install pandas using pip. + + ``` + $ pip install pandas + ``` + +* **Example 5:** Install a specific version of pandas using pip. + + ``` + $ pip install pandas==1.4.3 + ``` + + Follow the on-screen instructions while the packages are being installed. If installation is successful, please proceed to the next section to test the packages. + +**Note:** Do **NOT** run Pip with the `--user` argument, as that will install packages in a different location and might mess up your account environment. + +## Step 4: Test the installed packages + +To use the installed Python packages, you must load the module for your conda environment. If you have not loaded the `conda-env` module, please do so following the instructions at the end of Step 1. + +``` +$ module load use.own +$ module load conda-env/mypackages-py3.8.5 +``` + +* **Example 1:** Test that OpenCV is available. + + ``` + $ python -c "import cv2; print(cv2.__version__)" + ``` + +* **Example 2:** Test that pandas is available. + + ``` + $ python -c "import pandas; print(pandas.__version__)" + ``` + +If the commands finished without errors, then the installed packages can be used in your program. + +## Additional capabilities of conda-env-mod script + + +The `conda-env-mod` tool is intended to facilitate creation of a minimal Anaconda environment, matching module file and optionally a Jupyter kernel. Once created, the environment can then be accessed via familiar `module load` command, tuned and expanded as necessary. Additionally, the script provides several auxiliary functions to help manage environments, module files and Jupyter kernels. + +General usage for the tool adheres to the following pattern: + +``` +$ conda-env-mod help +$ conda-env-mod [optional arguments] +``` + +where required arguments are one of + +* `-n|--name ENV_NAME` (name of the environment) +* `-p|--prefix ENV_PATH` (location of the environment) + +and optional arguments further modify behavior for specific actions (e.g. `-m` to specify alternative location for generated module files). + +Given a required name or prefix for an environment, the `conda-env-mod` script supports the following subcommands: + +* `create` - to create a new environment, its corresponding module file and optional Jupyter kernel. +* `delete` - to delete existing environment along with its module file and Jupyter kernel. +* `module` - to generate just the module file for a given existing environment. +* `kernel` - to generate just the Jupyter kernel for a given existing environment (note that the environment has to be created with a `--jupyter` option). +* `help` - to display script usage help. + +Using these subcommands, you can iteratively fine-tune your environments, module files and Jupyter kernels, as well as delete and re-create them with ease. Below we cover several commonly occurring scenarios. + +**Note:** When you try to use `conda-env-mod delete`, remember to include the arguments as you create the environment (i.e. `-p package_location` and/or `-m module_location`). + +### Generating module file for an existing environment + +If you already have an existing configured Anaconda environment and want to generate a module file for it, follow appropriate examples from **Step 1** above, but use the `module` subcommand instead of the `create` one. E.g. + +``` +$ conda-env-mod module -n mypackages +``` + +and follow printed instructions on how to load this module. With an optional `--jupyter` flag, a Jupyter kernel will also be generated. + +**Note that** the module name `mypackages` should be exactly the same with the older conda environment name. **Note also that** if you intend to proceed with a Jupyter kernel generation (via the `--jupyter` flag or a `kernel` subcommand later), you will have to ensure that your environment has `ipython` and `ipykernel` packages installed into it. To avoid this and other related complications, we highly recommend making a fresh environment using a suitable `conda-env-mod create .... --jupyter` command instead. + +### Generating Jupyter kernel for an existing environment + +If you already have an existing configured Anaconda environment and want to generate a Jupyter kernel file for it, you can use the `kernel` subcommand. E.g. + +``` +$ conda-env-mod kernel -n mypackages +``` + +This will add a `"Python (My mypackages Kernel)"` item to the dropdown list of available kernels upon your next login to the JupyterHub. + +Note that generated Jupiter kernels are always personal (i.e. each user has to make their own, even for shared environments). Note also that you (or the creator of the shared environment) will have to ensure that your environment has `ipython` and `ipykernel` packages installed into it. + +### Managing and using shared Python environments + +Here is a suggested workflow for a common group-shared Anaconda environment with Jupyter capabilities: + +**The PI or lab software manager:** + +* Creates the environment and module file (once): + + ``` + $ module purge + $ module load conda + $ conda-env-mod create -p /depot/mylab/apps/labpackages -m /depot/mylab/etc/modules --jupyter + ``` + +* Installs required Python packages into the environment (as many times as needed): + + ``` + $ module use /depot/mylab/etc/modules + $ module load conda-env/labpackages-py3.8.5 + $ conda install ....... # all the necessary packages + ``` + +**Lab members:** + +* Lab members can start using the environment in their command line scripts or batch jobs simply by loading the corresponding module: + + ``` + $ module use /depot/mylab/etc/modules + $ module load conda-env/labpackages-py3.8.5 + $ python my_data_processing_script.py ..... + ``` + +* To use the environment in Jupyter notebooks, each lab member will need to create his/her own Jupyter kernel (once). This is because Jupyter kernels are private to individuals, even for shared environments. + + ``` + $ module use /depot/mylab/etc/modules + $ module load conda-env/labpackages-py3.8.5 + $ conda-env-mod kernel -p /depot/mylab/apps/labpackages + ``` + +A similar process can be devised for instructor-provided or individually-managed class software, etc. + +## Troubleshooting + +* Python packages often fail to install or run due to dependency incompatibility with other packages. More specifically, if you previously installed packages in your home directory it is safer to clean those installations. + + ``` + $ mv ~/.local ~/.local.bak + $ mv ~/.cache ~/.cache.bak + ``` + +* Unload all the modules. + + ``` + $ module purge + ``` + +* Clean up PYTHONPATH. + + ``` + $ unset PYTHONPATH + ``` + +* Next load the modules (e.g. anaconda) that you need. + + ``` + $ module load conda/2024.02-py311 + $ module load use.own + $ module load conda-env/2024.02-py311 + ``` + +* Now try running your code again. + +* Few applications only run on specific versions of Python (e.g. Python 3.6). Please check the documentation of your application if that is the case. + +[**Return to the Python**](../python.md) \ No newline at end of file diff --git a/docs/userguides/negishi/run_jobs/python/pip.md b/docs/userguides/negishi/run_jobs/python/pip.md new file mode 100644 index 00000000..eb8c5cb3 --- /dev/null +++ b/docs/userguides/negishi/run_jobs/python/pip.md @@ -0,0 +1,59 @@ +--- +tags: + - Negishi + - Python +authors: + - hkashgar +resource: Negishi +search: + boost: 2 +--- +# Managing Packages with Pip + +Pip is a Python package manager. Many Python package documentation provide `pip` instructions that result in permission errors because by default `pip` will install in a system-wide location and fail. + +``` + +Exception: +Traceback (most recent call last): +... ... stack trace ... ... +OSError: [Errno 13] Permission denied: '/apps/cent7/anaconda/2020.07-py38/lib/python3.8/site-packages/mkl_random-1.1.1.dist-info' +``` + +If you encounter this error, it means that you cannot modify the global Python installation. We recommend installing Python packages in a conda environment. Detailed instructions for installing packages with `pip` can be found in our [Python package installation page](../packages.md). + +Below we list some other useful `pip` commands. + +* Search for a package in PyPI channels: + + ``` + $ pip search packageName + ``` +* Check which packages are installed globally: + + ``` + $ pip list + ``` +* Check which packages you have personally installed: + + ``` + $ pip list --user + ``` +* Snapshot installed packages: + + ``` + $ pip freeze > requirements.txt + ``` +* You can install packages from a snapshot inside a new conda environment. Make sure to load the appropriate conda environment first. + + ``` + $ pip install -r requirements.txt + ``` + +For more information about Python: + +* [The Python Programming Language - Official Website](http://www.python.org/) +* [Anaconda Python Distribution - Official Website](https://store.continuum.io/cshop/anaconda/) +* [Conda User Guide](https://conda.io/projects/conda/en/latest/user-guide/) + +[**Return to the Python**](../python.md) \ No newline at end of file diff --git a/docs/userguides/negishi/run_jobs/python/source.md b/docs/userguides/negishi/run_jobs/python/source.md new file mode 100644 index 00000000..b1fd3d29 --- /dev/null +++ b/docs/userguides/negishi/run_jobs/python/source.md @@ -0,0 +1,64 @@ +--- +tags: + - Negishi + - Python +authors: + - hkashgar +resource: Negishi +search: + boost: 2 +--- + + +# Installing Packages from Source + +We maintain several [Anaconda](https://www.anaconda.com/) installations. Anaconda maintains numerous popular scientific Python libraries in a single installation. If you need a Python library not included with normal Python we recommend first checking Anaconda. For a list of modules currently installed in the Anaconda Python distribution: + +``` +$ module load conda +$ conda list +# packages in environment at /apps/spack/bell/apps/anaconda/2020.02-py37-gcc-4.8.5-u747gsx: +# +# Name Version Build Channel +_ipyw_jlab_nb_ext_conf 0.1.0 py37_0 +_libgcc_mutex 0.1 main +alabaster 0.7.12 py37_0 +anaconda 2020.02 py37_0 +... +``` + +If you see the library in the list, you can simply import it into your Python code after loading the Anaconda module. + +If you do not find the package you need, you should be able to install the library in your own Anaconda customization. First try to install it with [Conda or Pip](./packages.md). If the package is not available from either Conda or Pip, you may be able to install it from source. + +Use the following instructions as a guideline for installing packages from source. Make sure you have a download link to the software (usually it will be a `tar.gz` archive file). You will substitute it on the wget line below. + +We also assume that you have already created an empty conda environment as described in our [Python package installation guide](./packages.md). + +``` +$ mkdir ~/src +$ cd ~/src +$ wget http://path/to/source/tarball/app-1.0.tar.gz +$ tar xzvf app-1.0.tar.gz +$ cd app-1.0 +$ module load conda +$ module load use.own +$ module load conda-env/mypackages-py3.8.5 +$ python setup.py install +$ cd ~ +$ python +>>> import app +>>> quit() +``` + +The "import app" line should return without any output if installed successfully. You can then import the package in your python scripts. + +If you need further help or run into any issues installing a library, contact us. + +For more information about Python: + +* [The Python Programming Language - Official Website](http://www.python.org/) +* [Anaconda Python Distribution - Official Website](https://store.continuum.io/cshop/anaconda/) +* [Conda User Guide](https://conda.io/projects/conda/en/latest/user-guide/) + +[**Return to the Python**](../python.md) \ No newline at end of file From 4b3306dc847014c2b3ffbb6c9e06ebe3041abecb Mon Sep 17 00:00:00 2001 From: hkashgar Date: Fri, 12 Jun 2026 16:54:08 -0500 Subject: [PATCH 10/26] add R pages --- docs/userguides/negishi/run_jobs/index.md | 2 +- docs/userguides/negishi/run_jobs/r.md | 23 ++++ .../r/example_installing_r_packages.md | 116 ++++++++++++++++++ .../run_jobs/r/example_loading_into_r.md | 38 ++++++ .../run_jobs/r/example_r_profile_setup.md | 35 ++++++ .../negishi/run_jobs/r/example_rstudio.md | 42 +++++++ .../run_jobs/r/example_running_r_jobs.md | 49 ++++++++ 7 files changed, 304 insertions(+), 1 deletion(-) create mode 100644 docs/userguides/negishi/run_jobs/r.md create mode 100644 docs/userguides/negishi/run_jobs/r/example_installing_r_packages.md create mode 100644 docs/userguides/negishi/run_jobs/r/example_loading_into_r.md create mode 100644 docs/userguides/negishi/run_jobs/r/example_r_profile_setup.md create mode 100644 docs/userguides/negishi/run_jobs/r/example_rstudio.md create mode 100644 docs/userguides/negishi/run_jobs/r/example_running_r_jobs.md diff --git a/docs/userguides/negishi/run_jobs/index.md b/docs/userguides/negishi/run_jobs/index.md index 4e273252..0ebfebf1 100644 --- a/docs/userguides/negishi/run_jobs/index.md +++ b/docs/userguides/negishi/run_jobs/index.md @@ -38,7 +38,7 @@ Batch jobs submitted via SLURM have four main steps: - [**Generic SLURM jobs**](generic_slurm_jobs.md) - [**Python**](python.md) -- [**R**](r_example.md) +- [**R**](r.md) - [**Apptainer**](apptainer.md) - [**Matlab**](matlab.md) - [**Ansys**](ansysfluent_example.md) diff --git a/docs/userguides/negishi/run_jobs/r.md b/docs/userguides/negishi/run_jobs/r.md new file mode 100644 index 00000000..7b5d24ae --- /dev/null +++ b/docs/userguides/negishi/run_jobs/r.md @@ -0,0 +1,23 @@ +--- +tags: + - Negishi +authors: + - hkashgar +resource: Negishi +search: + boost: 2 +--- + +# R examples on Negishi + +R, a GNU project, is a language and environment for data manipulation, statistics, and graphics. It is an open source version of the S programming language. R is quickly becoming the language of choice for data science due to the ease with which it can produce high quality plots and data visualizations. It is a versatile platform with a large, growing community and collection of packages. + +For more general information on R visit [The R Project for Statistical Computing](https://www.r-project.org/) + +- [**Loading Data into R**](r/example_loading_into_r.md) +- [**Installing R Packages**](r/example_installing_r_packages.md) +- [**RStudio**](r/example_rstudio.md) +- [**Running R Jobs**](r/example_running_r_jobs.md) +- [**Setting Up R Preferences with .Rprofile**](r/example_r_profile_setup.md) + +[**Back to the Running Jobs section**](../run_jobs/index.md) diff --git a/docs/userguides/negishi/run_jobs/r/example_installing_r_packages.md b/docs/userguides/negishi/run_jobs/r/example_installing_r_packages.md new file mode 100644 index 00000000..1d20c7c4 --- /dev/null +++ b/docs/userguides/negishi/run_jobs/r/example_installing_r_packages.md @@ -0,0 +1,116 @@ +--- +tags: + - Negishi +authors: + - hkashgar +resource: Negishi +search: + boost: 2 +--- + +# Installing R Packages + +## Challenges of Managing R Packages in the Cluster Environment + +- Different clusters have different hardware and softwares. So, if you have access to multiple clusters, you must install your R packages separately for each cluster. +- Each cluster has multiple versions of R and packages installed with one version of R may not work with another version of R. So, libraries for each R version must be installed in a separate directory. +- You can define the directory where your R packages will be installed using the environment variable ```R_LIBS_USER```. +- For your convenience, a sample [~/.Rprofile example file](https://rcac.purdue.edu/files/knowledge/run/examples/apps/r/Rprofile_example) is provided that can be downloaded to your cluster account and renamed into ```~/.Rprofile``` (or appended to one) to customize your installation preferences. [Detailed instructions here](example_r_profile_setup.md). + +## Installing Packages +- ### Step 0: Setup Installation Preferences +Follow the [steps for setting up your](example_r_profile_setup.md) ```~/.Rprofile``` preferences. This step needs to be done only once. If you have created a ```~/.Rprofile``` file previously on Negishi, ignore this step. + +- ### Step 1: Check if the package is already installed +As part of the R installations on community clusters, a lot of R libraries are pre-installed. You can check if your package is already installed by opening an R terminal and entering the command ```installed.packages()```. For example, + +```r +module load r/4.4.1 +R +``` + +``` +installed.packages()["units",c("Package","Version")] +Package Version +"units" "0.8-1" +quit() +``` + +If the package you are trying to use is already installed, simply load the library, e.g., ```library('units')```. Otherwise, move to the next step to install the package. + +- ### Step 2: Load required dependencies (if needed) +For simple packages you may not need this step. However, some R packages depend on other libraries. For example, the ```sf``` package depends on ```gdal``` and ```geos``` libraries. So, you will need to load the corresponding modules before installing ```sf```. Read the documentation for the package to identify which modules should be loaded. + +```r +module load gdal +module load geos +``` + +- ### Step 3: Install the package +Now install the desired package using the command ```install.packages('package_name')```. R will automatically download the package and all its dependencies from [CRAN](https://cran.r-project.org/mirrors.html) and install each one. Your terminal will show the build progress and eventually show whether the package was installed successfully or not. + +```r +R +``` +``` +install.packages('sf', repos="https://cran.case.edu/") +Installing package into ‘/home/myusername/R/x86_64-pc-linux-gnu-library/4.4.1’ +(as ‘lib’ is unspecified) +trying URL 'https://cran.case.edu/src/contrib/sf_0.9-7.tar.gz' +Content type 'application/x-gzip' length 4203095 bytes (4.0 MB) +================================================== +downloaded 4.0 MB +... +... +more progress messages +... +... +** testing if installed package can be loaded from final location +** testing if installed package keeps a record of temporary installation path +* DONE (sf) + +The downloaded source packages are in + ‘/tmp/RtmpSVAGio/downloaded_packages’ +``` + +- ### Step 4: Troubleshooting (if needed) +If Step 3 ended with an error, you need to investigate why the build failed. Most common reason for build failure is not loading the necessary modules. + +## Loading Libraries +Once you have packages installed you can load them with the ```library()``` function as shown below: + +```r +library('packagename') +``` +The package is now installed and loaded and ready to be used in R. + +## Example: Installing ```dplyr``` + +```r +module load r +R +``` + +``` +install.packages('dplyr', repos="http://ftp.ussg.iu.edu/CRAN/") +Installing package into ‘/home/myusername/R/negishi/4.4.1’ +(as ‘lib’ is unspecified) + ... +also installing the dependencies 'crayon', 'utf8', 'bindr', 'cli', 'pillar', 'assertthat', 'bindrcpp', 'glue', 'pkgconfig', 'rlang', 'Rcpp', 'tibble', 'BH', 'plogr' + ... + ... + ... +The downloaded source packages are in + '/tmp/RtmpHMzm9z/downloaded_packages' + +library(dplyr) + +Attaching package: 'dplyr' +``` + +For more information about installing R packages: + +- [Installing additional R packages on Linux](http://cran.r-project.org/doc/manuals/r-release/R-admin.html#Installing-packages) +- [List of Packages](https://cran.r-project.org/web/packages/) + +[**Back to the R Examples section**](../r.md) diff --git a/docs/userguides/negishi/run_jobs/r/example_loading_into_r.md b/docs/userguides/negishi/run_jobs/r/example_loading_into_r.md new file mode 100644 index 00000000..588c715c --- /dev/null +++ b/docs/userguides/negishi/run_jobs/r/example_loading_into_r.md @@ -0,0 +1,38 @@ +--- +tags: + - Negishi +authors: + - hkashgar +resource: Negishi +search: + boost: 2 +--- + +# Loading Data into R + +R is an environment for manipulating data. In order to manipulate data, it must be brought into the R environment. R has a function to read any file that data is stored in. Some of the most common file types like comma-separated variable(CSV) files have functions that come in the basic R packages. Other less common file types require additional packages to be installed. To read data from a CSV file into the R environment, enter the following command in the R prompt: + +```bash +> read.csv(file = "path/to/data.csv", header = TRUE) +``` + +When R reads the file it creates an object that can then become the target of other functions. By default the read.csv() function will give the object the name of the .csv file. To assign a different name to the object created by read.csv enter the following in the R prompt: + +```bash +> my_variable <- read.csv(file = "path/to/data.csv", header = FALSE) +``` + +To display the properties (structure) of loaded data, enter the following: + +```bash +> str(my_variable) +``` + +For more functions and tutorials: + +- [The R Manuals](https://cran.r-project.org/manuals.html) +- [Other R Examples](https://www.mayin.org/ajayshah/KB/R/index.html) +- [Software Carpentry - Programming with R](https://swcarpentry.github.io/r-novice-inflammation/) +- [Data Carpentry Lessons](http://www.datacarpentry.org/lessons/) + +[**Back to the R Examples section**](../r.md) diff --git a/docs/userguides/negishi/run_jobs/r/example_r_profile_setup.md b/docs/userguides/negishi/run_jobs/r/example_r_profile_setup.md new file mode 100644 index 00000000..1c897690 --- /dev/null +++ b/docs/userguides/negishi/run_jobs/r/example_r_profile_setup.md @@ -0,0 +1,35 @@ +--- +tags: + - Negishi +authors: + - hkashgar +resource: Negishi +--- + +# Setting up R Preferences with .Rprofile + +For your convenience, a sample [~/.Rprofile example file](/assets/scripts/userguides/Rprofile_example) is provided that can be downloaded to your cluster account and renamed into ```~/.Rprofile``` (or appended to one). Follow these steps to download our recommended ```~/.Rprofile``` example and copy it into place: + +```bash +curl -#LO https://docs.rcac.purdue.edu/assets/scripts/userguides/Rprofile_example +mv -ib Rprofile_example ~/.Rprofile +``` + +The above installation step needs to be done only once on Negishi. Now load the R module and run R: + +```bash +module load r/4.4.1 +R +``` + +```R +.libPaths() +[1] "/home/{user}/R/negishi/4.1.2-gcc-6.3.0-ymdumss" +[2] "/apps/spack/negishi/apps/r/4.1.2-gcc-6.3.0-ymdumss/rlib/R/library" +``` + +```.libPaths()``` should output something similar to above if it is set up correctly. + +You are now ready to install R packages into the dedicated directory `/home/myusername/R/negishi/4.1.2-gcc-6.3.0-ymdumss`. + +[**Back to the Installing R Packages section**](example_installing_r_packages.md) diff --git a/docs/userguides/negishi/run_jobs/r/example_rstudio.md b/docs/userguides/negishi/run_jobs/r/example_rstudio.md new file mode 100644 index 00000000..b7b624fa --- /dev/null +++ b/docs/userguides/negishi/run_jobs/r/example_rstudio.md @@ -0,0 +1,42 @@ +--- +tags: + - Negishi +authors: + - hkashgar +resource: Negishi +search: + boost: 2 +--- + +# RStudio + +RStudio is a graphical integrated development environment (IDE) for R. RStudio is the most popular environment for developing both R scripts and packages. RStudio is provided on most Research systems. + +There are two methods to launch RStudio on the cluster: command-line and application menu icon. + +## Launch RStudio via command-line: + +```bash +module load gcc +module load r +module load rstudio +rstudio +``` + +Note that RStudio is a graphical program and in order to run it you must have a local X11 server running or use [Thinlinc](../../accounts.md#thinlinc) Remote Desktop environment. See the [ssh X11 forwarding section](../../accounts.md#ssh-x11-forwarding) for more details. + +## Launch Rstudio via the application menu icon: + +- Log into desktop.negishi.rcac.purdue.edu with web browser or [ThinLinc](../../accounts.md#thinlinc) client +- Click on the ```Applications``` drop down menu on the top left corner +- Choose ```Cluster Software``` and then ```RStudio``` + +![This image displays the Thinlinc Application Launcher menu and depicts the user selecting Cluster Software > Rstudio](example_rstudio_app_menu.png) + +R and RStudio are free to download and run on your local machine. For more information about RStudio: + +- [RStudio Official Website](https://www.rstudio.com/) +- [RStudio Essentials: Tutorial](https://www.rstudio.com/resources/webinars/#rstudioessentials) +- [DataCamp: Working with the RStudio IDE](https://www.datacamp.com/courses/working-with-the-rstudio-ide-part-1) + +[**Back to the R Examples section**](../r.md) diff --git a/docs/userguides/negishi/run_jobs/r/example_running_r_jobs.md b/docs/userguides/negishi/run_jobs/r/example_running_r_jobs.md new file mode 100644 index 00000000..3ecd898f --- /dev/null +++ b/docs/userguides/negishi/run_jobs/r/example_running_r_jobs.md @@ -0,0 +1,49 @@ +--- +tags: + - Negishi +authors: + - hkashgar +resource: Negishi +search: + boost: 2 +--- + +# Running R Jobs + +This section illustrates how to submit a small R job to a SLURM queue. The example job computes a Pythagorean triple. + +Prepare an R input file with an appropriate filename, here named ```myjob.R```: + +```bash +# FILENAME: myjob.R + +# Compute a Pythagorean triple. +a = 3 +b = 4 +c = sqrt(a*a + b*b) +c # display result +``` + +Prepare a job submission file with an appropriate filename, here named ```myjob.sub```: + +```bash +#!/bin/bash +# FILENAME: myjob.sub + +module load r + +# --vanilla: +# --no-save: do not save datasets at the end of an R session +R --vanilla --no-save < myjob.R +``` + +[Submit the Job and view the results](/userguides/negishi/run_jobs/) + +For other examples or R jobs: + +- [The R Manuals](http://cran.r-project.org/manuals.html) +- [Other R Examples](http://www.mayin.org/ajayshah/KB/R/index.html) +- [Software Carpentry - Programming with R](https://swcarpentry.github.io/r-novice-inflammation/) +- [Data Carpentry Lessons](http://www.datacarpentry.org/lessons/) + +[**Back to the R Examples section**](../r.md) From 0aad8271f9016c30c9921b61466c284ad7a9b69c Mon Sep 17 00:00:00 2001 From: hkashgar Date: Fri, 12 Jun 2026 16:57:23 -0500 Subject: [PATCH 11/26] add apptainer page --- docs/userguides/negishi/run_jobs/apptainer.md | 123 ++++++++++++++++++ 1 file changed, 123 insertions(+) create mode 100644 docs/userguides/negishi/run_jobs/apptainer.md diff --git a/docs/userguides/negishi/run_jobs/apptainer.md b/docs/userguides/negishi/run_jobs/apptainer.md new file mode 100644 index 00000000..4e70a9ca --- /dev/null +++ b/docs/userguides/negishi/run_jobs/apptainer.md @@ -0,0 +1,123 @@ +--- +tags: + - Negishi + - Apptainer +authors: + - hkashgar +resource: Negishi +search: + boost: 2 +--- + +# Apptainer on Negishi Cluster + +!!! note + Note: Apptainer was formerly known as Singularity and is now a part of the [Linux Foundation](https://apptainer.org/news/community-announcement-20211130). When migrating from Singularity see the [user compatibility documentation](https://apptainer.org/docs/user/main/singularity_compatibility.html). + +## What is Apptainer? +Apptainer is an open-source container platform designed to be simple, fast, and secure. It allows the portability and reproducibility of operating systems and application environments through the use of Linux containers. It gives users complete control over their environment. + +Apptainer is like Docker but tuned explicitly for HPC clusters. More information is available on the [project’s website](https://apptainer.org/). + +## Features + +- Run the latest applications on an Ubuntu or Centos userland +- Gain access to the latest developer tools +- Launch MPI programs easily +- Much more + +Apptainer’s user guide is available at: [https://apptainer.org/docs/user/main/introduction.html](https://apptainer.org/docs/user/main/introduction.html) + +## Example +Here is an example using an Ubuntu 16.04 image on Negishi: + +```bash +apptainer exec /depot/itap/singularity/ubuntu1604.img cat /etc/lsb-release +DISTRIB_ID=Ubuntu +DISTRIB_RELEASE=16.04 +DISTRIB_CODENAME=xenial +DISTRIB_DESCRIPTION="Ubuntu 16.04 LTS" +``` + +Here is another example using a Centos 7 image: + +```bash +apptainer exec /depot/itap/singularity/centos7.img cat /etc/redhat-release +CentOS Linux release 7.3.1611 (Core) +``` + +## Purdue Cluster Specific Notes + +All service providers will integrate Apptainer slightly differently depending on site. The largest customization will be which default files are inserted into your images so that routine services will work. + +Services we configure for your images include DNS settings and account information. File systems we overlay into your images are your home directory, scratch, Data Depot, and application file systems. + +Here is a list of paths: + +- /etc/resolv.conf +- /etc/hosts +- /home/$USER +- /apps +- /scratch +- /depot + +This means that within the container environment these paths will be present and the same as outside the container. The ```/apps```, ```/scratch```, and ```/depot``` directories will need to exist _inside_ your container to work properly. + +## Creating Apptainer Images +You can build on your system or straight on the cluster (you do not need root privileges to build or run the container). + +You can find information and documentation for how to install and use Apptainer on your system: + +- [Install Apptainer on Windows or MacOS](https://apptainer.org/docs/admin/main/installation.html#installation-on-windows-or-mac) +- [Install Apptainer on Linux](https://apptainer.org/docs/admin/main/installation.html#installation-on-linux) + +We have version ```1.1.6``` (or newer) on the cluster. Please note that installed versions may change throughout cluster life time, so when in doubt, please check exact version with a ```--version``` command line flag: + +```bash +apptainer --version +apptainer version 1.3.3-1.el9 +``` + +Everything you need on how to [build a container](https://apptainer.org/docs/user/main/build_a_container.html) is available from their user guide. Below are merely some quick tips for getting your own containers built for Negishi. + +You can use a [Definition File](https://apptainer.org/docs/user/main/definition_files.html) to both build your container and share its specification with collaborators (for the sake of reproducibility). Here is a simplistic example of such a file: + +```bash +# FILENAME: Buildfile + +Bootstrap: docker +From: ubuntu:18.04 + +%post + apt-get update && apt-get upgrade -y + mkdir /apps /depot /scratch +``` + +To build the image itself: + +```bash +apptainer build ubuntu-18.04.sif Buildfile +``` + +The challenge with this approach however is that it must start from scratch if you decide to change something. In order to create a container image iteratively and interactively, you can use the ```--sandbox``` option. + +```bash +apptainer build --sandbox ubuntu-18.04 docker://ubuntu:18.04 +``` + +This will not create a flat image file but a directory tree (i.e., a folder), the contents of which are the container's filesystem. In order to get a shell inside the container that allows you to modify it, user the ```--writable``` option. + +```bash +apptainer shell --writable ubuntu-18.04 +Apptainer> +``` + +You can then proceed to install any libraries, software, etc. within the container. Then to create the final image file, ```exit``` the shell and call the ```build``` command once more on the sandbox. + +```bash +apptainer build ubuntu-18.04.sif ubuntu-18.04 +``` + +Finally, copy the new image to Negishi and run it. + +[**Back to the Running Jobs section**](../run_jobs/index.md) From a7ae122aa69b090c9da689244cebae2578ccf345 Mon Sep 17 00:00:00 2001 From: hkashgar Date: Tue, 7 Jul 2026 15:42:07 -0500 Subject: [PATCH 12/26] ansys examples --- .../negishi/run_jobs/ansysfluent.md | 56 ++++++++ .../run_jobs/ansysfluent/calculating.md | 65 ++++++++++ .../run_jobs/ansysfluent/preparing_cases.md | 122 ++++++++++++++++++ .../run_jobs/ansysfluent/submit_jobs.md | 37 ++++++ .../run_jobs/ansysfluent/tui_journal.md | 110 ++++++++++++++++ 5 files changed, 390 insertions(+) create mode 100644 docs/userguides/negishi/run_jobs/ansysfluent.md create mode 100644 docs/userguides/negishi/run_jobs/ansysfluent/calculating.md create mode 100644 docs/userguides/negishi/run_jobs/ansysfluent/preparing_cases.md create mode 100644 docs/userguides/negishi/run_jobs/ansysfluent/submit_jobs.md create mode 100644 docs/userguides/negishi/run_jobs/ansysfluent/tui_journal.md diff --git a/docs/userguides/negishi/run_jobs/ansysfluent.md b/docs/userguides/negishi/run_jobs/ansysfluent.md new file mode 100644 index 00000000..c305787d --- /dev/null +++ b/docs/userguides/negishi/run_jobs/ansysfluent.md @@ -0,0 +1,56 @@ +--- +tags: + - Negishi +authors: + - jin456 + - remender +resource: Negishi +search: + boost: 2 +--- + +# Ansys Fluent + +[Ansys](https://www.ansys.com) is a CAE/multiphysics engineering simulation software that utilizes finite element analysis for numerically solving a wide variety of mechanical problems. The software contains a list of packages and can simulate many structural properties such as strength, toughness, elasticity, thermal expansion, fluid dynamics as well as acoustic and electromagnetic attributes. + +## Ansys Licensing + +The Ansys licensing on our community clusters is maintained by Purdue ECN group. There are two types of licenses: teaching and research. For more information, please refer to [ECN Ansys licensing page](https://engineering.purdue.edu/ECN/Support/KB/Docs/ANSYSFLUENTLicensing). If you are interested in purchasing your own research license, please send email to **software@ecn.purdue.edu**. + +## Ansys Workflow + +Ansys software consists of several sub-packages such as Workbench and Fluent. Most simulations are performed using the Ansys Workbench console, a GUI interface to manage and edit the simulation workflow. It requires X11 forwarding for remote display so a SSH client software with X11 support or a remote desktop portal is required. Please see [Logging In](../accounts.md) section for more details. To ensure preferred performance, [ThinLinc](../accounts.md#thinlinc) remote desktop connection is highly recommended. + +Typically users break down larger structures into small components in geometry with each of them modeled and tested individually. A user may start by defining the dimensions of an object, adding weight, pressure, temperature, and other physical properties. + +Ansys Fluent is a computational fluid dynamics (CFD) simulation software known for its advanced physics modeling capabilities and accuracy. Fluent offers unparalleled analysis capabilities and provides all the tools needed to design and optimize new equipment and to troubleshoot existing installations. + + + + + +## Loading Ansys Module + +Different versions of Ansys are installed on the clusters and can be listed with `module spider` or `module avail` command in the terminal. + +```bash +$ module avail ansys/ +---------------------- Core Applications ----------------------------- + ansys/2019R3 ansys/2020R1 ansys/2021R2 ansys/2022R1 (D) +``` + +Before launching Ansys Workbench, a specific version of Ansys module needs to be loaded. For example, you can `module load ansys/2021R2` to use the latest Ansys 2021R2. If no version is specified, the default module -> (D) (`ansys/2022R1` in this case) will be loaded. You can also check the loaded modules with `module list` command. + +## Launching Ansys Workbench + +Open a terminal on Negishi, enter `rcac-runwb2` to launch Ansys Workbench. + +You can also use `runwb2` to launch Ansys Workbench. The main difference between `runwb2`and `rcac-runwb2` is that the latter sets the project folder to be in your scratch space. Ansys has an known bug that it might crash when the project folder is set to `$HOME` on our systems. + +* [**Preparing Case Files for Fluent**](ansysfluent/preparing_cases.md) +* [**Case Calculating with Fluent**](ansysfluent/calculating.md) +* [**Fluent Text User Interface and Journal File**](ansysfluent/tui_journal.md) +* [**Submitting Fluent jobs to SLURM**](ansysfluent/submit_jobs.md) + + +[**Back to the Running Jobs section**](index.md) \ No newline at end of file diff --git a/docs/userguides/negishi/run_jobs/ansysfluent/calculating.md b/docs/userguides/negishi/run_jobs/ansysfluent/calculating.md new file mode 100644 index 00000000..89946012 --- /dev/null +++ b/docs/userguides/negishi/run_jobs/ansysfluent/calculating.md @@ -0,0 +1,65 @@ +--- +tags: + - Negishi +authors: + - hkashgar +resource: Negishi +search: + boost: 2 +--- + +# Case Calculating with Fluent + +### Calculation with Fluent + +Now all the files are ready for the Fluent calculations. Both “Geometry” and “Mesh” cells should have green checks. We can set up the CFD simulation parameters in the Ansys Fluent by double-clicking the “Setup” cell. + +Ansys Fluent Launcher can be started by selecting “editing” on the “Setup” cell with many startup options (e.g. Precision, Parallel, Display). Note that “Dimension” is fixed to “3D” because we are using a 3D model in this project. + +![Ansys Fluent Launcher options](../../../../assets/images/userguides/examples/ansys4.png) + +Ansys Fluent Launcher options. + +After the Fluent is opened, an Ansys Fluent settings file `FFF.set` is written under the folder `$Ansys_PROJECT_FOLDER/elbow_demo_file/dp0/FFF/Fluent/`. + +Then we are going to set up all the necessary parameters for Fluent computation. Here are the key steps for the setup: + +1. Setting up the domain: + * Change the units for length to be consistent with the Mesh; + * Check the mesh statistics and quality; +2. Setting up physics: + * Solver: “Energy”, “Viscous Model”, “Near-Wall Treatment”; + * Materials; + * Zones; + * Boundaries: Inlet, Outlet, Internal, Symmetry, Wall; +3. Solving: + * Solution Methods; + * Reports; + * Initialization; + * Iterations and output frequency. + +Then the calculation will be carried out and the results will be written out into `FFF-1.cas.gz` under folder `$Ansys_PROJECT_FOLDER/elbow_demo_file/dp0/FFF/Fluent/`. + +This file contains all the settings and simulation results which can be loaded for post analysis and re-computation (more details will be introduced in the following sections). If only configurations and settings within the Fluent are needed, we can open independent Fluent or submit Fluent jobs with bash commands by loading the existing case in order to facilitate the computation process. + +Parameters used in demo case (use default if not assigned): + +1. Domain Setup: Length Units=”mm”; +2. Solver: Energy=”on”; Viscous Model=”k-epsilon”; Near-Wall Treatment=”Enhanced Wall Treatment”; +3. Materials: water (Density=1000[kg/m^3]; Specific Heat=4216[J/kg-k]; Thermal Conductivity=0.677[w/m-k]; Viscosity=8e-4[kg/m-s]); +4. Zones=”fluid (water)”; +5. Inlet=”velocity-inlet-large” (Velocity Magnitude=0.4m/s, Specification Method=”Intensity and Hydraulic Diameter”, Turbulent Intensity=5%; Hydraulic Diameter=100mm; Thermal Temperature=293.15k) &”velocity-inlet-small” (Velocity Magnitude=1.2m/s, Specification Method=”Intensity and Hydraulic Diameter”, Turbulent Intensity=5%; Hydraulic Diameter=25mm; Thermal Temperature=313.15k); Internal=”interior-fluid”; Symmetry=”symmetry”; Wall=”wall-fluid”; +6. Solution Methods: Gradient=”Green-Gauss Node Based”; +7. Report: plot residual and “Facet Maximum” for “pressure-outlet” +8. Hybrid Initialization; +9. 300 iterations. + +### Results analysis + +The best methods to view and analyze the simulation should be the Ansys Fluent (directly after computation) or the Ansys CFD-Post (entering “Results” in Ansys Workbench). Both methods are straightforward so we will not cover this part in this tutorial. Here is a final simulation result showing the temperature of the symmetry after 300 iterations for reference: + +![Simulated temperature](../../../../assets/images/userguides/examples/ansys5.png) + +Simulated temperature profile of the symmetry. + +[**Back to Ansys Fluent**](../ansysfluent.md) diff --git a/docs/userguides/negishi/run_jobs/ansysfluent/preparing_cases.md b/docs/userguides/negishi/run_jobs/ansysfluent/preparing_cases.md new file mode 100644 index 00000000..d9a2fbe0 --- /dev/null +++ b/docs/userguides/negishi/run_jobs/ansysfluent/preparing_cases.md @@ -0,0 +1,122 @@ +--- +tags: + - Negishi +authors: + - hkashgar +resource: Negishi +search: + boost: 2 +--- + +# Preparing Case Files for Fluent + +### Creating a Fluent fluid analysis system + +In the Ansys Workbench, create a new fluid flow analysis by double-clicking the Fluid Flow (Fluent) option under the Analysis Systems in the Toolbox on the left panel. You can also drag-and-drop the analysis system into the Project Schematic. A green dotted outline indicating a potential location for the new system initially appears in the Project Schematic. When you drag the system to one of the outlines, it turns into a red box to indicate the chosen location of the new system. + +![Ansys Workbench GUI](../../../../assets/images/userguides/examples/ansys1.png) + +Ansys Workbench GUI and the Fluid Flow system for Fluent. + +The red rectangle indicates the Fluid Flow system for Fluent, which includes all the essential workflows from “2 Geometry” to “6 Results”. You can rename it and carry out the necessary step-by-step procedures by double-clicking the corresponding cells. + +It is important to save the project. Ansys Workbench saves the project with a `.wbpj` extension and also all the supporting files into a folder with the same name. In this case, a file named `elbow_demo.wbpj` and a folder `$Ansys_PROJECT_FOLDER/elbow_demo_files/` are created in the Ansys project folder: + +```bash +$ ll +total 33 +drwxr-xr-x 7 username itap 9 Mar 3 17:47 elbow_demo_files +-rw-r--r-- 1 username itap 42597 Mar 3 17:47 elbow_demo.wbpj +``` + +You should always “Update Project” and save it after finishing a procedure. + +### Creating Geometry in the Ansys DesignModeler + +Create a geometry in the Ansys DesignModeler (by double-clicking “Geometry” cell in workflow), or import the appropriate geometry file (by right-clicking the Geometry cell and selecting “Import Geometry” option from the context menu). + +You can use Ansys DesignModeler to create 2D/3D geometries or even draw the objects yourself. In our example, we created only half of the elbow pipe because the symmetry of the structure is taken into account to reduce the computation intensity. + +![DesignModeler](../../../../assets/images/userguides/examples/ansys2.png) + +Elbow pipe created in Ansys DesignModeler. + +After saving the geometry, a geometry file `FFF.agdb` will be created in the folder: `$Ansys_PROJECT_FOLDER/elbow_demo_file/dp0/FFF/DM/`. The project in Workbench will be updated automatically. + +If you import a pre-existing geometry into Ansys DesignModeler, it will also generate this file with the same filename at this location. + +### Creating mesh in the Ansys Meshing + +Now that we have created the elbow pipe geometry, a computational mesh can be generated by the Meshing application throughout the flow volume. + +With the successful creation of the geometry, there should be a green check showing the completion of “Geometry” in the Ansys Workbench. A Refresh Required icon within the “Mesh” cell indicates the mesh needs to be updated and refreshed for the system. + +![AnsysWorkbenchCells](../../../../assets/images/userguides/examples/ansys3.png) + +Status for different cells shown in Ansys Workbench. + +Then it’s time to open the Ansys Meshing application by double-clicking the “Mesh” cell and editing the mesh for the project. Generally, there are several steps we need to take to define the mesh: + +1. Create names for all geometry boundaries such as the inlets, outlets and fluid body. Note: You can use the strings “velocity inlet” and “pressure outlet” in the named selections (with or without hyphens or underscore characters) to allow Ansys Fluent to automatically detect and assign the corresponding boundary types accordingly. Use “Fluid” for the body to let Ansys Fluent automatically detect that the volume is a fluid zone and treat it accordingly. +2. Set basic meshing parameters for the Ansys Meshing application. Here are several important parameters you may need to assign: Sizing, Quality, Body Sizing Control, Inflation. +3. Select “Generate” to generate the mesh and “Update” to update the mesh into the system. Note: Once the mesh is generated, you can view the mesh statistics by opening the Statistics node in the Details of “Mesh” view. This will display information such as the number of nodes and the number of elements, which gives you a general idea for the future computational resources and time. + +After generation and updating the mesh, a mesh file `FFF.msh` will be generated in folder `$Ansys_PROJECT_FOLDER/elbow_demo_file/dp0/FFF/MECH/` and a mesh database file `FFF.mshdb` will be generated in folder `$Ansys_PROJECT_FOLDER/elbow_demo_file/dp0/global/MECH/`. + +Parameters used in demo case (use default if not assigned): + +1. Length Unit=”mm” +2. Names defined for geometry: + * velocity-inlet-large (large inlet on pipe); + * velocity-inlet-small (small inlet on pipe); + * pressure-outlet (outlet on pipe); + * symmetry (symmetry surface); + * Fluid (body); +3. Mesh: + * Quality: Smoothing=”high”; + * Inflation: Use Automatic Inflation=“Program Controlled”, Inflation Option=”Smooth Transition”; +4. Statistics: + * Nodes=29371; + * Elements=87647. + +### Calculation with Fluent + +Now all the preparations have been ready for the numerical calculation in Ansys Fluent. Both “Geometry” and “Mesh” cells should have green checks on. We can set up the CFD simulation parameters in Ansys Fluent by double-clicking the “Setup” cell. + +When Ansys Fluent is first started or by selecting “editing” on the “Setup” cell, the Fluent Launcher is displayed, enabling you to view and/or set certain Ansys Fluent start-up options (e.g. Precision, Parallel, Display). Note that “Dimension” is fixed to “3D” because we are using a 3D model in this project. + +After the Fluent is opened, an Ansys Fluent settings file `FFF.set` is written under the folder `$Ansys_PROJECT_FOLDER/elbow_demo_file/dp0/FFF/Fluent/`. + +Then we are going to set up all the necessary parameters for Fluent computation. Here are the key steps for the setup: + +1. Setting up the domain: + * Change the units for length to be consistent with the Mesh; + * Check the mesh statistics and quality; +2. Setting up physics: + * Solver: “Energy”, “Viscous Model”, “Near-Wall Treatment”; + * Materials; + * Zones; + * Boundaries: Inlet, Outlet, Internal, Symmetry, Wall; +3. Solving: + * Solution Methods; + * Reports; + * Initialization; + * Iterations and output frequency. + +Then the calculation will be carried out and the results will be written out into `FFF-1.cas.gz` under folder `$Ansys_PROJECT_FOLDER/elbow_demo_file/dp0/FFF/Fluent/`. + +This file contains all the settings and simulation results which can be loaded for post analysis and re-computation (more details will be introduced in the following sections). If only configurations and settings within the Fluent are needed, we can open independent Fluent or submit Fluent jobs with bash commands by loading the existing case in order to facilitate the computation process. + +Parameters used in demo case (use default if not assigned): + +1. Domain Setup: Length Units=”mm”; +2. Solver: Energy=”on”; Viscous Model=”k-epsilon”; Near-Wall Treatment=”Enhanced Wall Treatment”; +3. Materials: water (Density=1000[kg/m^3]; Specific Heat=4216[J/kg-k]; Thermal Conductivity=0.677[w/m-k]; Viscosity=8e-4[kg/m-s]); +4. Zones=”fluid (water)”; +5. Inlet=”velocity-inlet-large” (Velocity Magnitude=0.4m/s, Specification Method=”Intensity and Hydraulic Diameter”, Turbulent Intensity=5%; Hydraulic Diameter=100mm; Thermal Temperature=293.15k) &”velocity-inlet-small” (Velocity Magnitude=1.2m/s, Specification Method=”Intensity and Hydraulic Diameter”, Turbulent Intensity=5%; Hydraulic Diameter=25mm; Thermal Temperature=313.15k); Internal=”interior-fluid”; Symmetry=”symmetry”; Wall=”wall-fluid”; +6. Solution Methods: Gradient=”Green-Gauss Node Based”; +7. Report: plot residual and “Facet Maximum” for “pressure-outlet” +8. Hybrid Initialization; +9. 300 iterations. + +[**Back to Ansys Fluent**](../ansysfluent.md) diff --git a/docs/userguides/negishi/run_jobs/ansysfluent/submit_jobs.md b/docs/userguides/negishi/run_jobs/ansysfluent/submit_jobs.md new file mode 100644 index 00000000..5025ea65 --- /dev/null +++ b/docs/userguides/negishi/run_jobs/ansysfluent/submit_jobs.md @@ -0,0 +1,37 @@ +--- +tags: + - Negishi +authors: + - hkashgar +resource: Negishi +search: + boost: 2 +--- + +# Submitting Fluent jobs to SLURM + +The Fluent simulations can also run in batch. In this section we provide an example script for submitting Fluent jobs to the SLURM scheduler. Please refer to the [Running Jobs](../../run_jobs/index.md) section of our user guide for detailed tutorials of submitting jobs. + +```bash +#!/bin/bash +# Job script for submitting a FLUENT job on multiple cores on a single node + +# Apply resources via SLURM +#SBATCH --nodes=1 +#SBATCH --ntasks=4 +#SBATCH --time=01:00:00 +#SBATCH --job-name=fluent_test +#SBATCH -o fluent_test_%j.out +#SBATCH -e fluent_test_%j.err + +# Loads Ansys and sets the application up +module purge +module load ansys/2022R1 + +#Initiating Fluent and reading input journal file +fluent 3ddp -t$NTASKS -g -i testJournal.jou +``` + +For more information about submitting Fluent jobs, please refer to [Fluent FAQ]( https://www.cfd-online.com/Wiki/Fluent_FAQ) . + +[**Back to Ansys Fluent**](../ansysfluent.md) diff --git a/docs/userguides/negishi/run_jobs/ansysfluent/tui_journal.md b/docs/userguides/negishi/run_jobs/ansysfluent/tui_journal.md new file mode 100644 index 00000000..c05de7f8 --- /dev/null +++ b/docs/userguides/negishi/run_jobs/ansysfluent/tui_journal.md @@ -0,0 +1,110 @@ +--- +tags: + - Negishi +authors: + - hkashgar +resource: Negishi +search: + boost: 2 +--- + +# Fluent Text User Interface and Journal File + +### Fluent Text User Interface (TUI) + +If you pay attention to the “Console” window in the Fluent window when setting up and carrying out the calculation, corresponding commands can be found and executed one after another. Almost all the setting processes can be accomplished by the command lines, which is called Fluent Text User Interface (TUI). Here are the main commands in Fluent TUI: + +``` + adjoint/ parallel/ solve/ + define/ plot/ surface/ + display/ preferences/ turbo-workflow/ + exit print-license-usage views/ + file/ report/ + mesh/ server/ +``` + +For example, instead of opening a case by clicking buttons in Ansys Fluent, we can type `/file read-case case_file_name.cas.gz` to open the saved case. + +### Fluent Journal Files + +A Fluent journal file is a series of TUI commands stored in a text file. The file can be written in a text editor or generated by Fluent as a transcript of the commands given to Fluent during your session. + +A journal file generated by Fluent will include any GUI operations (in a TUI form, though). This is quite useful if you have a series of tasks that you need to execute, as it provides a shortcut. To record a journal file, start recording with File -> Write -> Start Journal..., perform whatever tasks you need, and then stop recording with File -> Write -> Stop Journal... + +You can also write your own journal file into a text file. The basic rule for a Fluent journal file is to reproduce the TUI commands that controlled the configuration and calculation of Fluent in their order. You can add a comment in a line starting with a `;` (semicolon). + +Here are some reasons why you should use a Fluent journal file: + +1. Using journal files with bash scripting can allow you to automate your jobs. +2. Using journal files can allow you to parameterize your models easily and automatically. +3. Using a journal file can set parameters you do not have in your case file e.g. autosaving. +4. Using a journal file can allow you to safely save, stop and restart your jobs easily. + +The order of your journal file commands is **highly important**. The correct sequences must be followed and some stages have multiple options e.g. different initialization methods. + +Here is a sample Fluent journal file for the demo case: + +``` + ;testJournal.jou + ;Set the TUI version for Fluent + /file/set-tui-version "22.1" + ;Read the case. The default folder + /file read-case /home/jin456/Fluent_files/tutorial_case1/elbow_files/dp0/FFF/Fluent/FFF-1.cas.gz + ;Initialize the case with Hybrid Initialization + /solve/initialize/hyb-initialization + ;Set Number of Iterations to 1000, Reporting Interval to 10 iterations and Profile Update Interval to 1 iteration + /solve/iterate 1000 10 1 + ;Outputting solver performance data upon completion of the simulation + /parallel timer usage + ;Write out the simulation results. + /file write-case-data /home/jin456/Fluent_files/tutorial_case1/elbow_files/dp0/FFF/Fluent/result.cas.h5 + ;After computation, exit Flent + /exit +``` + +Before running this Fluent journal file, you need to make sure: + +1) the ansys module has been loaded (it’s highly recommended to load the same version of Ansys when you built the case project); + +2) the project case file (`***.cas.gz`) has been created. + +Then we can use Fluent to run this journal file by simply using:`fluent 3ddp -t$NTASKS -g -i testJournal.jou` in the terminal. Here, `3d` indicates this is a 3d model, `dp` indicates double precision, `-t$NTASKS` tells Fluent how many Solver Processes it will take (e.g. `-t4`), `-g` means to run without the GUI or graphics, `-i` testJournal.jou tells Fluent to read the specific journal file. + +Here is a table for the available command line Options for Linux/UNIX and Windows Platforms in Ansys Fluent. + +Options for Fluent TUI + +| Option | Platform | Description | +| --- | --- | --- | +| `-cc` | all | Use the classic color scheme | +| `-ccp x` | Windows only | Use the Microsoft Job Scheduler where x is the head node name. | +| `-cnf=x` | all | Specify the hosts or machine list file | +| `-driver` | all | Sets the graphics driver (available drivers vary by platform - opengl or x11 or null(Linux/UNIX) - opengl or msw or null (Windows)) | +| `-env` | all | Show environment variables | +| `-fgw` | all | Disables the embedded graphics | +| `-g` | all | Run without the GUI or graphics (Linux/UNIX); Run with the GUI minimized (Windows) | +| `-gr` | all | Run without graphics | +| `-gu` | all | Run without the GUI but with graphics (Linux/UNIX); Run with the GUI minimized but with graphics (Windows) | +| `-help` | all | Display command line options | +| `-hidden` | Windows only | Run in batch mode | +| `-host_ip=host:ip` | all | Specify the IP interface to be used by the host process | +| `-i journal` | all | Reads the specified journal file | +| `-lsf` | Linux/UNIX only | Run FLUENT using LSF | +| `-mpi=` | all | Specify MPI implementation | +| `-mpitest` | all | Will launch an MPI program to collect network performance data | +| `-nm` | all | Do not display mesh after reading | +| `-pcheck` | Linux/UNIX only | Checks all nodes | +| `-post` | all | Run the FLUENT post-processing-only executable | +| `-p` | all | Choose the interconnect = default or myr or inf | +| `-r` | all | List all releases installed | +| `-rx` | all | Specify release number | +| `-sge` | Linux/UNIX only | Run FLUENT under Sun Grid Engine | +| `-sge queue` | Linux/UNIX only | Name of the queue for a given computing grid | +| `-sgeckpt ckpt_obj` | Linux/UNIX only | Set checkpointing object to ckpt\_objfor SGE | +| `-sgepe fluent_pe min_n-max_n` | Linux/UNIX only | Set the parallel environment for SGE to fluent\_pe, min\_nand max\_n are number of min and max nodes requested | +| `-tx` | all | Specify the number of processors x | + +For more information for Fluent text user interface and journal files, please refer to [Fluent FAQ]( https://www.cfd-online.com/Wiki/Fluent_FAQ). + + +[**Back to Ansys Fluent**](../ansysfluent.md) From 90d79e901a4a3c342b3ee9d5182e31c420bcf9ef Mon Sep 17 00:00:00 2001 From: hkashgar Date: Tue, 7 Jul 2026 15:44:09 -0500 Subject: [PATCH 13/26] gaussian example --- docs/userguides/negishi/run_jobs/gaussian.md | 130 +++++++++++++++++++ 1 file changed, 130 insertions(+) create mode 100644 docs/userguides/negishi/run_jobs/gaussian.md diff --git a/docs/userguides/negishi/run_jobs/gaussian.md b/docs/userguides/negishi/run_jobs/gaussian.md new file mode 100644 index 00000000..e275a05f --- /dev/null +++ b/docs/userguides/negishi/run_jobs/gaussian.md @@ -0,0 +1,130 @@ +--- +tags: + - Negishi +authors: + - jin456 + - remender +resource: Negishi +search: + boost: 2 +--- + +# Gaussian + +Gaussian is a computational chemistry software package which works on electronic structure. This section illustrates how to submit a small Gaussian job to a Slurm queue. This Gaussian example runs the Fletcher-Powell multivariable optimization. + +## Gaussian Input File + +Prepare a Gaussian input file with an appropriate filename. In this example, the file is named `myjob.com`. + +The final blank line is necessary. + +```text +#P TEST OPT=FP STO-3G OPTCYC=2 + +STO-3G FLETCHER-POWELL OPTIMIZATION OF WATER + +0 1 +O +H 1 R +H 1 R 2 A +R 0.96 +A 104. +``` + +## Submit the Job + +To submit this job, load Gaussian and then run the provided script, named `subg16`. + +This job uses one compute node with 16 processor cores. + +```bash +module load gaussian16 +subg16 myjob -N 1 -n 16 --gres=gpu:1 +``` + +## View Job Status + +View job status with: + +```bash +squeue -u myusername +``` + +## View Results + +View results in the Gaussian output file. In this example, the output file is named `myjob.log`. + +Only the first and last few lines are shown here: + +```text + Entering Gaussian System, Link 0=/apps/cent7/gaussian/g16-A.03/g16-haswell/g16/g16 + Initial command: + /apps/cent7/gaussian/g16-A.03/g16-haswell/g16/l1.exe /scratch/gautschi/myusername/gaussian/Gau-7781.inp -scrdir=/scratch/gautschi/myusername/gaussian/ + Entering Link 1 = /apps/cent7/gaussian/g16-A.03/g16-haswell/g16/l1.exe PID= 7782. + + Copyright (c) 1988,1990,1992,1993,1995,1998,2003,2009,2016, + Gaussian, Inc. All Rights Reserved. + +. +. +. + Job cpu time: 0 days 0 hours 3 minutes 28.2 seconds. + Elapsed time: 0 days 0 hours 0 minutes 12.9 seconds. + File lengths (MBytes): RWF= 17 Int= 0 D2E= 0 Chk= 2 Scr= 2 + Normal termination of Gaussian 16 at Tue May 1 17:12:00 2018. +real 13.85 +user 202.05 +sys 6.12 +Machine: +a012.gautschi.rcac.purdue.edu +a012.gautschi.rcac.purdue.edu +a012.gautschi.rcac.purdue.edu +a012.gautschi.rcac.purdue.edu +a012.gautschi.rcac.purdue.edu +a012.gautschi.rcac.purdue.edu +a012.gautschi.rcac.purdue.edu +a012.gautschi.rcac.purdue.edu +``` + +## Examples of Gaussian SLURM Job Submissions + +Submit a job using 16 processor cores on a single node: + +```bash +subg16 myjob -N 1 -n 16 --gres=gpu:1 -t 24:00:00 -A standby +``` + +Submit a job using 16 processor cores on each of 2 nodes: + +```bash +subg16 myjob -N 2 --ntasks-per-node=16 --gres=gpu:2 -t 24:00:00 -A standby +``` + +## Bash Job Submission Script + +To submit a bash job, a sample submit script looks like this: + +```bash +#!/bin/bash +#SBATCH -A accountname # Queue name; use the 'slist' command to find queue names +#SBATCH --nodes=1 # Total number of nodes +#SBATCH --ntasks=64 # Total number of MPI tasks +#SBATCH --gpus-per-node=1 # Total number of GPUs +#SBATCH --time=1:00:00 # Total run time limit (hh:mm:ss) +#SBATCH -J myjobname # Job name +#SBATCH -o myjob.o%j # Name of stdout output file +#SBATCH -e myjob.e%j # Name of stderr error file +#SBATCH --partition=a10 +#SBATCH --mem=8G + +module load gaussian16 + +g16 < myjob.com +``` + +## Additional Resources + +- [Gaussian Website](https://www.gaussian.com) + +[**Back to the Running Jobs section**](index.md) \ No newline at end of file From 56c2e5055e89fb09d1bdbf1690cf56e5cebbe6d4 Mon Sep 17 00:00:00 2001 From: hkashgar Date: Tue, 7 Jul 2026 16:12:48 -0500 Subject: [PATCH 14/26] vasp examples --- docs/userguides/negishi/run_jobs/vasp.md | 58 +++++++++++ .../run_jobs/vasp/build-your-own-vasp-5.md | 95 ++++++++++++++++++ .../run_jobs/vasp/build-your-own-vasp-6.md | 97 +++++++++++++++++++ .../run_jobs/vasp/vasp-job-submit-script.md | 34 +++++++ 4 files changed, 284 insertions(+) create mode 100644 docs/userguides/negishi/run_jobs/vasp.md create mode 100644 docs/userguides/negishi/run_jobs/vasp/build-your-own-vasp-5.md create mode 100644 docs/userguides/negishi/run_jobs/vasp/build-your-own-vasp-6.md create mode 100644 docs/userguides/negishi/run_jobs/vasp/vasp-job-submit-script.md diff --git a/docs/userguides/negishi/run_jobs/vasp.md b/docs/userguides/negishi/run_jobs/vasp.md new file mode 100644 index 00000000..0453f098 --- /dev/null +++ b/docs/userguides/negishi/run_jobs/vasp.md @@ -0,0 +1,58 @@ +--- +tags: + - Negishi +authors: + - hkashgar +resource: Negishi +search: + boost: 2 +--- + + +# VASP + +The Vienna Ab initio Simulation Package (VASP) is a computer program for atomic scale materials modelling, e.g. electronic structure calculations and quantum-mechanical molecular dynamics, from first principles. + +## VASP License + +The VASP team allows only registered users who have purchased their own license to use the software and access is only given to the VASP release which is covered by the license of the respective research group. For those who are interested to use VASP on Negishi, please [contact support](/contact) to request access and provide your email address associated with your license for our verification. Once confirmed, the approved users will be given access to the `vasp5` or/and `vasp6` unix groups. + +Prospective users can use the command below to check their unix groups on the system. + +``` +$ id $USER +``` + +If you are interested to purchase and get a VASP license, please visit [VASP](http://vasp.at) website for more information. + +## VASP 5 and VASP 6 Installations + +Negishi provides **VASP 5.4.4.pl2** and **VASP 6.4.1** installations and modulefiles with our default environment compiler `gcc/12.2.0` and mpi library `openmpi/4.1.4`. Note that only license-approved users can load the VASP modulefile as below. + +You can use the VASP 5.4.4.pl2 module by: + +``` +$ module load vasp/5.4.4.pl2 +``` + +You can use the VASP 6.4.1 module by: + +``` +$ module load vasp/6.4.1 +``` + +Once a VASP module is loaded, you can choose one of the VASP executables to run your code: `vasp_std`, `vasp_gam`, and `vasp_ncl`. + +The VASP pseudopotential files are not provided on Negishi, you may need to bring your own POTCAR files. + +## Build your own VASP 5 and VASP 6 + +If you would like to use your own VASP on Negishi, please follow the instructions for [Installing VASP.6.X.X](https://www.vasp.at/wiki/index.php/Installing_VASP.6.X.X) and [Installing VASP.5.X.X](https://www.vasp.at/wiki/index.php/Installing_VASP.5.X.X). + +In the following sections, we provide some instructions about how to install VASP 5 and VASP 6 as well as bash job submit script on Negishi: + +* [VASP Job Submit Script](vasp/vasp-job-submit-script.md) +* [Build your own VASP 5](vasp/build-your-own-vasp-5.md) +* [Build your own VASP 6](vasp/build-your-own-vasp-6.md) + +[**Back to the Running Jobs section**](index.md) diff --git a/docs/userguides/negishi/run_jobs/vasp/build-your-own-vasp-5.md b/docs/userguides/negishi/run_jobs/vasp/build-your-own-vasp-5.md new file mode 100644 index 00000000..128a260e --- /dev/null +++ b/docs/userguides/negishi/run_jobs/vasp/build-your-own-vasp-5.md @@ -0,0 +1,95 @@ +--- +tags: + - Negishi +authors: + - hkashgar +resource: Negishi +search: + boost: 2 +--- + +# Build your own VASP 5 + +For VASP 5.X.X version, VASP provide several templates of `makefile.include` in the `/arch` folder, which contain information such as precompiler options, compiler options, and how to link libraries. You can pick up one based on your system and preferred features. Here we provide some examples about how to install the `vasp.5.4.4.pl2.tgz` version on Negishi with different module environments. + +### Step 1: Download + +As a license holder, you can download the source code of VASP from the [VASP Portal](https://www.vasp.at/sign_in/portal/), we will not check your license in this case. + +Copy the VASP resource file `vasp.5.4.4.pl2.tgz` to the desired location, and unzip the file `tar zxvf vasp.5.4.4.pl2.tgz` to obtain the folder `/path/to/vasp-build-folder/vasp.5.4.4.pl2`and reveal its content. + +### Step 2: Prepare makefile.include + +We recommend to use GNU compilers parallelized using OpenMPI, combined with MKL for VASP compilation on Negishi. + +We are using MKL library, which include BLAS, LAPACK, ScaLAPACK, and FFTW as suggested at [VASP wiki](https://www.vasp.at/wiki/index.php/Installing_VASP.5.X.X#Requirements), and we can modify `makefile.include.linux_gnu` from `/arch` folder: + +``` +$ cd /path/to/vasp-build-folder/vasp.5.4.4.pl2 +cp arch/makefile.include.linux_gnu makefile.include +``` + +Here are the suggested changes for `makefile.include`, replace the lines between `DEBUG=-O0` and `OBJECTS= fftmpiw.o fftmpi_map.o fftw3d.o fft3dlib.o` with + +``` +# Intel MKL (FFTW, BLAS, LAPACK, and scaLAPACK) +LLIBS += -L${MKLROOT}/lib/intel64 -Wl,--no-as-needed -lmkl_gf_lp64 -lmkl_gnu_thread -lmkl_core -lmkl_scalapack_lp64 -lmkl_blacs_openmpi_lp64 -lgomp -lpthread -lm -ldl +INCS = -I$(MKLROOT)/include/fftw +FFLAGS += -march=znver3 + +# For gcc-10 and higher (comment out for older versions) +FFLAGS += -fallow-argument-mismatch +``` + +Remove all the `GPU stuff` at the end of `makefile.include` file + +Load the required modules: + +``` +module --force purge +module load gcc/12.2.0 openmpi/4.1.4 +module load intel-mkl/2019.9.304 +``` + +### Step 3: Make + +Build VASP with command `make all` to install all three executables `vasp_std`, `vasp_gam`, and `vasp_ncl` or use `make std` to install only the `vasp_std` executable. Use `make veryclean` to remove the build folder if you would like to start over the installation process. + +### Step 4: Test + +You can open an [Interactive session](../../run_jobs/interactive_jobs.md) to test the installed VASP with GNU/openMPI compilation, you may bring your own VASP test files: + +``` +$ cd /path/to/vasp-test-folder/ +module --force purge +module load gcc/12.2.0 openmpi/4.1.4 intel-mkl/2019.9.304 +module list +mpirun /path/to/vasp-build-folder/vasp.5.4.4.pl2/bin/vasp_std +``` + +### Step 5: submit a bash job + +To submit a bash job with your own compiled VASP on Negishi, here is an example about how to set up your environment and launch MPI code. + +``` +#!/bin/bash + +#SBATCH -A myqueuename # Queue name(use 'slist' command to find queues' name) +#SBATCH --nodes=1 # Total # of nodes +#SBATCH --ntasks=64 # Total # of MPI tasks +#SBATCH --time=1:00:00 # Total run time limit (hh:mm:ss) +#SBATCH -J myjobname # Job name +#SBATCH -o myjob.o%j # Name of stdout output file +#SBATCH -e myjob.e%j # Name of stderr error file + +# Manage processing environment,load compilers and applications. +module purge +module load gcc/12.2.0 openmpi/4.1.4 intel-mkl/2019.9.304 +module list +export PATH=/path/to/vasp-build-folder/vasp.x.x.x/bin:$PATH + +# Launch MPI code +mpirun -np $SLURM_NTASKS vasp_std +``` + +[**Back to the VASP section**](../vasp.md) diff --git a/docs/userguides/negishi/run_jobs/vasp/build-your-own-vasp-6.md b/docs/userguides/negishi/run_jobs/vasp/build-your-own-vasp-6.md new file mode 100644 index 00000000..3a8f44cd --- /dev/null +++ b/docs/userguides/negishi/run_jobs/vasp/build-your-own-vasp-6.md @@ -0,0 +1,97 @@ +--- +tags: + - Negishi +authors: + - hkashgar +resource: Negishi +search: + boost: 2 +--- + +# Build your own VASP 6 + +For VASP 6.X.X version, VASP provide several templates of [`makefile.include`](https://www.vasp.at/wiki/index.php/Makefile.include), which contain information such as precompiler options, compiler options, and how to link libraries. You can pick up one based on your system and preferred features . Here we provide some examples about how to install `vasp 6.4.1` on Negishi with different module environments. + +### Step 1: Download + +As a license holder, you can download the source code of VASP from the [VASP Portal](https://www.vasp.at/sign_in/portal/), we will not check your license in this case. + +Copy the VASP resource file `vasp.6.4.1.tgz` to the desired location, and unzip the file `tar zxvf vasp.6.4.1.tgz` to obtain the folder `/path/to/vasp-build-folder/vasp.6.4.1` and reveal its content. + +### Step 2: Prepare makefile.include + +We recommend to use GNU compilers parallelized using OpenMPI + OpenMP, combined with MKL for VASP build on Negishi. + +We are using MKL library, which include BLAS, LAPACK, ScaLAPACK, and FFTW as suggested at [VASP wiki](https://www.vasp.at/wiki/index.php/Installing_VASP.6.X.X#Requirements). We can modify `makefile.include.gnu_ompi_mkl_omp` from `/arch` folder to fit for system setup: + +``` +$ cd /path/to/vasp-build-folder/vasp.6.4.1 +$ cp makefile.include.gnu_ompi_mkl_omp makefile.include +``` + +Here are the suggested changes for `makefile.include`: + +* change `VASP_TARGET_CPU ?= -march=native` to + + ``` + VASP_TARGET_CPU ?= -march=znver3 + ``` +* remove `MKLROOT ?= /path/to/your/mkl/installation` +* change `LLIBS_MKL =` to + + ``` + LLIBS += + ``` +* comment out or remove all the lines after `INCS = -I$(MKLROOT)/include/fftw` + +Then, load the required modules: + +``` +$ module purge +$ module load gcc/12.2.0 openmpi/4.1.4 +$ module load intel-mkl/2019.9.304 +``` + +### Step 3: Make + +Open `makefile`, make sure the first line is `VERSIONS = std gam ncl`. + +Build VASP with command `make all` to install all three executables `vasp_std`, `vasp_gam`, and `vasp_ncl` or use `make std` to install only the `vasp_std` executable. Use `make veryclean` to remove the build folder if you would like to start over the installation process. + +### Step 4: Test + +You can open an [Interactive session](../../run_jobs/interactive_jobs.md) to test the installed VASP 6. Here is an example of testing above installed VASP 6.4.1 with GNU compilers and OpenMPI: + +``` +$ cd /path/to/vasp-build-folder/vasp.6.4.1/testsuite +$ module purge +$ module load gcc/12.2.0 openmpi/4.1.4 intel-mkl/2019.9.304 +$ ./runtest +``` + +### Step 5: Submit a bash job + +To submit a bash job with your own compiled VASP on Negishi, here is an example about how to set up your environment and launch MPI code. + +``` +#!/bin/bash + +#SBATCH -A myqueuename # Queue name(use 'slist' command to find queues' name) +#SBATCH --nodes=1 # Total # of nodes +#SBATCH --ntasks=64 # Total # of MPI tasks +#SBATCH --time=1:00:00 # Total run time limit (hh:mm:ss) +#SBATCH -J myjobname # Job name +#SBATCH -o myjob.o%j # Name of stdout output file +#SBATCH -e myjob.e%j # Name of stderr error file + +# Manage processing environment,load compilers and applications. +module purge +module load gcc/12.2.0 openmpi/4.1.4 intel-mkl/2019.9.304 +module list +export PATH=/path/to/vasp-build-folder/vasp.x.x.x/bin:$PATH + +# Launch MPI code +mpirun -np $SLURM_NTASKS vasp_std +``` + +[**Back to the VASP section**](../vasp.md) diff --git a/docs/userguides/negishi/run_jobs/vasp/vasp-job-submit-script.md b/docs/userguides/negishi/run_jobs/vasp/vasp-job-submit-script.md new file mode 100644 index 00000000..867e0c2c --- /dev/null +++ b/docs/userguides/negishi/run_jobs/vasp/vasp-job-submit-script.md @@ -0,0 +1,34 @@ +--- +tags: + - Negishi +authors: + - hkashgar +resource: Negishi +search: + boost: 2 +--- + +# VASP Job Submit Script + +This shows an example of a job submission file for running VASP pre-built on Negishi: + +``` +#!/bin/bash + +#SBATCH -A myqueuename # Queue name(use 'slist' command to find queues' name) +#SBATCH --nodes=1 # Total # of nodes +#SBATCH --ntasks=64 # Total # of MPI tasks +#SBATCH --time=1:00:00 # Total run time limit (hh:mm:ss) +#SBATCH -J myjobname # Job name +#SBATCH -o myjob.o%j # Name of stdout output file +#SBATCH -e myjob.e%j # Name of stderr error file + +# Manage processing environment, load compilers and applications. +module load vasp/5.4.4.pl2 # or module load vasp/6.4.1 +module list + +# Launch MPI code +mpirun -np $SLURM_NTASKS vasp_std +``` + +[**Back to the VASP section**](../vasp.md) From 020222bcdeec75fa23cd4590207dae9e45a4c086 Mon Sep 17 00:00:00 2001 From: hkashgar Date: Wed, 8 Jul 2026 16:45:01 -0500 Subject: [PATCH 15/26] windows examples --- docs/userguides/negishi/run_jobs/windows.md | 42 ++++++++++++++ .../negishi/run_jobs/windows/cmd.md | 57 +++++++++++++++++++ .../negishi/run_jobs/windows/launcher.md | 39 +++++++++++++ 3 files changed, 138 insertions(+) create mode 100644 docs/userguides/negishi/run_jobs/windows.md create mode 100644 docs/userguides/negishi/run_jobs/windows/cmd.md create mode 100644 docs/userguides/negishi/run_jobs/windows/launcher.md diff --git a/docs/userguides/negishi/run_jobs/windows.md b/docs/userguides/negishi/run_jobs/windows.md new file mode 100644 index 00000000..b335f1e1 --- /dev/null +++ b/docs/userguides/negishi/run_jobs/windows.md @@ -0,0 +1,42 @@ +--- +tags: + - Negishi +authors: + - hkashgar +resource: Negishi +search: + boost: 2 +--- + +# Windows + +Windows virtual machines (VMs) are supported as batch jobs on HPC systems. This section illustrates how to submit a job and run a Windows instance in order to run Windows applications on the high-performance computing systems. + +The following images are pre-configured and made available by staff: + +* Windows 2016 Server Basic (minimal software pre-loaded) +* Windows 2016 Server GIS (GIS Software Stack pre-loaded) + +The Windows VMs can be launched in two fashions: + +* [Menu Launcher](windows/launcher.md) - Point and click to start +* [Command Line](windows/cmd.) - Advanced and customized usage + +Click each of the above links for detailed instructions on using them. + +## Software Provided in Pre-configured Virtual Machines + +The Windows 2016 Base server image available on ${resource.name} has the following software packages preloaded: + +* Anaconda Python 2 and Python 3 +* JMP 13 +* Matlab R2017b +* Microsoft Office 2016 +* Notepad++ +* NVivo 12 +* Rstudio +* Stata SE 15 +* VLC Media Player + + +[**Back to the Running Jobs section**](../run_jobs/index.md) diff --git a/docs/userguides/negishi/run_jobs/windows/cmd.md b/docs/userguides/negishi/run_jobs/windows/cmd.md new file mode 100644 index 00000000..0f3e81ef --- /dev/null +++ b/docs/userguides/negishi/run_jobs/windows/cmd.md @@ -0,0 +1,57 @@ +--- +tags: + - Negishi +authors: + - hkashgar +resource: Negishi +search: + boost: 2 +--- + +# Command line + +If you wish to work with Windows VMs on the command line or work into scripted workflows you can interact directly with the Windows system: + +Copy a Windows 2016 Server VM image to your storage. Scratch or Research Data Depot are good locations to save a VM image. If you are using scratch, remember that **scratch spaces are temporary**, and be sure to safely back up your disk image somewhere permanent, such as Research Data Depot or Fortress. To copy a basic image: + +``` +$ cp /apps/external/apps/windows/images/latest.qcow2  $RCAC_SCRATCH/windows.qcow2 +``` + +To copy a GIS image: + +``` +$ cp /depot/itap/windows/gis/2k16.qcow2 $RCAC_SCRATCH/windows.qcow2 +``` + +To launch a virtual machine in a batch job, use the "windows" script, specifying the path to your Windows virtual machine image. With no other command-line arguments, the `windows` script will autodetect a number cores and memory for the Windows VM. A Windows network connection will be made to your home directory. To launch: + +``` +$ windows -i $RCAC_SCRATCH/windows.qcow2 +``` + +## Command line options: + +``` +-i (For example, $RCAC_SCRATCH/windows-2k16.qcow2) +-m G (For example, 32G) +-c (For example, 20) +-s (UNIX Path to map as a drive, for example, $RCAC_SCRATCH) +-b (If present, launches VM in background. Use VNC to connect to Windows.) +``` + +To launch a virtual machine with 32GB of RAM, 20 cores, and a network mapping to your home directory: + +``` +$ windows -i /path/to/image.qcow2 -m 32G -c 20 -s $HOME +``` + +To launch a virtual machine with 16GB of RAM, 10 cores, and a network mapping to your Data Depot space: + +``` +$ windows -i /path/to/image.qcow2 -m 16G -c 10 -s /depot/mylab +``` +The Windows 2016 server desktop will open, and automatically log in as an administrator, so that you can install any software into the Windows virtual machine that your research requires. Changes to the image will be stored in the file specified with the `-i` option. + + +[**Back to the Running Jobs section**](../../run_jobs/index.md) diff --git a/docs/userguides/negishi/run_jobs/windows/launcher.md b/docs/userguides/negishi/run_jobs/windows/launcher.md new file mode 100644 index 00000000..565934c0 --- /dev/null +++ b/docs/userguides/negishi/run_jobs/windows/launcher.md @@ -0,0 +1,39 @@ +--- +tags: + - Negishi +authors: + - hkashgar +resource: Negishi +search: + boost: 2 +--- + +# Menu Launcher + +Windows VMs can be easily launched through the [thinlinc](../../../accounts/#thinlinc) remote desktop environment. + +* Log in via [thinlinc](../../../accounts/#thinlinc). +* Click on Applications menu in the upper left corner. +* Look under the Cluster Software menu. +* The "Windows 10" launcher will launch a VM directly on the front-end. +* Follow the dialogs to set up your VM. + +![Thinlinc Applications list](../../../../../assets/images/userguides/examples/windows.png) + +*Find Windows 10 under the 'Cluster Software' option in the list of Applications.* + +The dialog menus will walk you through setting up and loading your VM. + +* You can choose to create a new image or load a saved image. +* New VMs should be saved on Scratch or Research Data Depot as they are too large for Home Directories. +* If you are using scratch, remember that **scratch spaces are temporary**, and be sure to safely back up your disk image somewhere permanent, such as Research Data Depot or Fortress. + +You will also be prompted to select a storage space to mount on your image (Home, Scratch, or Data Depot). You can only choose one to be mounted. It will appear on a shortcut on the desktop once the VM loads. + +## Notes + +Using the menu launcher will launch automatically select reasonable CPU and memory values. If you wish to choose other options or work Windows VMs into scripted workflows see the section on [using the command line](cmd.md). + + + +[**Back to the Running Jobs section**](../../run_jobs/index.md) From 3086c96a34c504f5a7687ebce18da1852cef7919 Mon Sep 17 00:00:00 2001 From: hkashgar Date: Wed, 8 Jul 2026 16:47:20 -0500 Subject: [PATCH 16/26] windows examples --- docs/userguides/negishi/run_jobs/index.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/docs/userguides/negishi/run_jobs/index.md b/docs/userguides/negishi/run_jobs/index.md index 0ebfebf1..85fbb127 100644 --- a/docs/userguides/negishi/run_jobs/index.md +++ b/docs/userguides/negishi/run_jobs/index.md @@ -41,8 +41,10 @@ Batch jobs submitted via SLURM have four main steps: - [**R**](r.md) - [**Apptainer**](apptainer.md) - [**Matlab**](matlab.md) -- [**Ansys**](ansysfluent_example.md) -- [**Gaussian**](gaussian_example.md) +- [**Ansys**](ansysfluent.md) +- [**Gaussian**](gaussian.md) +- [**VASP**](vasp.md) +- [**Windows**](windows.md) - [**MPI**](mpi_jobs.md) - [**OpenMP**](openmp_jobs.md) -- [**GPU**](gpu_jobs.md) + From 223751899b59b3ff6b3fcc7bcb2de447f206aefc Mon Sep 17 00:00:00 2001 From: hkashgar Date: Wed, 8 Jul 2026 16:53:28 -0500 Subject: [PATCH 17/26] biocontainer examples --- .../negishi/run_jobs/biocontainers.md | 86 +++++++++++++++++++ docs/userguides/negishi/run_jobs/index.md | 1 + 2 files changed, 87 insertions(+) create mode 100644 docs/userguides/negishi/run_jobs/biocontainers.md diff --git a/docs/userguides/negishi/run_jobs/biocontainers.md b/docs/userguides/negishi/run_jobs/biocontainers.md new file mode 100644 index 00000000..07b92540 --- /dev/null +++ b/docs/userguides/negishi/run_jobs/biocontainers.md @@ -0,0 +1,86 @@ +--- +tags: + - Negishi +authors: + - jin456 + - remender +resource: Negishi +search: + boost: 2 +--- +# BioContainers Collection + +What is BioContainers? +---------------------- + +The BioContainers project came from the idea of using the containers-based technologies such as [Docker](https://www.docker.com) or [rkt](https://github.com/rkt/rkt) for bioinformatics software. Having a common and controllable environment for running software could help to deal with some of the current problems during software development and distribution. BioContainers is a community-driven project that provides the infrastructure and basic guidelines to create, manage and distribute bioinformatics containers with a special focus on omics fields such as proteomics, genomics, transcriptomics and metabolomics. . For more information, please visit [BioContainers project](https://biocontainers.pro). + +### Getting Started + +Users can download bioinformatic containers from the [BioContainers.pro](https://biocontainers.pro) and run them directly using Singularity instructions from the corresponding container’s catalog page. + +Brief Singularity guide and examples are available at the [Negishi Singularity user guide](apptainer.md) page. Detailed Singularity user guide is available at: [sylabs.io/guides/3.8/user-guide](https://sylabs.io/guides/3.8/user-guide/) + +In addition, a subset of pre-downloaded biocontainers wrapped into convenient software modules are provided. These modules wrap underlying complexity and provide the same commands that are expected from non-containerized versions of each application. + +On Negishi, type the command below to see the lists of biocontainers we deployed. + +``` +module load biocontainers +module avail + +------------ BioContainers collection modules ------------- + bamtools/2.5.1 + beast2/2.6.3 + bedtools/2.30.0 + blast/2.11.0 + bowtie2/2.4.2 + bwa/0.7.17 + cufflinks/2.2.1 + deeptools/3.5.1 + fastqc/0.11.9 + faststructure/1.0 + htseq/0.13.5 +[....] +``` + +### Example + +This example demonstrates how to run BLASTP with the `blast` module. This `blast` module is a biocontainer wrapper for [NCBI BLAST](https://blast.ncbi.nlm.nih.gov). + +``` +module load biocontainers +module load blast +blastp -query query.fasta -db nr -out output.txt -outfmt 6 -evalue 0.01 +``` + +To run a job in batch mode, first prepare a job script that specifies the BioContainer modules you want to launch and the resources required to run it. Then, use the `sbatch` command to submit your job script to Slurm. The following example shows the job script to use [Bowtie2](http://bowtie-bio.sourceforge.net/bowtie2/index.shtml) in bioinformatic analysis. + +``` +#!/bin/bash + +#SBATCH -A myqueuename +#SBATCH -o bowtie2_%j.txt +#SBATCH -e bowtie2_%j.err +#SBATCH --nodes=1 +#SBATCH --ntasks-per-node=1 +#SBATCH --cpus-per-task=8 +#SBATCH --time=1:30:00 +#SBATCH --job-name bowtie2 + +# Load the Bowtie module +module load biocontainers +module load bowtie2 + +# Indexing a reference genome +bowtie2-build ref.fasta ref + +# Aligning paired-end reads +bowtie2 -p 8 -x ref -1 reads_1.fq -2 reads_2.fq -S align.sam +``` + +To help users get started, we provided detailed user guides for each containerized bioinformatics module on the [ReadTheDocs platform](https://biocontainer-doc.readthedocs.io/en/latest/) + +![RCAC Biocontainers one ReadTheDocs](../../../../assets/images/userguides/examples/biocontainers.png) + +[**Back to the Running Jobs section**](../run_jobs/index.md) diff --git a/docs/userguides/negishi/run_jobs/index.md b/docs/userguides/negishi/run_jobs/index.md index 85fbb127..a2b6878a 100644 --- a/docs/userguides/negishi/run_jobs/index.md +++ b/docs/userguides/negishi/run_jobs/index.md @@ -40,6 +40,7 @@ Batch jobs submitted via SLURM have four main steps: - [**Python**](python.md) - [**R**](r.md) - [**Apptainer**](apptainer.md) +- [**Biocontainers**](biocontainers.md) - [**Matlab**](matlab.md) - [**Ansys**](ansysfluent.md) - [**Gaussian**](gaussian.md) From 3817cde59209b2912fb00c22446a98855840b8f3 Mon Sep 17 00:00:00 2001 From: hkashgar Date: Wed, 8 Jul 2026 17:12:20 -0500 Subject: [PATCH 18/26] gateway --- .../images/userguides/negishi/bio_negishi.jpg | Bin 0 -> 42816 bytes docs/userguides/negishi/gateway.md | 33 ++++++ docs/userguides/negishi/gateway/cluster.md | 19 ++++ docs/userguides/negishi/gateway/files.md | 41 +++++++ .../userguides/negishi/gateway/interactive.md | 24 +++++ .../negishi/gateway/interactive/desktop.md | 21 ++++ .../negishi/gateway/interactive/matlab.md | 24 +++++ .../negishi/gateway/interactive/notebook.md | 31 ++++++ .../negishi/gateway/interactive/rstudio.md | 21 ++++ docs/userguides/negishi/gateway/jobs.md | 102 ++++++++++++++++++ .../run_jobs/r/example_rstudio_app_menu.png | Bin 0 -> 236689 bytes 11 files changed, 316 insertions(+) create mode 100644 docs/assets/images/userguides/negishi/bio_negishi.jpg create mode 100644 docs/userguides/negishi/gateway.md create mode 100644 docs/userguides/negishi/gateway/cluster.md create mode 100644 docs/userguides/negishi/gateway/files.md create mode 100644 docs/userguides/negishi/gateway/interactive.md create mode 100644 docs/userguides/negishi/gateway/interactive/desktop.md create mode 100644 docs/userguides/negishi/gateway/interactive/matlab.md create mode 100644 docs/userguides/negishi/gateway/interactive/notebook.md create mode 100644 docs/userguides/negishi/gateway/interactive/rstudio.md create mode 100644 docs/userguides/negishi/gateway/jobs.md create mode 100644 docs/userguides/negishi/run_jobs/r/example_rstudio_app_menu.png diff --git a/docs/assets/images/userguides/negishi/bio_negishi.jpg b/docs/assets/images/userguides/negishi/bio_negishi.jpg new file mode 100644 index 0000000000000000000000000000000000000000..94383998763c45a17dfdffda2085f99e85354dd7 GIT binary patch literal 42816 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�hG)J319`cfiNBSFmW0y34G|amc0O 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 Ok@&}ZOqZE|bN>UR7x^pz literal 0 HcmV?d00001 diff --git a/docs/userguides/negishi/gateway.md b/docs/userguides/negishi/gateway.md new file mode 100644 index 00000000..06f53c97 --- /dev/null +++ b/docs/userguides/negishi/gateway.md @@ -0,0 +1,33 @@ +--- +tags: + - Negishi +authors: + - hkashgar +resource: Negishi +search: + boost: 2 +--- + +# Gateway (Open OnDemand) + +Negishi's Gateway is an [open-source HPC portal](http://openondemand.org/) developed by the [Ohio Supercomputing Center](https://www.osc.edu/). Open OnDemand allows one to interact with HPC resources through a web browser and easily manage files, submit jobs, and interact with graphical applications directly in a browser, all with no software to install. Negishi has an instance of OnDemand available that can be accessed via [gateway.negishi.rcac.purdue.edu](https://gateway.negishi.rcac.purdue.edu). + +## Logging In + +To log into Gateway: + +* Navigate to [gateway.negishi.rcac.purdue.edu](https://gateway.negishi.rcac.purdue.edu) +* Log in using your Career account username and Purdue Login Duo client. + +On the splash page you will see a quota usage report. If you are over 90% on any of your quotas a warning will be displayed. This information will update every 10-15 minutes while you are active on Gateway. + +## Apps + +There are a number of built-in apps in Gateway that can be accessed from the top menu bar. Below are links to documentation on each app. + +- [Interactive Apps](gateway/interactive.md) +- [Files](gateway/files.md) +- [Jobs](gateway/jobs.md) +- [Cluster Tools](gateway/cluster.md) + +[**Back to Negishi User Guide**](index.md) diff --git a/docs/userguides/negishi/gateway/cluster.md b/docs/userguides/negishi/gateway/cluster.md new file mode 100644 index 00000000..8e58ae4e --- /dev/null +++ b/docs/userguides/negishi/gateway/cluster.md @@ -0,0 +1,19 @@ +--- +tags: + - Negishi +authors: + - hkashgar +resource: Negishi +search: + boost: 2 +--- + +# Cluster Tools + +The Cluster Tools menu contains cluster utilities. At the moment, only a terminal app is provided. Additional apps may be developed and provided in the future. + +## Shell Access + +Launching the shell app will provide you with a web-based terminal session on the cluster front-end. This is equivalent to using a standalone SSH client to connect to `negishi.rcac.purdue.edu` where you are connected to one several front-ends. The normal acceptable [front-end use policy](https://www.rcac.purdue.edu/policies/frontenduse) applies to access through the web-app. X11 Forwarding is not supported. Use of one of the [interactive apps](interactive.md) is recommended for graphical applications. + +[**Back to the Gateway (Open OnDemand) section**](../gateway.md) diff --git a/docs/userguides/negishi/gateway/files.md b/docs/userguides/negishi/gateway/files.md new file mode 100644 index 00000000..c57f47d9 --- /dev/null +++ b/docs/userguides/negishi/gateway/files.md @@ -0,0 +1,41 @@ +--- +tags: + - Negishi +authors: + - hkashgar +resource: Negishi +search: + boost: 2 +--- + +# Files + +The Files app will let you access your files in your [Home Directory](../storage/home_directory.md), [Scratch](../storage/scratch_space.md), and [Data Depot](https://www.rcac.purdue.edu/storage/depot) spaces. The app lets you manage create, manage, and delete files and directories from your web browser. Navigate by double clicking on folders in the file explorer or by using the file tree on the left. + +

+ Open OnDemand file browser +

+ + +The browser-based file explorer. Navigate by double clicking on folders in the file explorer or by using the file tree on the left. + +On the top row, there are buttons to: + +* Go To: directly input a directory to navigate to +* Open in Terminal: launches the Shell app and navigates you to the current directory in the terminal +* New File: creates a new, empty file +* New Dir: creates a new, empty directory +* Upload: upload a file from your computer + +**Note:** File uploads from your browser are limited to 100 GB per file. Be mindful that uploads over a few gigabytes may be unreliable through your browser, especially from off-campus connections. For very large files or off-campus transfers alternative methods such as [Globus](../storage/globus.md) are highly recommended. + +The second row of buttons lets you perform typical file management operations. The Edit button will open files in a fully fledged browser based text editor - it features syntax highlighting and vim and Emacs key bindings. + +

+ Open OnDemand file editor +

+ + +The browser-based text editor interface, shown here editing a Bash script, includes syntax highlighting, font-size adjustments, and various key bindings. + +[**Back to the Gateway (Open OnDemand) section**](../gateway.md) diff --git a/docs/userguides/negishi/gateway/interactive.md b/docs/userguides/negishi/gateway/interactive.md new file mode 100644 index 00000000..aab329f0 --- /dev/null +++ b/docs/userguides/negishi/gateway/interactive.md @@ -0,0 +1,24 @@ +--- +tags: + - Negishi +authors: + - hkashgar +resource: Negishi +search: + boost: 2 +--- + +# Interactive Apps + +There are several interactive apps available through Gateway that can be accessed through the Interactive Apps dropdown menu. These apps are provided with a basic node and software configuration as a 'quick-launch' option to get your work up and running quickly. For simplicity, minimal options are provided - these apps are not intended for complex configuration/customization scenarios. + +After you a submit an interactive app to the queue, Gateway will track and manage the session. Once it starts, you may connect and disconnect from the session in your browser, leaving the job running while you log out of your browser. + +Each of the available apps are documented through the following links. + +- [Compute Node Desktop](interactive/desktop.md) +- [Jupyter Notebook](interactive/notebook.md) +- [MATLAB](interactive/matlab.md) +- [RStudio Server](interactive/rstudio.md) + +[**Back to the Gateway (Open OnDemand) section**](../gateway.md) diff --git a/docs/userguides/negishi/gateway/interactive/desktop.md b/docs/userguides/negishi/gateway/interactive/desktop.md new file mode 100644 index 00000000..076bb02b --- /dev/null +++ b/docs/userguides/negishi/gateway/interactive/desktop.md @@ -0,0 +1,21 @@ +--- +tags: + - Negishi +authors: + - hkashgar +resource: Negishi +search: + boost: 2 +--- + +# Compute Node Desktop + +The Compute Node Desktop app will launch a graphical desktop session on a compute node. This is similar to using [ThinLinc](/userguides/negishi/accounts/#thinlinc), however, this gives you a desktop directly on a compute node instead on a front-end. This app is useful if you have a custom application or application not directly available as an interactive app you would like to run inside Gateway. + +To launch a desktop session on a compute node, select the Negishi Compute Desktop app. From the submit form, select from the available options - the queue to which you wish to submit and the number of wallclock hours you wish to have job running. There is also a checkbox that enable a notification to your email when the job starts. + +After the interactive job is submitted you will be taken to your list of active interactive app sessions. You can monitor the status of the job from here until it starts, or if you enabled the email notification, watch your Purdue email for the notification the job has started. + +Once it is indicated the job has started you can connect to the desktop with the "Launch noVNC in New Tab" button. The session will be terminated after the wallclock hours you specified have elapsed or you terminate the session early with the "Delete" button from the list of sessions. Deleting the session when you are finished will free up queue resources for your lab mates and other users on the system. + +[**Back to the Interactive Apps section**](../interactive.md) diff --git a/docs/userguides/negishi/gateway/interactive/matlab.md b/docs/userguides/negishi/gateway/interactive/matlab.md new file mode 100644 index 00000000..6041469e --- /dev/null +++ b/docs/userguides/negishi/gateway/interactive/matlab.md @@ -0,0 +1,24 @@ +--- +tags: + - Negishi +authors: + - hkashgar +resource: Negishi +search: + boost: 2 +--- + +# MATLAB + +The MATLAB app will launch a MATLAB session on a compute node and allow you to connect directly to it in a web browser. + +To launch a MATLAB session on a compute node, select the MATLAB app. From the submit form, select from the available options - the version of MATLAB you are interested in running, the queue to which you wish to submit, and the number of wallclock hours you wish to have job running. There is also a checkbox that enable a notification to your email when the job starts. + +After the interactive job is submitted you will be taken to your list of active interactive app sessions. You can monitor the status of the job from here until it starts, or if you enabled the email notification, watch your Purdue email for the notification the job has started. + +Once it is indicated the job has started you can connect to the desktop with the "Launch noVNC in New Tab" button. The session will be terminated after the wallclock hours you specified have elapsed or you terminate the session early with the "Delete" button from the list of sessions. Deleting the session when you are finished will free up queue resources for your lab mates and other users on the system. + +!!! Warning + There are known issues with running Matlab in this way and resizing your web browser. Graphical corruption may occur if you resize the browser. Fixes for this are being investigated. + +[**Back to the Interactive Apps section**](../interactive.md) diff --git a/docs/userguides/negishi/gateway/interactive/notebook.md b/docs/userguides/negishi/gateway/interactive/notebook.md new file mode 100644 index 00000000..d23ce9b8 --- /dev/null +++ b/docs/userguides/negishi/gateway/interactive/notebook.md @@ -0,0 +1,31 @@ +--- +tags: + - Negishi +authors: + - hkashgar +resource: Negishi +search: + boost: 2 +--- + +# Jupyter Notebook + +The Notebook app will launch a Notebook session on a compute node and allow you to connect directly to it in a web browser. + +To launch a Notebook session on a compute node, select the Notebook app. From the submit form, select from the available options: + +1. **Queue:**This is a dropdown menu from which you can select a queue from all of the queues to which you have permission to submit. +2. **Walltime:**This is a field which expects a number and represents how many hours you want to keep the session running. Note that this value should not exceed the maximum value given next to the selected queue name from the queue dropdown menu. +3. **Number of Cores/GPUs:** This is a field which expects a number and represents the number of your resources your session is requesting. Note that the amount of memory allocated for your session is proportional to the number of cores or GPUs that you request for your job, so if your session is running out of memory, consider increasing this value. +4. **Use Jupyter Lab:**This is a checkbox which, when checked, will run Jupyter Lab instead of Jupyter Notebook. Both of these applications are interfaces to Jupyter, and you can launch Jupyter notebooks from within Jupyter Lab. Jupyter Notebook is more "barebones" while Jupyter Lab has additional features such as the ability to interact with additional file types. +5. **E-mail Notice:**This is a checkbox which, when checked, will send you an e-mail notification to your Purdue e-mail that your session is ready when the scheduler has found resources to dedicate to your session. + +After the interactive job is submitted you will be taken to your list of active interactive app sessions. You can monitor the status of the job from here until it starts, or if you enabled the email notification, watch your Purdue email for the notification the job has started. + +Once it is indicated the job has started you can connect to the desktop with the "Connect to Jupyter" button. Once connected, you can create new notebooks, selecting the currently available Anaconda versions available as modules, and any personally created Notebook kernels. + +Often times you may want to use one of your existing Anaconda environments within your Jupyter session to use libraries specific to your workflow. In order to do so, you must ensure that the Anaconda environment you want to use contains the Python packages "IPyKernel" and "IPython" which are packages that are required by Jupyter. When you create a Jupyter session, Open OnDemand will check through your existing Anaconda environments and create a Jupyter kernel for any Anaconda environment that contains these two packages, and you will be able to select to use that kernel from within the application. + +The session will be terminated after the number of hours you specified have elapsed or you terminate the session early with the "Delete" button from the list of sessions. Deleting the session when you are finished will free up queue resources for your lab mates and other users on the system. + +[**Back to the Interactive Apps section**](../interactive.md) diff --git a/docs/userguides/negishi/gateway/interactive/rstudio.md b/docs/userguides/negishi/gateway/interactive/rstudio.md new file mode 100644 index 00000000..b8a1f90a --- /dev/null +++ b/docs/userguides/negishi/gateway/interactive/rstudio.md @@ -0,0 +1,21 @@ +--- +tags: + - Negishi +authors: + - hkashgar +resource: Negishi +search: + boost: 2 +--- + +# RStudio Server + +The RStudio app will launch a RStudio session on a compute node and allow you to connect directly to it in a web browser. + +To launch a RStudio session on a compute node, select the RStudio app. From the submit form, select from the available options - the queue to which you wish to submit, and the number of wallclock hours you wish to have job running. There is also a checkbox that enable a notification to your email when the job starts. + +After the interactive job is submitted you will be taken to your list of active interactive app sessions. You can monitor the status of the job from here until it starts, or if you enabled the email notification, watch your Purdue email for the notification the job has started. + +Once it is indicated the job has started you can connect to the desktop with the "Connect to RStudio Server" button. The session will be terminated after the wallclock hours you specified have elapsed or you terminate the session early with the "Delete" button from the list of sessions. Deleting the session when you are finished will free up queue resources for your lab mates and other users on the system. + +[**Back to the Interactive Apps section**](../interactive.md) diff --git a/docs/userguides/negishi/gateway/jobs.md b/docs/userguides/negishi/gateway/jobs.md new file mode 100644 index 00000000..2a80a95c --- /dev/null +++ b/docs/userguides/negishi/gateway/jobs.md @@ -0,0 +1,102 @@ +--- +tags: + - Negishi +authors: + - hkashgar +resource: Negishi +search: + boost: 2 +--- + +# Jobs + +There are two apps under the Jobs apps: Active Jobs and Job Composer. These are detailed below. + +## Active Jobs + +This shows you active SLURM jobs currently on the cluster. The default view will show you your current jobs, similar to `squeue -u rices`. Using the button labeled "Your Jobs" in the upper right allows you to select different filters by queue (account). All accounts output by `slist` will appear for you here. Using the arrow on the left hand side will expand the full job details. + + +

+ A table of active jobs +

+ + +The table of active jobs shows useful information such as queue, status, cluster, and ID. It can be sorted by clicking the headers of each column or searched with the "Filter" box above it. + + +### Job Composer + +The Job Composer app allows you to create and submit jobs to the cluster. You can select from pre-defined templates (most of these are taken from the User Guide examples) or you can create your own templates for frequently used workflows. + +### Creating Job from Existing Template + +Click "New Job" menu, then select "From Template": + +

+ The job composer interface +

+ + +When clicking the 'New Job' button a drop-down will show a few options. "From Template" is usually the second item in the list. + +Then select from one of the available templates. + + +

+ A sortable data table containing a list of all the available templates. +

+ + +Select one of the templates by clicking its row in the table of available templates. + + +Click 'Create New Job' in second pane. + + +

+ The 'Create New Job' pane +

+ + +The "Create New Job" pane will show form options for "Job Name", "Cluster", and "Script Name" with the "Create New Job" button below. + + +Your new job should be selected in your list of jobs. In the 'Submit Script' pane you can see the job script that was generated with an 'Open Editor' link to open the script in the built-in editor. Open the file in the editor and edit the script as necessary. By default the job will specify standby queue - this should be changed as appropriate, along with the node and walltime requests. + + +

+ The 'Submit Script' pane +

+ + +The "Submit Script" pane will show a preview of the contents of the script file and action buttons below. + + +When you are finished with editing the job and are ready to submit, click the green 'Submit' button at the top of the job list. You can monitor progress from here or from the Active Jobs app. Once completed, you should see the output files appear: + +

+ A list of files found in the output folder +

+ + +The folder contents will be listed, showing the resulting output files from running the submitted script. + +Clicking on one of the output files will open it in the file editor for your viewing. + +## Creating New Template + +First, prepare a template directory containing a template submission script along with any input files. Then, to import the job into the Job Composer app, click the 'Create New Template' button. Fill in the directory containing your template job script and files in the first box. Give it an appropriate name and notes. + + +

+ The 'Create New Template' form +

+ + +The "Create New Template" form has inputs for "Path", "Name", "Cluster", and "Notes". If "Path" is left blank, a default job script will be added to the new template. + + +This template will now appear in your list of templates to choose from when composing jobs. You can now go create and submit a job from this new template. + +[**Back to the Gateway (Open OnDemand) section**](../gateway.md) diff --git a/docs/userguides/negishi/run_jobs/r/example_rstudio_app_menu.png b/docs/userguides/negishi/run_jobs/r/example_rstudio_app_menu.png new file mode 100644 index 0000000000000000000000000000000000000000..17992cbacd04e1f7b5aaa5b810906174bedb9a8b GIT binary patch literal 236689 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

)zrQaS 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

Q2u-> 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 Date: Wed, 8 Jul 2026 17:31:09 -0500 Subject: [PATCH 19/26] storage and file sharing --- docs/userguides/negishi/storage.md | 47 +++++++++++++++++++ .../storage/archive_and_compression.md | 14 ++++++ .../negishi/storage/environment_variables.md | 14 ++++++ docs/userguides/negishi/storage/ftp_sftp.md | 14 ++++++ docs/userguides/negishi/storage/globus.md | 14 ++++++ .../negishi/storage/home_directory.md | 14 ++++++ docs/userguides/negishi/storage/hsi.md | 14 ++++++ docs/userguides/negishi/storage/htar.md | 14 ++++++ .../negishi/storage/long_term_storage.md | 14 ++++++ docs/userguides/negishi/storage/recover.md | 36 ++++++++++++++ .../negishi/storage/recover/flost.md | 14 ++++++ .../userguides/negishi/storage/recover/mac.md | 14 ++++++ .../negishi/storage/recover/manual.md | 14 ++++++ .../negishi/storage/recover/windows.md | 14 ++++++ docs/userguides/negishi/storage/scp.md | 14 ++++++ .../negishi/storage/scratch_space.md | 15 ++++++ docs/userguides/negishi/storage/sharing.md | 14 ++++++ .../negishi/storage/storage_quota.md | 14 ++++++ .../negishi/storage/tmp_directory.md | 14 ++++++ .../negishi/storage/windows_network_drive.md | 14 ++++++ 20 files changed, 336 insertions(+) create mode 100644 docs/userguides/negishi/storage.md create mode 100644 docs/userguides/negishi/storage/archive_and_compression.md create mode 100644 docs/userguides/negishi/storage/environment_variables.md create mode 100644 docs/userguides/negishi/storage/ftp_sftp.md create mode 100644 docs/userguides/negishi/storage/globus.md create mode 100644 docs/userguides/negishi/storage/home_directory.md create mode 100644 docs/userguides/negishi/storage/hsi.md create mode 100644 docs/userguides/negishi/storage/htar.md create mode 100644 docs/userguides/negishi/storage/long_term_storage.md create mode 100644 docs/userguides/negishi/storage/recover.md create mode 100644 docs/userguides/negishi/storage/recover/flost.md create mode 100644 docs/userguides/negishi/storage/recover/mac.md create mode 100644 docs/userguides/negishi/storage/recover/manual.md create mode 100644 docs/userguides/negishi/storage/recover/windows.md create mode 100644 docs/userguides/negishi/storage/scp.md create mode 100644 docs/userguides/negishi/storage/scratch_space.md create mode 100644 docs/userguides/negishi/storage/sharing.md create mode 100644 docs/userguides/negishi/storage/storage_quota.md create mode 100644 docs/userguides/negishi/storage/tmp_directory.md create mode 100644 docs/userguides/negishi/storage/windows_network_drive.md diff --git a/docs/userguides/negishi/storage.md b/docs/userguides/negishi/storage.md new file mode 100644 index 00000000..ad8fd49c --- /dev/null +++ b/docs/userguides/negishi/storage.md @@ -0,0 +1,47 @@ +--- +tags: + - Negishi +authors: + - jin456 + - hkashgar + - remender +resource: Negishi +search: + boost: 2 +--- + +# File Storage and Transfer + +Learn more about file storage transfer for Negishi. + +## 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 + +Negishi 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 Negishi User Guide**](./index.md) diff --git a/docs/userguides/negishi/storage/archive_and_compression.md b/docs/userguides/negishi/storage/archive_and_compression.md new file mode 100644 index 00000000..4d9934a2 --- /dev/null +++ b/docs/userguides/negishi/storage/archive_and_compression.md @@ -0,0 +1,14 @@ +--- +tags: + - Negishi +authors: + - jin456 + - hkashgar +resource: Negishi +search: + boost: 2 +--- + +--8<-- "docs/snippets/archive_and_compression.md" + +[**Back to the Storage section**](../storage.md) diff --git a/docs/userguides/negishi/storage/environment_variables.md b/docs/userguides/negishi/storage/environment_variables.md new file mode 100644 index 00000000..f3a4b060 --- /dev/null +++ b/docs/userguides/negishi/storage/environment_variables.md @@ -0,0 +1,14 @@ +--- +tags: + - Negishi +authors: + - jin456 + - hkashgar +resource: Negishi +search: + boost: 2 +--- + +{{ environment_variables(resource) }} + +[**Back to the Storage section**](../storage.md) diff --git a/docs/userguides/negishi/storage/ftp_sftp.md b/docs/userguides/negishi/storage/ftp_sftp.md new file mode 100644 index 00000000..082048fd --- /dev/null +++ b/docs/userguides/negishi/storage/ftp_sftp.md @@ -0,0 +1,14 @@ +--- +tags: + - Negishi +authors: + - jin456 + - hkashgar +resource: Negishi +search: + boost: 2 +--- + +{{ ftp_sftp_snippet(resource) }} + +[**Back to the Storage section**](../storage.md) diff --git a/docs/userguides/negishi/storage/globus.md b/docs/userguides/negishi/storage/globus.md new file mode 100644 index 00000000..2cabca11 --- /dev/null +++ b/docs/userguides/negishi/storage/globus.md @@ -0,0 +1,14 @@ +--- +tags: + - Negishi +authors: + - jin456 + - hkashgar +resource: Negishi +search: + boost: 2 +--- + +{{ globus_snippet(resource) }} + +[**Back to the Storage section**](../storage.md) diff --git a/docs/userguides/negishi/storage/home_directory.md b/docs/userguides/negishi/storage/home_directory.md new file mode 100644 index 00000000..606d94c1 --- /dev/null +++ b/docs/userguides/negishi/storage/home_directory.md @@ -0,0 +1,14 @@ +--- +tags: + - Negishi +authors: + - jin456 + - hkashgar +resource: Negishi +search: + boost: 2 +--- + +--8<-- "docs/snippets/home_directory.md" + +[**Back to the Storage section**](../storage.md) diff --git a/docs/userguides/negishi/storage/hsi.md b/docs/userguides/negishi/storage/hsi.md new file mode 100644 index 00000000..7a2b6858 --- /dev/null +++ b/docs/userguides/negishi/storage/hsi.md @@ -0,0 +1,14 @@ +--- +tags: + - Negishi +authors: + - jin456 + - hkashgar +resource: Negishi +search: + boost: 2 +--- + +{{ hsi_snippet(resource) }} + +[**Back to the Storage section**](../storage.md) diff --git a/docs/userguides/negishi/storage/htar.md b/docs/userguides/negishi/storage/htar.md new file mode 100644 index 00000000..c5b720a9 --- /dev/null +++ b/docs/userguides/negishi/storage/htar.md @@ -0,0 +1,14 @@ +--- +tags: + - Negishi +authors: + - jin456 + - hkashgar +resource: Negishi +search: + boost: 2 +--- + +{{ htar_snippet(resource) }} + +[**Back to the Storage section**](../storage.md) diff --git a/docs/userguides/negishi/storage/long_term_storage.md b/docs/userguides/negishi/storage/long_term_storage.md new file mode 100644 index 00000000..34b4d4ac --- /dev/null +++ b/docs/userguides/negishi/storage/long_term_storage.md @@ -0,0 +1,14 @@ +--- +tags: + - Negishi +authors: + - hkashgar + - jin456 +resource: Negishi +search: + boost: 2 +--- + +--8<-- "docs/snippets/long_term_storage.md" + +[**Back to the Storage section**](../storage.md) diff --git a/docs/userguides/negishi/storage/recover.md b/docs/userguides/negishi/storage/recover.md new file mode 100644 index 00000000..6e4ee59c --- /dev/null +++ b/docs/userguides/negishi/storage/recover.md @@ -0,0 +1,36 @@ +--- +tags: + - Negishi +authors: + - jin456 + - hkashgar +resource: Negishi +search: + boost: 2 +--- + +# Lost File Recovery + +Negishi 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. Negishi **does** protect against hardware failures or physical disasters through other means however these other means are also **not** substitutes for backups. + +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. + +Negishi offers several ways for researchers to access snapshots of their files. + + +* [flost](recover/flost.md) + +* [Mac OS X](recover/mac.md) + +* [Windows](recover/windows.md) + +* [Manual Browsing](recover/manual.md) + + +[**Back to the Storage section**](../storage.md) diff --git a/docs/userguides/negishi/storage/recover/flost.md b/docs/userguides/negishi/storage/recover/flost.md new file mode 100644 index 00000000..6e3c6ee1 --- /dev/null +++ b/docs/userguides/negishi/storage/recover/flost.md @@ -0,0 +1,14 @@ +--- +tags: + - Negishi +authors: + - jin456 + - hkashgar +resource: Negishi +search: + boost: 2 +--- + +{{ recover_flost_snippet(resource) }} + +[**Back to the Recovery section**](../recover.md) diff --git a/docs/userguides/negishi/storage/recover/mac.md b/docs/userguides/negishi/storage/recover/mac.md new file mode 100644 index 00000000..f004f36c --- /dev/null +++ b/docs/userguides/negishi/storage/recover/mac.md @@ -0,0 +1,14 @@ +--- +tags: + - Negishi +authors: + - jin456 + - hkashgar +resource: Negishi +search: + boost: 2 +--- + +{{ recover_mac_snippet(resource) }} + +[**Back to the Recovery section**](../recover.md) diff --git a/docs/userguides/negishi/storage/recover/manual.md b/docs/userguides/negishi/storage/recover/manual.md new file mode 100644 index 00000000..b2f5ff4a --- /dev/null +++ b/docs/userguides/negishi/storage/recover/manual.md @@ -0,0 +1,14 @@ +--- +tags: + - Negishi +authors: + - jin456 + - hkashgar +resource: Negishi +search: + boost: 2 +--- + +{{ recover_manual_snippet(resource) }} + +[**Back to the Recovery section**](../recover.md) diff --git a/docs/userguides/negishi/storage/recover/windows.md b/docs/userguides/negishi/storage/recover/windows.md new file mode 100644 index 00000000..708a869e --- /dev/null +++ b/docs/userguides/negishi/storage/recover/windows.md @@ -0,0 +1,14 @@ +--- +tags: + - Negishi +authors: + - jin456 + - hkashgar +resource: Negishi +search: + boost: 2 +--- + +{{ recover_windows_snippet(resource) }} + +[**Back to the Recovery section**](../recover.md) diff --git a/docs/userguides/negishi/storage/scp.md b/docs/userguides/negishi/storage/scp.md new file mode 100644 index 00000000..e9924222 --- /dev/null +++ b/docs/userguides/negishi/storage/scp.md @@ -0,0 +1,14 @@ +--- +tags: + - Negishi +authors: + - jin456 + - hkashgar +resource: Negishi +search: + boost: 2 +--- + +{{ scp_file_snippet(resource) }} + +[**Back to the Storage section**](../storage.md) diff --git a/docs/userguides/negishi/storage/scratch_space.md b/docs/userguides/negishi/storage/scratch_space.md new file mode 100644 index 00000000..b6b2006b --- /dev/null +++ b/docs/userguides/negishi/storage/scratch_space.md @@ -0,0 +1,15 @@ +--- +tags: + - Negishi +authors: + - jin456 + - hkashgar + +resource: Negishi +search: + boost: 2 +--- + +{{ scratch_space(resource) }} + +[**Back to the Storage section**](../storage.md) diff --git a/docs/userguides/negishi/storage/sharing.md b/docs/userguides/negishi/storage/sharing.md new file mode 100644 index 00000000..c1340d32 --- /dev/null +++ b/docs/userguides/negishi/storage/sharing.md @@ -0,0 +1,14 @@ +--- +tags: + - Negishi +authors: + - jin456 + - hkashgar +resource: Negishi +search: + boost: 2 +--- + +{{ sharing_snippet(resource) }} + +[**Back to the Storage section**](../storage.md) diff --git a/docs/userguides/negishi/storage/storage_quota.md b/docs/userguides/negishi/storage/storage_quota.md new file mode 100644 index 00000000..997ffe7a --- /dev/null +++ b/docs/userguides/negishi/storage/storage_quota.md @@ -0,0 +1,14 @@ +--- +tags: + - Negishi +authors: + - jin456 + - hkashgar +resource: Negishi +search: + boost: 2 +--- + +{{ storage_quota(resource) }} + +[**Back to the Storage section**](../storage.md) diff --git a/docs/userguides/negishi/storage/tmp_directory.md b/docs/userguides/negishi/storage/tmp_directory.md new file mode 100644 index 00000000..32a024be --- /dev/null +++ b/docs/userguides/negishi/storage/tmp_directory.md @@ -0,0 +1,14 @@ +--- +tags: + - Negishi +authors: + - jin456 + - hkashgar +resource: Negishi +search: + boost: 2 +--- + +--8<-- "docs/snippets/tmp_directory.md" + +[**Back to the Storage section**](../storage.md) diff --git a/docs/userguides/negishi/storage/windows_network_drive.md b/docs/userguides/negishi/storage/windows_network_drive.md new file mode 100644 index 00000000..7659254b --- /dev/null +++ b/docs/userguides/negishi/storage/windows_network_drive.md @@ -0,0 +1,14 @@ +--- +tags: + - Negishi +authors: + - jin456 + - hkashgar +resource: Negishi +search: + boost: 2 +--- + +{{ windows_network_drive(resource) }} + +[**Back to the Storage section**](../storage.md) From 74d94fc64622ee4416e6bdbced8cc9442bf685bc Mon Sep 17 00:00:00 2001 From: hkashgar Date: Wed, 8 Jul 2026 17:36:13 -0500 Subject: [PATCH 20/26] compiling source code --- docs/userguides/negishi/compile.md | 23 ++++++++++++++++++++ docs/userguides/negishi/compile/hybrid.md | 13 +++++++++++ docs/userguides/negishi/compile/intel_mkl.md | 13 +++++++++++ docs/userguides/negishi/compile/mpi.md | 13 +++++++++++ docs/userguides/negishi/compile/openmp.md | 13 +++++++++++ docs/userguides/negishi/compile/serial.md | 13 +++++++++++ 6 files changed, 88 insertions(+) create mode 100644 docs/userguides/negishi/compile.md create mode 100644 docs/userguides/negishi/compile/hybrid.md create mode 100644 docs/userguides/negishi/compile/intel_mkl.md create mode 100644 docs/userguides/negishi/compile/mpi.md create mode 100644 docs/userguides/negishi/compile/openmp.md create mode 100644 docs/userguides/negishi/compile/serial.md diff --git a/docs/userguides/negishi/compile.md b/docs/userguides/negishi/compile.md new file mode 100644 index 00000000..71a27f9b --- /dev/null +++ b/docs/userguides/negishi/compile.md @@ -0,0 +1,23 @@ +--- +tags: + - Negishi +authors: + - hkashgar +resource: Negishi +search: + boost: 2 +--- + +# Compiling Source Code + +Documentation on compiling source code on Negishi. + +## In This Section + +- [Compiling Serial Programs](compile/serial.md) +- [Compiling MPI Programs](compile/mpi.md) +- [Compiling OpenMP Programs](compile/openmp.md) +- [Compiling Hybrid Programs](compile/hybrid.md) +- [Intel MKL Library](compile/intel_mkl.md) + +[**Back to Negishi User Guide**](index.md) diff --git a/docs/userguides/negishi/compile/hybrid.md b/docs/userguides/negishi/compile/hybrid.md new file mode 100644 index 00000000..aaff08cc --- /dev/null +++ b/docs/userguides/negishi/compile/hybrid.md @@ -0,0 +1,13 @@ +--- +tags: + - Negishi +authors: + - hkashgar +resource: Negishi +search: + boost: 2 +--- + +--8<-- "docs/snippets/compile_hybrid.md" + +[**Back to the Compiling Source Code section**](../compile.md) diff --git a/docs/userguides/negishi/compile/intel_mkl.md b/docs/userguides/negishi/compile/intel_mkl.md new file mode 100644 index 00000000..596359c9 --- /dev/null +++ b/docs/userguides/negishi/compile/intel_mkl.md @@ -0,0 +1,13 @@ +--- +tags: + - Negishi +authors: + - hkashgar +resource: Negishi +search: + boost: 2 +--- + +--8<-- "docs/snippets/compile_intel_mkl.md" + +[**Back to the Compiling Source Code section**](../compile.md) diff --git a/docs/userguides/negishi/compile/mpi.md b/docs/userguides/negishi/compile/mpi.md new file mode 100644 index 00000000..80d8b839 --- /dev/null +++ b/docs/userguides/negishi/compile/mpi.md @@ -0,0 +1,13 @@ +--- +tags: + - Negishi +authors: + - hkashgar +resource: Negishi +search: + boost: 2 +--- + +--8<-- "docs/snippets/compile_mpi.md" + +[**Back to the Compiling Source Code section**](../compile.md) diff --git a/docs/userguides/negishi/compile/openmp.md b/docs/userguides/negishi/compile/openmp.md new file mode 100644 index 00000000..45930916 --- /dev/null +++ b/docs/userguides/negishi/compile/openmp.md @@ -0,0 +1,13 @@ +--- +tags: + - Negishi +authors: + - hkashgar +resource: Negishi +search: + boost: 2 +--- + +--8<-- "docs/snippets/compile_openmp.md" + +[**Back to the Compiling Source Code section**](../compile.md) diff --git a/docs/userguides/negishi/compile/serial.md b/docs/userguides/negishi/compile/serial.md new file mode 100644 index 00000000..4164621b --- /dev/null +++ b/docs/userguides/negishi/compile/serial.md @@ -0,0 +1,13 @@ +--- +tags: + - Negishi +authors: + - hkashgar +resource: Negishi +search: + boost: 2 +--- + +--8<-- "docs/snippets/compile_serial.md" + +[**Back to the Compiling Source Code section**](../compile.md) From 62388507158069e72874200f150e7cd4062c1e17 Mon Sep 17 00:00:00 2001 From: hkashgar Date: Thu, 9 Jul 2026 09:12:01 -0500 Subject: [PATCH 21/26] faqs --- docs/userguides/negishi/faqs.md | 450 +++++++++++++++++++++++++++++++ docs/userguides/negishi/index.md | 2 +- 2 files changed, 451 insertions(+), 1 deletion(-) create mode 100644 docs/userguides/negishi/faqs.md diff --git a/docs/userguides/negishi/faqs.md b/docs/userguides/negishi/faqs.md new file mode 100644 index 00000000..0a5503a1 --- /dev/null +++ b/docs/userguides/negishi/faqs.md @@ -0,0 +1,450 @@ +--- +tags: + - Negishi +authors: + - hkashgar +resource: Negishi +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 Negishi + +### Can you remove me from the Negishi mailing list? + +Your subscription in the Negishi mailing list is tied to your account on Negishi. If you are no longer using your account on Negishi, 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 Negishi different than other Community Clusters? + +${resource.name} differs from the previous Community Clusters in several significant aspects: + +* Host naming convention in the ${resource.name} cluster is different from earlier Community Clusters. Everything ${resource.name}-related is contained within a `${resource.hostname}.rcac.purdue.edu` subdomain. Front-end login nodes are now named `loginNN` (as opposed to earlier `-feNN`), and compute nodes of each type `X` are named `xNNN` (as opposed to `-xNNN`). +* ${resource.name} OnDemand Gateway is at the {::if resource.active != false}[${resource.oodname}.${resource.hostname}.rcac.purdue.edu](https://${resource.oodname}.${resource.hostname}.rcac.purdue.edu){::else}${resource.oodname}.${resource.hostname}.rcac.purdue.edu{::/} (as opposed to earlier `gateway.${resource.hostname}.rcac.purdue.edu` convention). +* ${resource.name} 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 the Community Clusters home directory into ${resource.name} - [instructions are provided](/knowledge/${resource.dir}/storage/transfer/copyhome). +* ${resource.name} contains the 3rd generation of AMD EPYC processors, codenamed "Milan". These CPUs support AVX2 vector instructions set. When compiling your code, use of `-march=znver3` flag (for latest GCC, Clang and AOCC compilers) or `-march=core-avx2` (for Intel compilers and GCC prior to 11.0) is recommended. +* GCC compiler with OpenMPI or MVAPICH2 MPI libraries are recommended for software development on ${resource.name}. You can enable this software with `module load gcc openmpi` (default) or `module load gcc mvapich2`. +* If you use Jupyter notebooks, JupyterHub on ${resource.name} will be available only via the [OnDemand Gateway](https://${resource.oodname}.${resource.hostname}.rcac.purdue.edu) rather than the freestanding version as on some previous systems. Other RCAC systems will transition to OnDemand as well, following ${resource.name}. + +Upcoming 2023 +------------- + +* A subset of ${resource.name} compute nodes contain ${resource.gpuname} accelerator cards which can significantly improve performance of compute-intensive workloads. These can be utilized by submitting jobs to the `${resource.gpuqueue}` queue (add `-A ${resource.gpuqueue}` to your job submission command). +* A selection of GPU-enabled ROCm application containers from the AMD InfinityHub collection is installed. + + +### Do I need to do anything to my firewall to access Negishi? + +No firewall changes are needed to access Negishi. 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 Negishi have the same home directory as other clusters? + +The Negishi home directory and its contents are exclusive to Negishi cluster front-end hosts and compute nodes. This home directory is not available on other RCAC machines but Negishi. 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 Negishi 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 Negishi, 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 Negishi 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 Negishi? + +* You can learn about processor layout on Negishi nodes using the following command: + + ``` + a003.negishi:~$ lstopo-no-graphics + ``` + +* For detailed IO connectivity: + + ``` + a003.negishi:~$ 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 + +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. + +## Data + +### How is my Data Secured on Negishi? + +Negishi 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 Negishi are based on ones defined in NIST cybersecurity standards. + +Negishi supports research at the L1 fundamental and L2 sensitive levels. +Negishi 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 Negishi), 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 Negishi. 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 Negishi. 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 Negishi?](#do-i-need-to-do-anything-to-my-firewall-to-access-negishi)" **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 Negishi? + +Yes. While Fortress directories are not directly mounted on Negishi for performance and archival protection reasons, they can be accessed from Negishi 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 Negishi User Guide**](index.md) diff --git a/docs/userguides/negishi/index.md b/docs/userguides/negishi/index.md index 329d38e8..a5779cfe 100644 --- a/docs/userguides/negishi/index.md +++ b/docs/userguides/negishi/index.md @@ -19,5 +19,5 @@ Negishi is a Community Cluster optimized for communities running traditional, ti - [**File Storage and Transfer**](storage.md) - [**Gateway (Open OnDemand)**](gateway.md) - [**Compiling Source Code**](compile.md) -- [**Frequently Asked Questions**](faq.md) +- [**Frequently Asked Questions**](faqs.md) From 2ab3afa63526120b3b5c7f24a42c184ba5b6e09f Mon Sep 17 00:00:00 2001 From: hkashgar Date: Thu, 9 Jul 2026 09:13:18 -0500 Subject: [PATCH 22/26] negishi --- mkdocs.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/mkdocs.yml b/mkdocs.yml index 8e41e4d1..dfd2f6fd 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -191,7 +191,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: https://www.rcac.purdue.edu/knowledge/hammer - Rossmann: https://www.rcac.purdue.edu/knowledge/rossmann - Weber: https://www.rcac.purdue.edu/knowledge/weber From 57526283eb157537e1b8ac7742f07d03afdef725 Mon Sep 17 00:00:00 2001 From: hkashgar Date: Thu, 9 Jul 2026 10:06:16 -0500 Subject: [PATCH 23/26] small fixes --- docs/userguides/negishi/faqs.md | 16 +++--- docs/userguides/negishi/run_jobs/mpi_jobs.md | 4 +- .../negishi/run_jobs/openmp_jobs.md | 4 +- .../negishi/run_jobs/python/packages.md | 4 +- .../userguides/negishi/run_jobs/python/pip.md | 4 +- docs/userguides/negishi/run_jobs/queues.md | 2 +- .../r/example_installing_r_packages.md | 8 +-- .../negishi/run_jobs/serial_jobs.md | 2 +- .../negishi/run_jobs/submit_script.md | 2 +- docs/userguides/negishi/storage.md | 2 +- docs/userguides/negishi/storage/copyhome.md | 57 +++++++++++++++++++ 11 files changed, 81 insertions(+), 24 deletions(-) create mode 100755 docs/userguides/negishi/storage/copyhome.md diff --git a/docs/userguides/negishi/faqs.md b/docs/userguides/negishi/faqs.md index 0a5503a1..2d9258c8 100644 --- a/docs/userguides/negishi/faqs.md +++ b/docs/userguides/negishi/faqs.md @@ -20,19 +20,19 @@ Your subscription in the Negishi mailing list is tied to your account on Negishi ### How is Negishi different than other Community Clusters? -${resource.name} differs from the previous Community Clusters in several significant aspects: +Negishi differs from the previous Community Clusters in several significant aspects: -* Host naming convention in the ${resource.name} cluster is different from earlier Community Clusters. Everything ${resource.name}-related is contained within a `${resource.hostname}.rcac.purdue.edu` subdomain. Front-end login nodes are now named `loginNN` (as opposed to earlier `-feNN`), and compute nodes of each type `X` are named `xNNN` (as opposed to `-xNNN`). -* ${resource.name} OnDemand Gateway is at the {::if resource.active != false}[${resource.oodname}.${resource.hostname}.rcac.purdue.edu](https://${resource.oodname}.${resource.hostname}.rcac.purdue.edu){::else}${resource.oodname}.${resource.hostname}.rcac.purdue.edu{::/} (as opposed to earlier `gateway.${resource.hostname}.rcac.purdue.edu` convention). -* ${resource.name} 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 the Community Clusters home directory into ${resource.name} - [instructions are provided](/knowledge/${resource.dir}/storage/transfer/copyhome). -* ${resource.name} contains the 3rd generation of AMD EPYC processors, codenamed "Milan". These CPUs support AVX2 vector instructions set. When compiling your code, use of `-march=znver3` flag (for latest GCC, Clang and AOCC compilers) or `-march=core-avx2` (for Intel compilers and GCC prior to 11.0) is recommended. -* GCC compiler with OpenMPI or MVAPICH2 MPI libraries are recommended for software development on ${resource.name}. You can enable this software with `module load gcc openmpi` (default) or `module load gcc mvapich2`. -* If you use Jupyter notebooks, JupyterHub on ${resource.name} will be available only via the [OnDemand Gateway](https://${resource.oodname}.${resource.hostname}.rcac.purdue.edu) rather than the freestanding version as on some previous systems. Other RCAC systems will transition to OnDemand as well, following ${resource.name}. +* Host naming convention in the Negishi cluster is different from earlier Community Clusters. Everything Negishi-related is contained within a `a003.negishi.rcac.purdue.edu` subdomain. Front-end login nodes are now named `loginNN` (as opposed to earlier `-feNN`), and compute nodes of each type `X` are named `xNNN` (as opposed to `-xNNN`). +* Negishi OnDemand Gateway is at the [gateway.negishi.rcac.purdue.edu](https://gateway.negishi.rcac.purdue.edu) (as opposed to earlier `gateway.negishi.rcac.purdue.edu` convention). +* Negishi 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 the Community Clusters home directory into Negishi - [instructions are provided](../storage/copyhome). +* Negishi contains the 3rd generation of AMD EPYC processors, codenamed "Milan". These CPUs support AVX2 vector instructions set. When compiling your code, use of `-march=znver3` flag (for latest GCC, Clang and AOCC compilers) or `-march=core-avx2` (for Intel compilers and GCC prior to 11.0) is recommended. +* GCC compiler with OpenMPI or MVAPICH2 MPI libraries are recommended for software development on Negishi. You can enable this software with `module load gcc openmpi` (default) or `module load gcc mvapich2`. +* If you use Jupyter notebooks, JupyterHub on Negishi will be available only via the [OnDemand Gateway](https://gateway.negishi.rcac.purdue.edu) rather than the freestanding version as on some previous systems. Other RCAC systems will transition to OnDemand as well, following Negishi. Upcoming 2023 ------------- -* A subset of ${resource.name} compute nodes contain ${resource.gpuname} accelerator cards which can significantly improve performance of compute-intensive workloads. These can be utilized by submitting jobs to the `${resource.gpuqueue}` queue (add `-A ${resource.gpuqueue}` to your job submission command). +* A subset of Negishi compute nodes contain ${resource.gpuname} accelerator cards which can significantly improve performance of compute-intensive workloads. These can be utilized by submitting jobs to the `${resource.gpuqueue}` queue (add `-A ${resource.gpuqueue}` to your job submission command). * A selection of GPU-enabled ROCm application containers from the AMD InfinityHub collection is installed. diff --git a/docs/userguides/negishi/run_jobs/mpi_jobs.md b/docs/userguides/negishi/run_jobs/mpi_jobs.md index 78469845..14bfaeb8 100644 --- a/docs/userguides/negishi/run_jobs/mpi_jobs.md +++ b/docs/userguides/negishi/run_jobs/mpi_jobs.md @@ -12,7 +12,7 @@ search: An MPI job is a set of processes that take advantage of multiple compute nodes by communicating with each other. OpenMPI and Intel MPI (IMPI) are implementations of the MPI standard. -This section shows how to submit one of the MPI programs compiled in the section [Compiling MPI Programs](../compile/compile_mpi.md). +This section shows how to submit one of the MPI programs compiled in the section [Compiling MPI Programs](../../compile/mpi). Use `module load` to set up the paths to access these libraries. Use `module avail` to see all MPI packages installed on Negishi. @@ -118,4 +118,4 @@ Runhost:a013.negishi.rcac.purdue.edu Rank:192 of 256 ranks hello, world - In general, the exact order in which MPI ranks write similar output to an output file is random. -[**Back to the Running Jobs section**](index.md) \ No newline at end of file +[**Back to the Running Jobs section**](index.md) diff --git a/docs/userguides/negishi/run_jobs/openmp_jobs.md b/docs/userguides/negishi/run_jobs/openmp_jobs.md index 4ddc4038..741edbe0 100644 --- a/docs/userguides/negishi/run_jobs/openmp_jobs.md +++ b/docs/userguides/negishi/run_jobs/openmp_jobs.md @@ -12,7 +12,7 @@ search: A shared-memory job is a single process that takes advantage of a multi-core processor and its shared memory to achieve parallelization. -This example shows how to submit an OpenMP program compiled in the section [Compiling OpenMP Programs](../compile/compile_openmp.md). +This example shows how to submit an OpenMP program compiled in the section [Compiling OpenMP Programs](../compile/openmp). !!! note When running OpenMP programs, all threads must be on the same compute node to take advantage of shared memory. The threads cannot communicate between nodes. @@ -79,4 +79,4 @@ If the job failed to run, view error messages in the file `slurm-myjobid.out`. If an OpenMP program uses a lot of memory and 128 threads use all of the memory of the compute node, use fewer processor cores, or OpenMP threads, on that compute node. -[**Back to the Running Jobs section**](index.md) \ No newline at end of file +[**Back to the Running Jobs section**](index.md) diff --git a/docs/userguides/negishi/run_jobs/python/packages.md b/docs/userguides/negishi/run_jobs/python/packages.md index 6d56a643..d7eba39d 100644 --- a/docs/userguides/negishi/run_jobs/python/packages.md +++ b/docs/userguides/negishi/run_jobs/python/packages.md @@ -11,7 +11,7 @@ search: # Installing Packages -Installing Python packages in an Anaconda environment is recommended. One key advantage of Anaconda is that it allows users to install unrelated packages in separate self-contained environments. Individual packages can later be reinstalled or updated without impacting others. If you are unfamiliar with Conda environments, please check our [Conda Guide](../conda.md). +Installing Python packages in an Anaconda environment is recommended. One key advantage of Anaconda is that it allows users to install unrelated packages in separate self-contained environments. Individual packages can later be reinstalled or updated without impacting others. If you are unfamiliar with Conda environments, please check our [Conda Guide](../conda). To facilitate the process of creating and using Conda environments, we support a script (`conda-env-mod`) that generates a module file for an environment, as well as an optional Jupyter kernel to use this environment in a JupyterHub notebook. @@ -304,4 +304,4 @@ A similar process can be devised for instructor-provided or individually-managed * Few applications only run on specific versions of Python (e.g. Python 3.6). Please check the documentation of your application if that is the case. -[**Return to the Python**](../python.md) \ No newline at end of file +[**Return to the Python**](../python.md) diff --git a/docs/userguides/negishi/run_jobs/python/pip.md b/docs/userguides/negishi/run_jobs/python/pip.md index eb8c5cb3..70a90375 100644 --- a/docs/userguides/negishi/run_jobs/python/pip.md +++ b/docs/userguides/negishi/run_jobs/python/pip.md @@ -20,7 +20,7 @@ Traceback (most recent call last): OSError: [Errno 13] Permission denied: '/apps/cent7/anaconda/2020.07-py38/lib/python3.8/site-packages/mkl_random-1.1.1.dist-info' ``` -If you encounter this error, it means that you cannot modify the global Python installation. We recommend installing Python packages in a conda environment. Detailed instructions for installing packages with `pip` can be found in our [Python package installation page](../packages.md). +If you encounter this error, it means that you cannot modify the global Python installation. We recommend installing Python packages in a conda environment. Detailed instructions for installing packages with `pip` can be found in our [Python package installation page](../packages). Below we list some other useful `pip` commands. @@ -56,4 +56,4 @@ For more information about Python: * [Anaconda Python Distribution - Official Website](https://store.continuum.io/cshop/anaconda/) * [Conda User Guide](https://conda.io/projects/conda/en/latest/user-guide/) -[**Return to the Python**](../python.md) \ No newline at end of file +[**Return to the Python**](../python.md) diff --git a/docs/userguides/negishi/run_jobs/queues.md b/docs/userguides/negishi/run_jobs/queues.md index c5b4d8e9..e26bf445 100644 --- a/docs/userguides/negishi/run_jobs/queues.md +++ b/docs/userguides/negishi/run_jobs/queues.md @@ -28,7 +28,7 @@ Table Summary of Changes | Submit a gpu job | `sbatch -A gpu` | `sbatch -A mygroup -p gpu` | | Submit a job to your group's interactive account | `sbatch -A interactive` | `sbatch -A mygroup -p negishi -q interactive` | -If you have used other clusters, you will be familiar with the first item. If you have not, you can read about how to format the request [on our job submission page.](https://www.rcac.purdue.edu/index.php/knowledge/negishi/run/slurm/submit) The rest of this page will focus on the last three items. +If you have used other clusters, you will be familiar with the first item. If you have not, you can read about how to format the request [on our job submission page.](../submit_script) The rest of this page will focus on the last three items. ## Partitions diff --git a/docs/userguides/negishi/run_jobs/r/example_installing_r_packages.md b/docs/userguides/negishi/run_jobs/r/example_installing_r_packages.md index 1d20c7c4..308fd0a9 100644 --- a/docs/userguides/negishi/run_jobs/r/example_installing_r_packages.md +++ b/docs/userguides/negishi/run_jobs/r/example_installing_r_packages.md @@ -14,12 +14,12 @@ search: - Different clusters have different hardware and softwares. So, if you have access to multiple clusters, you must install your R packages separately for each cluster. - Each cluster has multiple versions of R and packages installed with one version of R may not work with another version of R. So, libraries for each R version must be installed in a separate directory. -- You can define the directory where your R packages will be installed using the environment variable ```R_LIBS_USER```. -- For your convenience, a sample [~/.Rprofile example file](https://rcac.purdue.edu/files/knowledge/run/examples/apps/r/Rprofile_example) is provided that can be downloaded to your cluster account and renamed into ```~/.Rprofile``` (or appended to one) to customize your installation preferences. [Detailed instructions here](example_r_profile_setup.md). +- You can define the directory where your R packages will be installed using the environment variable `R_LIBS_USER`. +- For your convenience, a sample [~/.Rprofile example file](/assets/scripts/userguides/Rprofile_example) is provided that can be downloaded to your cluster account and renamed into `~/.Rprofile` (or appended to one) to customize your installation preferences. [Detailed instructions here](example_r_profile_setup.md). ## Installing Packages - ### Step 0: Setup Installation Preferences -Follow the [steps for setting up your](example_r_profile_setup.md) ```~/.Rprofile``` preferences. This step needs to be done only once. If you have created a ```~/.Rprofile``` file previously on Negishi, ignore this step. +Follow the [steps for setting up your](example_r_profile_setup.md) `~/.Rprofile` preferences. This step needs to be done only once. If you have created a `~/.Rprofile` file previously on Negishi, ignore this step. - ### Step 1: Check if the package is already installed As part of the R installations on community clusters, a lot of R libraries are pre-installed. You can check if your package is already installed by opening an R terminal and entering the command ```installed.packages()```. For example, @@ -36,7 +36,7 @@ Package Version quit() ``` -If the package you are trying to use is already installed, simply load the library, e.g., ```library('units')```. Otherwise, move to the next step to install the package. +If the package you are trying to use is already installed, simply load the library, e.g., `library('units')`. Otherwise, move to the next step to install the package. - ### Step 2: Load required dependencies (if needed) For simple packages you may not need this step. However, some R packages depend on other libraries. For example, the ```sf``` package depends on ```gdal``` and ```geos``` libraries. So, you will need to load the corresponding modules before installing ```sf```. Read the documentation for the package to identify which modules should be loaded. diff --git a/docs/userguides/negishi/run_jobs/serial_jobs.md b/docs/userguides/negishi/run_jobs/serial_jobs.md index 2bee0320..6214eaf1 100644 --- a/docs/userguides/negishi/run_jobs/serial_jobs.md +++ b/docs/userguides/negishi/run_jobs/serial_jobs.md @@ -10,7 +10,7 @@ search: # Running Serial Jobs -This shows how to submit one of the serial programs compiled in the section [Compiling Serial Programs](../../compile/compile_serial.md). +This shows how to submit one of the serial programs compiled in the section [Compiling Serial Programs](../../compile/serial). Create a job submission file: diff --git a/docs/userguides/negishi/run_jobs/submit_script.md b/docs/userguides/negishi/run_jobs/submit_script.md index ca9774be..88329cfd 100644 --- a/docs/userguides/negishi/run_jobs/submit_script.md +++ b/docs/userguides/negishi/run_jobs/submit_script.md @@ -113,6 +113,6 @@ If an option is present in both your job submission file and on the command line After you submit your job with `SBATCH`, it may wait in queue for minutes, hours, or even weeks. How long it takes for a job to start depends on the specific queue, the resources and time requested, and other jobs already waiting in that queue requested as well. 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](/knowledge/${resource.dir}/run/slurm/status), wait for the job to complete, and [check the job output](/knowledge/${resource.dir}/run/slurm/output). +Once your job is submitted, you can [monitor the job status](../monitoring_job), wait for the job to complete, and [check the job output](../checking_output). ​[**Back to the Running Jobs section**](index.md) diff --git a/docs/userguides/negishi/storage.md b/docs/userguides/negishi/storage.md index ad8fd49c..61849391 100644 --- a/docs/userguides/negishi/storage.md +++ b/docs/userguides/negishi/storage.md @@ -39,7 +39,7 @@ Negishi supports several methods for file transfer. Use the links below to learn - [FTP / SFTP](storage/ftp_sftp.md) - [HSI](storage/hsi.md) - [HTAR](storage/htar.md) - +- [Copying files from Purdue IT research computing home directory to Negishi](storage/copyhome.md) ## Lost File Recovery - [Lost File Recovery](storage/recover.md) diff --git a/docs/userguides/negishi/storage/copyhome.md b/docs/userguides/negishi/storage/copyhome.md new file mode 100755 index 00000000..6fc85319 --- /dev/null +++ b/docs/userguides/negishi/storage/copyhome.md @@ -0,0 +1,57 @@ +--- +tags: + - Negishi +authors: + - hkashgar +resource: Negishi +search: + boost: 2 +--- +# Copying files from Purdue IT research computing home directory to Negishi + +The Negishi home directory and its contents are specific to the Negishi cluster, and are not available on other RCAC machines. For people having access to other Community Clusters and Negishi, *there is no automatic copying or synchronization between main and Negishi home directories*. At your discretion, you can manually copy all or parts of your main research computing home to Negishi using one of the methods described below. + +Please note that copying may fail if the size of your research computing home directory is larger than the Negishi one's quota. Please [check](../storage_quota) usage and limits before proceeding! + +### Complete copy + +For your convenience, a custom tool `copy-rcac-home` is provided to simplify at-will duplication of your main research computing home directory into Negishi. The tool performs a complete 1-to-1 copy using `rsync -auH` (with exception of a narrow subset of system-specific service files). + +To use the tool, simply type `copy-rcac-home` in a terminal window on a Negishi front-end or compute node: + +``` + +$ copy-rcac-home + + This script will copy entire contents of your main RCAC + home directory into your Negishi cluster's $HOME. + + Note: copying may fail if the size of your RCAC home directory + is larger than your quota on the Negishi one (25GB). + BEFORE PROCEEDING, please run 'myquota' command on another + cluster to see your usage there and judge whether it would fit! + +Would you like to proceed? [Y/n]: +``` + +At this stage answering `yes` will proceed with copying, or you can respond with a `no` (or `Ctrl-C`) to cancel. See `copy-rcac-home --help` for more details on the tool. + +### Partial copy + +Desired parts (or whole) of your research computing home directories can be copied to Negishi via any of the home directories' supported [transfer methods](../#file-transfer), such as SCP, SFTP, rsync, or Globus. + +* **Example:** recursive copying of a subdirectory from RCAC home directory into Negishi home using `scp`. + + ``` + + (if you are on Negishi, use other cluster name for the remote part) + $ scp -pr myothercluster.rcac.purdue.edu:somedirectory/ ~/ + + (if you are on another cluster, use Negishi for the remote part) + $ scp -pr somedirectory/ myusername@negishi.rcac.purdue.edu:~/ + ``` +* **Example:** copying using Globus. + + Search collections for *"Purdue Research Computing - Home Directories"* and *"Purdue Negishi Cluster"* endpoints, respectively, then transfer desired files and/or directories as usual. + +[**Back to the Storage section**](../storage.md) From 0e103a3e43ddc0e36134d9025b94435ca5b87770 Mon Sep 17 00:00:00 2001 From: hkashgar Date: Thu, 9 Jul 2026 10:36:32 -0500 Subject: [PATCH 24/26] small fixes --- .../negishi/run_jobs/ansysfluent.md | 1 + docs/userguides/negishi/run_jobs/apptainer.md | 2 +- .../negishi/run_jobs/biocontainers.md | 3 ++- docs/userguides/negishi/run_jobs/gaussian.md | 19 ++++++++-------- .../negishi/run_jobs/matlab/parfor.md | 22 +++++++++---------- docs/userguides/negishi/run_jobs/python.md | 1 + .../negishi/run_jobs/python/conda.md | 2 +- .../run_jobs/python/environment_example.md | 2 +- .../negishi/run_jobs/python/numpy.md | 2 +- .../negishi/run_jobs/python/packages.md | 2 +- .../userguides/negishi/run_jobs/python/pip.md | 2 +- .../negishi/run_jobs/python/source.md | 4 ++-- docs/userguides/negishi/run_jobs/queues.md | 3 +++ docs/userguides/negishi/run_jobs/r.md | 2 +- docs/userguides/negishi/run_jobs/windows.md | 4 ++-- .../negishi/run_jobs/windows/cmd.md | 2 +- .../negishi/run_jobs/windows/launcher.md | 2 +- 17 files changed, 41 insertions(+), 34 deletions(-) diff --git a/docs/userguides/negishi/run_jobs/ansysfluent.md b/docs/userguides/negishi/run_jobs/ansysfluent.md index c305787d..3eacb73c 100644 --- a/docs/userguides/negishi/run_jobs/ansysfluent.md +++ b/docs/userguides/negishi/run_jobs/ansysfluent.md @@ -4,6 +4,7 @@ tags: authors: - jin456 - remender + - hkashgar resource: Negishi search: boost: 2 diff --git a/docs/userguides/negishi/run_jobs/apptainer.md b/docs/userguides/negishi/run_jobs/apptainer.md index 4e70a9ca..abc186e5 100644 --- a/docs/userguides/negishi/run_jobs/apptainer.md +++ b/docs/userguides/negishi/run_jobs/apptainer.md @@ -120,4 +120,4 @@ apptainer build ubuntu-18.04.sif ubuntu-18.04 Finally, copy the new image to Negishi and run it. -[**Back to the Running Jobs section**](../run_jobs/index.md) +[**Back to the Running Jobs section**](index.md) diff --git a/docs/userguides/negishi/run_jobs/biocontainers.md b/docs/userguides/negishi/run_jobs/biocontainers.md index 07b92540..e6d23a38 100644 --- a/docs/userguides/negishi/run_jobs/biocontainers.md +++ b/docs/userguides/negishi/run_jobs/biocontainers.md @@ -4,6 +4,7 @@ tags: authors: - jin456 - remender + - hkashgar resource: Negishi search: boost: 2 @@ -83,4 +84,4 @@ To help users get started, we provided detailed user guides for each containeriz ![RCAC Biocontainers one ReadTheDocs](../../../../assets/images/userguides/examples/biocontainers.png) -[**Back to the Running Jobs section**](../run_jobs/index.md) +[**Back to the Running Jobs section**](index.md) diff --git a/docs/userguides/negishi/run_jobs/gaussian.md b/docs/userguides/negishi/run_jobs/gaussian.md index e275a05f..30476f2c 100644 --- a/docs/userguides/negishi/run_jobs/gaussian.md +++ b/docs/userguides/negishi/run_jobs/gaussian.md @@ -4,6 +4,7 @@ tags: authors: - jin456 - remender + - hkashgar resource: Negishi search: boost: 2 @@ -60,7 +61,7 @@ Only the first and last few lines are shown here: ```text Entering Gaussian System, Link 0=/apps/cent7/gaussian/g16-A.03/g16-haswell/g16/g16 Initial command: - /apps/cent7/gaussian/g16-A.03/g16-haswell/g16/l1.exe /scratch/gautschi/myusername/gaussian/Gau-7781.inp -scrdir=/scratch/gautschi/myusername/gaussian/ + /apps/cent7/gaussian/g16-A.03/g16-haswell/g16/l1.exe /scratch/negishi/myusername/gaussian/Gau-7781.inp -scrdir=/scratch/negishi/myusername/gaussian/ Entering Link 1 = /apps/cent7/gaussian/g16-A.03/g16-haswell/g16/l1.exe PID= 7782. Copyright (c) 1988,1990,1992,1993,1995,1998,2003,2009,2016, @@ -77,14 +78,14 @@ real 13.85 user 202.05 sys 6.12 Machine: -a012.gautschi.rcac.purdue.edu -a012.gautschi.rcac.purdue.edu -a012.gautschi.rcac.purdue.edu -a012.gautschi.rcac.purdue.edu -a012.gautschi.rcac.purdue.edu -a012.gautschi.rcac.purdue.edu -a012.gautschi.rcac.purdue.edu -a012.gautschi.rcac.purdue.edu +a003.negishi.rcac.purdue.edu +a003.negishi.rcac.purdue.edu +a003.negishi.rcac.purdue.edu +a003.negishi.rcac.purdue.edu +a003.negishi.rcac.purdue.edu +a003.negishi.rcac.purdue.edu +a003.negishi.rcac.purdue.edu +a003.negishi.rcac.purdue.edu ``` ## Examples of Gaussian SLURM Job Submissions diff --git a/docs/userguides/negishi/run_jobs/matlab/parfor.md b/docs/userguides/negishi/run_jobs/matlab/parfor.md index 1f27ccfd..fc0b7d13 100644 --- a/docs/userguides/negishi/run_jobs/matlab/parfor.md +++ b/docs/userguides/negishi/run_jobs/matlab/parfor.md @@ -111,19 +111,19 @@ myjob.sub To get started, type one of these: helpwin, helpdesk, or demo. For product information, visit www.mathworks.com. -mylclbatch.m a000.gautschi.rcac.purdue.edu -SERIAL REGION: hostname:a000.gautschi.rcac.purdue.edu +mylclbatch.m a000.negishi.rcac.purdue.edu +SERIAL REGION: hostname:a000.negishi.rcac.purdue.edu hostname numlabs labindex iteration ------------------------------- ------- -------- --------- -PARALLEL LOOP: a001.gautschi.rcac.purdue.edu 4 1 2 -PARALLEL LOOP: a002.gautschi.rcac.purdue.edu 4 1 4 -PARALLEL LOOP: a001.gautschi.rcac.purdue.edu 4 1 5 -PARALLEL LOOP: a002.gautschi.rcac.purdue.edu 4 1 6 -PARALLEL LOOP: a003.gautschi.rcac.purdue.edu 4 1 1 -PARALLEL LOOP: a003.gautschi.rcac.purdue.edu 4 1 3 -PARALLEL LOOP: a004.gautschi.rcac.purdue.edu 4 1 7 -PARALLEL LOOP: a004.gautschi.rcac.purdue.edu 4 1 8 -SERIAL REGION: hostname:a001.gautschi.rcac.purdue.edu +PARALLEL LOOP: a001.negishi.rcac.purdue.edu 4 1 2 +PARALLEL LOOP: a002.negishi.rcac.purdue.edu 4 1 4 +PARALLEL LOOP: a001.negishi.rcac.purdue.edu 4 1 5 +PARALLEL LOOP: a002.negishi.rcac.purdue.edu 4 1 6 +PARALLEL LOOP: a003.negishi.rcac.purdue.edu 4 1 1 +PARALLEL LOOP: a003.negishi.rcac.purdue.edu 4 1 3 +PARALLEL LOOP: a004.negishi.rcac.purdue.edu 4 1 7 +PARALLEL LOOP: a004.negishi.rcac.purdue.edu 4 1 8 +SERIAL REGION: hostname:a001.negishi.rcac.purdue.edu Elapsed time in parallel loop: 5.411486 ``` diff --git a/docs/userguides/negishi/run_jobs/python.md b/docs/userguides/negishi/run_jobs/python.md index 5455e2dd..39857e4a 100644 --- a/docs/userguides/negishi/run_jobs/python.md +++ b/docs/userguides/negishi/run_jobs/python.md @@ -3,6 +3,7 @@ tags: - Negishi authors: - jin456 + - hkashgar resource: Negishi search: boost: 2 diff --git a/docs/userguides/negishi/run_jobs/python/conda.md b/docs/userguides/negishi/run_jobs/python/conda.md index 2c3225bf..500f9565 100644 --- a/docs/userguides/negishi/run_jobs/python/conda.md +++ b/docs/userguides/negishi/run_jobs/python/conda.md @@ -84,4 +84,4 @@ For more information about Python: * [Anaconda Python Distribution - Official Website](https://store.continuum.io/cshop/anaconda/) * [Conda User Guide](https://conda.io/projects/conda/en/latest/user-guide/) -[**Return to the Python**](../python.md) \ No newline at end of file +[**Back to the Python section**](../python.md) \ No newline at end of file diff --git a/docs/userguides/negishi/run_jobs/python/environment_example.md b/docs/userguides/negishi/run_jobs/python/environment_example.md index 2d249003..5d515d16 100644 --- a/docs/userguides/negishi/run_jobs/python/environment_example.md +++ b/docs/userguides/negishi/run_jobs/python/environment_example.md @@ -62,4 +62,4 @@ For more information about Python: * [Anaconda Python Distribution - Official Website](https://store.continuum.io/cshop/anaconda/) * [Conda User Guide](https://conda.io/projects/conda/en/latest/user-guide/) -[**Return to the Python**](../python.md) \ No newline at end of file +[**Back to the Python section**](../python.md) \ No newline at end of file diff --git a/docs/userguides/negishi/run_jobs/python/numpy.md b/docs/userguides/negishi/run_jobs/python/numpy.md index 0d9ea78b..c5d542c5 100644 --- a/docs/userguides/negishi/run_jobs/python/numpy.md +++ b/docs/userguides/negishi/run_jobs/python/numpy.md @@ -36,4 +36,4 @@ module load conda export MKL_NUM_THREADS=1 ``` -[**Return to the Python**](../python.md) \ No newline at end of file +[**Back to the Python section**](../python.md) \ No newline at end of file diff --git a/docs/userguides/negishi/run_jobs/python/packages.md b/docs/userguides/negishi/run_jobs/python/packages.md index d7eba39d..41004ade 100644 --- a/docs/userguides/negishi/run_jobs/python/packages.md +++ b/docs/userguides/negishi/run_jobs/python/packages.md @@ -304,4 +304,4 @@ A similar process can be devised for instructor-provided or individually-managed * Few applications only run on specific versions of Python (e.g. Python 3.6). Please check the documentation of your application if that is the case. -[**Return to the Python**](../python.md) +[**Back to the Python section**](../python.md) diff --git a/docs/userguides/negishi/run_jobs/python/pip.md b/docs/userguides/negishi/run_jobs/python/pip.md index 70a90375..97277d3b 100644 --- a/docs/userguides/negishi/run_jobs/python/pip.md +++ b/docs/userguides/negishi/run_jobs/python/pip.md @@ -56,4 +56,4 @@ For more information about Python: * [Anaconda Python Distribution - Official Website](https://store.continuum.io/cshop/anaconda/) * [Conda User Guide](https://conda.io/projects/conda/en/latest/user-guide/) -[**Return to the Python**](../python.md) +[**Back to the Python section**](../python.md) diff --git a/docs/userguides/negishi/run_jobs/python/source.md b/docs/userguides/negishi/run_jobs/python/source.md index b1fd3d29..76120788 100644 --- a/docs/userguides/negishi/run_jobs/python/source.md +++ b/docs/userguides/negishi/run_jobs/python/source.md @@ -17,7 +17,7 @@ We maintain several [Anaconda](https://www.anaconda.com/) installations. Anacond ``` $ module load conda $ conda list -# packages in environment at /apps/spack/bell/apps/anaconda/2020.02-py37-gcc-4.8.5-u747gsx: +# packages in environment at /apps/spack/negishi/apps/anaconda/2020.02-py37-gcc-4.8.5-u747gsx: # # Name Version Build Channel _ipyw_jlab_nb_ext_conf 0.1.0 py37_0 @@ -61,4 +61,4 @@ For more information about Python: * [Anaconda Python Distribution - Official Website](https://store.continuum.io/cshop/anaconda/) * [Conda User Guide](https://conda.io/projects/conda/en/latest/user-guide/) -[**Return to the Python**](../python.md) \ No newline at end of file +[**Back to the Python section**](../python.md) \ No newline at end of file diff --git a/docs/userguides/negishi/run_jobs/queues.md b/docs/userguides/negishi/run_jobs/queues.md index e26bf445..0118f1c4 100644 --- a/docs/userguides/negishi/run_jobs/queues.md +++ b/docs/userguides/negishi/run_jobs/queues.md @@ -116,3 +116,6 @@ In order for a job to use a Job QOS, the user submitting the job must have acces 2. `standby`: The `standby` QOS must be explicitly used if desired by using the option `-q standby` or `--qos=standby`. The policy for this QOS gives access to idle resources on the cluster. Jobs tagged with this QOS are "low priority" jobs and are only allowed to run for up to four hours at a time, however the resources used by these jobs do not count against the resources in your Account. For users of our previous clusters, usage of this QOS replaces the previous `-A standby` style of submission. Some of these QOSes may not be available in every partition. Each of the partitions in the following section will enumerate which of these QOSes are allowed in the partition. + + +[**Back to the Running Jobs section**](index.md) \ No newline at end of file diff --git a/docs/userguides/negishi/run_jobs/r.md b/docs/userguides/negishi/run_jobs/r.md index 7b5d24ae..3fb0eef4 100644 --- a/docs/userguides/negishi/run_jobs/r.md +++ b/docs/userguides/negishi/run_jobs/r.md @@ -20,4 +20,4 @@ For more general information on R visit [The R Project for Statistical Computing - [**Running R Jobs**](r/example_running_r_jobs.md) - [**Setting Up R Preferences with .Rprofile**](r/example_r_profile_setup.md) -[**Back to the Running Jobs section**](../run_jobs/index.md) +[**Back to the Running Jobs section**](index.md) diff --git a/docs/userguides/negishi/run_jobs/windows.md b/docs/userguides/negishi/run_jobs/windows.md index b335f1e1..4bdb8f09 100644 --- a/docs/userguides/negishi/run_jobs/windows.md +++ b/docs/userguides/negishi/run_jobs/windows.md @@ -20,7 +20,7 @@ The following images are pre-configured and made available by staff: The Windows VMs can be launched in two fashions: * [Menu Launcher](windows/launcher.md) - Point and click to start -* [Command Line](windows/cmd.) - Advanced and customized usage +* [Command Line](windows/cmd.md) - Advanced and customized usage Click each of the above links for detailed instructions on using them. @@ -39,4 +39,4 @@ The Windows 2016 Base server image available on ${resource.name} has the followi * VLC Media Player -[**Back to the Running Jobs section**](../run_jobs/index.md) +[**Back to the Running Jobs section**](index.md) diff --git a/docs/userguides/negishi/run_jobs/windows/cmd.md b/docs/userguides/negishi/run_jobs/windows/cmd.md index 0f3e81ef..36909d97 100644 --- a/docs/userguides/negishi/run_jobs/windows/cmd.md +++ b/docs/userguides/negishi/run_jobs/windows/cmd.md @@ -54,4 +54,4 @@ $ windows -i /path/to/image.qcow2 -m 16G -c 10 -s /depot/mylab The Windows 2016 server desktop will open, and automatically log in as an administrator, so that you can install any software into the Windows virtual machine that your research requires. Changes to the image will be stored in the file specified with the `-i` option. -[**Back to the Running Jobs section**](../../run_jobs/index.md) +[**Back to the Windows section**](../windows.md) diff --git a/docs/userguides/negishi/run_jobs/windows/launcher.md b/docs/userguides/negishi/run_jobs/windows/launcher.md index 565934c0..2c1b1396 100644 --- a/docs/userguides/negishi/run_jobs/windows/launcher.md +++ b/docs/userguides/negishi/run_jobs/windows/launcher.md @@ -36,4 +36,4 @@ Using the menu launcher will launch automatically select reasonable CPU and memo -[**Back to the Running Jobs section**](../../run_jobs/index.md) +[**Back to the Windows section**](../windows.md) From a9bf5f1df7810c9b3a6669ec036f3fee11722202 Mon Sep 17 00:00:00 2001 From: hkashgar Date: Thu, 9 Jul 2026 10:50:48 -0500 Subject: [PATCH 25/26] small fixes --- docs/userguides/negishi/faqs.md | 2 +- mkdocs.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/userguides/negishi/faqs.md b/docs/userguides/negishi/faqs.md index 2d9258c8..8df469e1 100644 --- a/docs/userguides/negishi/faqs.md +++ b/docs/userguides/negishi/faqs.md @@ -220,7 +220,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 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/interactive_jobs). 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 diff --git a/mkdocs.yml b/mkdocs.yml index dfd2f6fd..4ec8fc5c 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -164,7 +164,7 @@ nav: - File Storage and Transfer: userguides/negishi/storage.md - Gateway (Open OnDemand): userguides/negishi/gateway.md - Compiling Source Code: userguides/negishi/compile.md - - Frequently Asked Questions: userguides/negishi/faq.md + - Frequently Asked Questions: userguides/negishi/faqs.md - Scholar: - userguides/scholar/index.md - Scholar Overview: userguides/scholar/overview.md From 1119763e675edeaece8f00516b40bb03ba23d348 Mon Sep 17 00:00:00 2001 From: hkashgar Date: Mon, 13 Jul 2026 15:19:58 -0500 Subject: [PATCH 26/26] addressing Guangzhen's comments on PR --- docs/userguides/negishi/accounts.md | 2 + docs/userguides/negishi/biography.md | 2 + docs/userguides/negishi/faqs.md | 5 +- docs/userguides/negishi/index.md | 6 +- docs/userguides/negishi/overview.md | 5 +- .../creating_the_submission_script.md | 2 +- docs/userguides/negishi/run_jobs/index.md | 1 + .../negishi/run_jobs/interactive_jobs.md | 2 +- docs/userguides/negishi/run_jobs/queues.md | 12 ++-- docs/userguides/negishi/software.md | 4 +- docs/userguides/negishi/storage.md | 2 +- docs/userguides/negishi/storage/copyhome.md | 57 ------------------- 12 files changed, 26 insertions(+), 74 deletions(-) delete mode 100755 docs/userguides/negishi/storage/copyhome.md diff --git a/docs/userguides/negishi/accounts.md b/docs/userguides/negishi/accounts.md index 235dd26a..87529f90 100644 --- a/docs/userguides/negishi/accounts.md +++ b/docs/userguides/negishi/accounts.md @@ -25,3 +25,5 @@ search: ## Purchasing Nodes --8<-- "docs/snippets/purchase_nodes.md" + +[**Back to Negishi User Guide**](index.md) diff --git a/docs/userguides/negishi/biography.md b/docs/userguides/negishi/biography.md index db49fe23..78709ce6 100644 --- a/docs/userguides/negishi/biography.md +++ b/docs/userguides/negishi/biography.md @@ -15,3 +15,5 @@ search: Ei-ichi Negishi (1935-2021) was the Herbert C. Brown Distinguished Professor in the Department of Chemistry at Purdue. He came to Purdue in 1966 as a postdoctoral researcher in the lab of the Late Herbert C. Brown, and published 33 papers with Prof. Brown up through the time that Prof. Brown was awarded the Nobel Prize in Chemistry in 1979. With the award of the Nobel to Ei-ichi Negishi in 2010, Purdue has the rare distinction of a pair of Nobel Prize awards in two closely related areas. Professor Negishi’s Nobel Prize was awarded in recognition of his work on palladium-catalyzed cross-coupling chemistry (known world-– wide as the Negishi coupling). That work was described by the Nobel Foundation as "great art in a test tube". This is certainly appropriate as great scientists regard themselves as artists and explorers. The impact of that work was widespread, as it had been used in synthetic organic chemistry research worldwide, as well as in the commercial production of an array of pharmaceuticals and molecules used in the electronics industry. In recognition of and consistent with this idea, Ei-ichi and co-recipient Akira Suzuki were recently awarded Japan's highest cultural award, the "Order of Culture", bestowed in Nov. 2010 by the Emperor. Professor Negishi was a prolific researcher, with ~400 publications on an array of problems in synthetic organic chemistry, leading to numerous awards. To name just a few, the list includes the Chemical Society of Japan Award (1997), the American Chemical Society Award in Organometallic Chemistry (1998), the McCoy Award (1998), the Sigma Xi Award at Purdue (2003), the Nobel Prize in Chemistry (2010), the Order of Culture in Japan (2010), the American Chemical Society Award for Creative Work in Synthetic Organic Chemistry (2010), the Indiana Sagamore of the Wabash (2011) and the Purdue Order of the Griffin (2011). He was elected to the American Academy of Arts and Sciences in 2011. Professor Negishi was leading the Negishi-Brown Institute, which had continued his work on catalytic organic synthesis. Dr. Negishi was passionate about the prospects for catalytic approaches to the reduction of carbon dioxide to enable large scale production of useful products from this environmental waste product. It is very fitting that Purdue bestow an honorary doctorate degree on Professor Negishi, whose accomplishments and contributions will have a permanent impact on Purdue’s stature and global recognition. + +[**Back to Negishi User Guide**](index.md) diff --git a/docs/userguides/negishi/faqs.md b/docs/userguides/negishi/faqs.md index 8df469e1..285af8fd 100644 --- a/docs/userguides/negishi/faqs.md +++ b/docs/userguides/negishi/faqs.md @@ -29,10 +29,9 @@ Negishi differs from the previous Community Clusters in several significant aspe * GCC compiler with OpenMPI or MVAPICH2 MPI libraries are recommended for software development on Negishi. You can enable this software with `module load gcc openmpi` (default) or `module load gcc mvapich2`. * If you use Jupyter notebooks, JupyterHub on Negishi will be available only via the [OnDemand Gateway](https://gateway.negishi.rcac.purdue.edu) rather than the freestanding version as on some previous systems. Other RCAC systems will transition to OnDemand as well, following Negishi. -Upcoming 2023 -------------- +#### Upcoming 2023 -* A subset of Negishi compute nodes contain ${resource.gpuname} accelerator cards which can significantly improve performance of compute-intensive workloads. These can be utilized by submitting jobs to the `${resource.gpuqueue}` queue (add `-A ${resource.gpuqueue}` to your job submission command). +* A subset of Negishi compute nodes contain AMD Radeon Instinct MI210 accelerator cards which can significantly improve performance of compute-intensive workloads. These can be utilized by submitting jobs to the `gpu` queue (add `-A gpu` to your job submission command). * A selection of GPU-enabled ROCm application containers from the AMD InfinityHub collection is installed. diff --git a/docs/userguides/negishi/index.md b/docs/userguides/negishi/index.md index a5779cfe..10c36343 100644 --- a/docs/userguides/negishi/index.md +++ b/docs/userguides/negishi/index.md @@ -1,8 +1,9 @@ --- -#tags: -# - Negishi +tags: + - Negishi authors: - hkashgar +resource: Negishi search: boost: 2 --- @@ -21,3 +22,4 @@ Negishi is a Community Cluster optimized for communities running traditional, ti - [**Compiling Source Code**](compile.md) - [**Frequently Asked Questions**](faqs.md) + diff --git a/docs/userguides/negishi/overview.md b/docs/userguides/negishi/overview.md index 4366f8ec..4d7473ad 100644 --- a/docs/userguides/negishi/overview.md +++ b/docs/userguides/negishi/overview.md @@ -10,9 +10,9 @@ search: # Negishi Overview -Negishi is a Community Cluster optimized for communities running traditional, tightly-coupled science and engineering applications. Negishi is being built through a partnership with Dell and AMD over the summer of 2022. Negishi consists of Dell compute nodes with two 64-core AMD Epyc "Milan" processors (128 cores per node) and 256 GB of memory. All nodes have 100 Gbps HDR Infiniband interconnect and a 6-year warranty. +Negishi is a Community Cluster optimized for communities running traditional, tightly-coupled science and engineering applications. Negishi was built through a partnership with Dell and AMD over the summer of 2022. Negishi consists of Dell compute nodes with two 64-core AMD Epyc "Milan" processors (128 cores per node) and 256 GB of memory. All nodes have 100 Gbps HDR Infiniband interconnect and a 6-year warranty. -New with Negishi is that access is being offered on the basis of each 64-core Rome processor, or a half-node share. To purchase access to Negishi 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. +New with Negishi is that access is being offered on the basis of each 64-core Milan processor, or a half-node share. To purchase access to Negishi 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. ## Negishi Interactive @@ -49,3 +49,4 @@ On Negishi, the following set of compiler and message-passing libraries for para * OpenMPI or MVAPICH2 +[**Back to Negishi User Guide**](index.md) diff --git a/docs/userguides/negishi/run_jobs/creating_the_submission_script.md b/docs/userguides/negishi/run_jobs/creating_the_submission_script.md index 21f2c913..3917548b 100644 --- a/docs/userguides/negishi/run_jobs/creating_the_submission_script.md +++ b/docs/userguides/negishi/run_jobs/creating_the_submission_script.md @@ -8,7 +8,7 @@ search: boost: 2 --- -# Creatting the Slurm Job Submission Script +# Creating the Slurm Job Submission Script ### Script diff --git a/docs/userguides/negishi/run_jobs/index.md b/docs/userguides/negishi/run_jobs/index.md index a2b6878a..9a9964b4 100644 --- a/docs/userguides/negishi/run_jobs/index.md +++ b/docs/userguides/negishi/run_jobs/index.md @@ -49,3 +49,4 @@ Batch jobs submitted via SLURM have four main steps: - [**MPI**](mpi_jobs.md) - [**OpenMP**](openmp_jobs.md) +[**Back to Negishi User Guide**](../index.md) diff --git a/docs/userguides/negishi/run_jobs/interactive_jobs.md b/docs/userguides/negishi/run_jobs/interactive_jobs.md index 36b9d370..a79e7839 100644 --- a/docs/userguides/negishi/run_jobs/interactive_jobs.md +++ b/docs/userguides/negishi/run_jobs/interactive_jobs.md @@ -17,7 +17,7 @@ To submit an interactive job, use ```sinteractive``` to run a login shell on all ```sinteractive``` accepts most of the same resource requests as ```sbatch```, so to request a login shell on the cpu account while allocating 2 nodes and 128 total cores, you might do: ```bash -sinteractive -A cpu -N2 -n256 +sinteractive -A myaccount -p cpu -N2 -n256 ``` To quit your interactive job: diff --git a/docs/userguides/negishi/run_jobs/queues.md b/docs/userguides/negishi/run_jobs/queues.md index 0118f1c4..906cb239 100644 --- a/docs/userguides/negishi/run_jobs/queues.md +++ b/docs/userguides/negishi/run_jobs/queues.md @@ -36,7 +36,7 @@ On Negishi, the various types of nodes on the cluster are organized into distinc ### CPU Partition -This partition contains the resources a group purchases access to when they purchase CPU resources on Negishi and is made up of 446 Bell-A nodes. Each of these nodes contains two Zen 3 AMD EPYC 7763 64-core processors for a total of 128 cores and 256 GB of memory for a total of more than 57,000 cores in the partition. Memory in this partition is allocated proportional to your core request such that each core is given about 2 GB of memory per core requested. Submission to this partition can be accomplished by using the option: `-p cpu` or `--partition=cpu`. +This partition contains the resources a group purchases access to when they purchase CPU resources on Negishi and is made up of 450 Negishi-A nodes. Each of these nodes contains two Zen 3 AMD EPYC 7763 64-core processors for a total of 128 cores and 256 GB of memory for a total of more than 57,000 cores in the partition. Memory in this partition is allocated proportional to your core request such that each core is given about 2 GB of memory per core requested. Submission to this partition can be accomplished by using the option: `-p cpu` or `--partition=cpu`. The purchasing model for this partition allows groups to purchase high priority access to some number of cores. When an account uses resources in this account by submitting a job tagged with the `normal` QOS, the cores used by that job are withdrawn from the account and deposited back into the account when the job terminates. @@ -55,7 +55,7 @@ Available QOSes: `normal`, `standby` ### Highmem Partition -This partition is made up of 6 Bell-B nodes which have four times as much memory as a standard Bell-A node, and access to this partition is given to all accounts on the cluster to enable work that has higher memory requirements. Each of these nodes contains two Zen 2 AMD EPYC 7763 64-core processors for a total of 128 cores and 1 TB of memory. Memory in this partition is allocated proportional to your core request such that each core is given about 8 GB of memory per core requested. Submission to this partition can be accomplished by using the option: `-p highmem` or `--partition=highmem`. +This partition is made up of 6 Negishi-B nodes which have four times as much memory as a standard Negishi-A node, and access to this partition is given to all accounts on the cluster to enable work that has higher memory requirements. Each of these nodes contains two Zen 3 AMD EPYC 7763 64-core processors for a total of 128 cores and 1 TB of memory. Memory in this partition is allocated proportional to your core request such that each core is given about 8 GB of memory per core requested. Submission to this partition can be accomplished by using the option: `-p highmem` or `--partition=highmem`. When using the Highmem partition, jobs are tagged by the `normal` QOS by default, and this is the only QOS that is available for this partition, so there is no need to specify a QOS when using this partition. Additionally jobs are tagged by a highmem partition QOS that enforces the following policies @@ -69,7 +69,7 @@ Available QOSes: `normal` ### GPU Partition -This partition is made up of 5 Negishi-G nodes. Each of these nodes contains two AMD MI210s and two Zen 2 AMD EPYC 7313 16-core processors for a total of 32 cores and 512GB of memory. Memory in this partition is allocated proportional to your core request such that each core is given about 8 GB of memory per core requested. You should request cores proportional to the number of GPUs you are using in this partition (i.e. if you only need one of the two GPUs, you should request half of the cores on the node) Submission to this partition can be accomplished by using the option: `-p gpu` or `--partition=gpu`. +This partition is made up of 5 Negishi-G nodes. Each of these nodes contains three AMD MI210s and two Zen 3 AMD EPYC 7313 16-core processors for a total of 32 cores and 512GB of memory. Memory in this partition is allocated proportional to your core request such that each core is given about 16 GB of memory per core requested. You should request cores proportional to the number of GPUs you are using in this partition (i.e. if you only need one of the two GPUs, you should request half of the cores on the node) Submission to this partition can be accomplished by using the option: `-p gpu` or `--partition=gpu`. When using the gpu partition, jobs are tagged by the `normal` QOS by default, and this is the only QOS that is available for this partition, so there is no need to specify a QOS when using this partition. Additionally jobs are tagged by a gpu partition QOS that enforces the following policies @@ -82,10 +82,10 @@ Available QOSes: `normal` ### Login Partition -This partition contains the resources a group purchases access to when they purchase "interactive access" on Negishi. Interactive access allows submission of jobs directly to the front ends for immediate job start times. These jobs can only request up to 4 CPUs and 8 GB of memory each and interactive users can only have one job at a time. Submission to this partition can be accomplished by using the option: `-p login` or `--partition=login`. In order to use this partition, you must submit using the interactive QOS which enforces the following policies: +This partition contains the resources a group purchases access to when they purchase "interactive access" on Negishi. Interactive access allows submission of jobs directly to the front ends for immediate job start times. These jobs can only request up to 4 CPUs and 16 GB of memory each and interactive users can only have one job at a time. Submission to this partition can be accomplished by using the option: `-p login` or `--partition=login`. In order to use this partition, you must submit using the interactive QOS which enforces the following policies: 1. You can have one job running at a time. -2. You can use up to 4 cores and 8 GB of memory at a time. +2. You can use up to 4 cores and 16 GB of memory at a time. 3. Jobs can run for up to 24 hours. Available QOSes: `interactive` @@ -118,4 +118,4 @@ In order for a job to use a Job QOS, the user submitting the job must have acces Some of these QOSes may not be available in every partition. Each of the partitions in the following section will enumerate which of these QOSes are allowed in the partition. -[**Back to the Running Jobs section**](index.md) \ No newline at end of file +[**Back to the Running Jobs section**](index.md) diff --git a/docs/userguides/negishi/software.md b/docs/userguides/negishi/software.md index 538c8a4f..93382c95 100644 --- a/docs/userguides/negishi/software.md +++ b/docs/userguides/negishi/software.md @@ -85,4 +85,6 @@ Pre-downloaded bioinformatics containers with module wrappers are available. You ```bash $ module load biocontainers ``` -More information on pre-downloaded ROCm containers can be found [here](https://biocontainer-doc.readthedocs.io/). +More information on pre-downloaded Biocontainers can be found [here](https://biocontainer-doc.readthedocs.io/). + +[**Back to Negishi User Guide**](index.md) diff --git a/docs/userguides/negishi/storage.md b/docs/userguides/negishi/storage.md index 61849391..ad8fd49c 100644 --- a/docs/userguides/negishi/storage.md +++ b/docs/userguides/negishi/storage.md @@ -39,7 +39,7 @@ Negishi supports several methods for file transfer. Use the links below to learn - [FTP / SFTP](storage/ftp_sftp.md) - [HSI](storage/hsi.md) - [HTAR](storage/htar.md) -- [Copying files from Purdue IT research computing home directory to Negishi](storage/copyhome.md) + ## Lost File Recovery - [Lost File Recovery](storage/recover.md) diff --git a/docs/userguides/negishi/storage/copyhome.md b/docs/userguides/negishi/storage/copyhome.md deleted file mode 100755 index 6fc85319..00000000 --- a/docs/userguides/negishi/storage/copyhome.md +++ /dev/null @@ -1,57 +0,0 @@ ---- -tags: - - Negishi -authors: - - hkashgar -resource: Negishi -search: - boost: 2 ---- -# Copying files from Purdue IT research computing home directory to Negishi - -The Negishi home directory and its contents are specific to the Negishi cluster, and are not available on other RCAC machines. For people having access to other Community Clusters and Negishi, *there is no automatic copying or synchronization between main and Negishi home directories*. At your discretion, you can manually copy all or parts of your main research computing home to Negishi using one of the methods described below. - -Please note that copying may fail if the size of your research computing home directory is larger than the Negishi one's quota. Please [check](../storage_quota) usage and limits before proceeding! - -### Complete copy - -For your convenience, a custom tool `copy-rcac-home` is provided to simplify at-will duplication of your main research computing home directory into Negishi. The tool performs a complete 1-to-1 copy using `rsync -auH` (with exception of a narrow subset of system-specific service files). - -To use the tool, simply type `copy-rcac-home` in a terminal window on a Negishi front-end or compute node: - -``` - -$ copy-rcac-home - - This script will copy entire contents of your main RCAC - home directory into your Negishi cluster's $HOME. - - Note: copying may fail if the size of your RCAC home directory - is larger than your quota on the Negishi one (25GB). - BEFORE PROCEEDING, please run 'myquota' command on another - cluster to see your usage there and judge whether it would fit! - -Would you like to proceed? [Y/n]: -``` - -At this stage answering `yes` will proceed with copying, or you can respond with a `no` (or `Ctrl-C`) to cancel. See `copy-rcac-home --help` for more details on the tool. - -### Partial copy - -Desired parts (or whole) of your research computing home directories can be copied to Negishi via any of the home directories' supported [transfer methods](../#file-transfer), such as SCP, SFTP, rsync, or Globus. - -* **Example:** recursive copying of a subdirectory from RCAC home directory into Negishi home using `scp`. - - ``` - - (if you are on Negishi, use other cluster name for the remote part) - $ scp -pr myothercluster.rcac.purdue.edu:somedirectory/ ~/ - - (if you are on another cluster, use Negishi for the remote part) - $ scp -pr somedirectory/ myusername@negishi.rcac.purdue.edu:~/ - ``` -* **Example:** copying using Globus. - - Search collections for *"Purdue Research Computing - Home Directories"* and *"Purdue Negishi Cluster"* endpoints, respectively, then transfer desired files and/or directories as usual. - -[**Back to the Storage section**](../storage.md)