A guide for Wharton/Penn researchers moving workloads, code, and data from the Wharton HPC3 cluster to the university-wide PARCC Betty cluster.
Contents
- Job Submission: Grid Engine to Slurm
- GUI Access: FastX becomes Open OnDemand (OOD)
- Copying Your Current Project Data: Use Globus
- Archiving Older Projects: A Note on Dropbox
- Rebuilding Python Virtual Environments and R Libraries
- Put Your Code in Git Instead of Copying It
Before You Start: What’s Changing
| HPC3 | PARCC Betty | |
|---|---|---|
| Scheduler | Grid Engine (qsub, qrsh, qlogin) |
Slurm (sbatch, srun, salloc) |
| Login host | hpc3.wharton.upenn.edu |
login.betty.parcc.upenn.edu |
| Auth | PennKey + VPN | VPN and 2of3: Kerberos (kinit), Duo, SSH key |
| Remote desktop / GUI apps | FastX (hpc3-desktop.wharton.upenn.edu) |
Open OnDemand ( ood.betty.parcc.upenn.edu ) |
| Storage | Weka /home/DEPT/PENNKEY | VAST /vast/home/P/PENNKEY and /vast/projects/PROJECT |
| Data transfer | File Share (SMB), SFTP, rsync, rclone, Globus | SFTP, rsync, rclone, Globus |
| Software access | Modules, default system installs | Modules, containers |
| Scope | Wharton-only | All Penn schools |
Because the two clusters run different operating environments, nothing moves automatically. Move data deliberately and rebuild your software environments from scratch. It’s also a good chance to leave old projects behind rather than dragging every file across.
1. Job Submission: Grid Engine (qsub/qlogin) to Slurm (sbatch/srun)
HPC3 uses Altair (Univa) Grid Engine. Betty uses Slurm. The concepts map over, but the commands and script directives are different, so you can’t reuse an HPC3 job script on Betty as-is.
Command equivalents
| Task | HPC3 (Grid Engine) | PARCC Betty (Slurm) |
|---|---|---|
| Submit a batch script | qsub myjob.sh |
sbatch myjob.sh |
| Run something interactively | qrsh / qlogin |
srun --pty bash |
| Check your jobs | qstat |
squeue -u $USER |
| Cancel a job | qdel <jobid> |
scancel <jobid> |
| Alter a queued job | qalter |
scontrol update job <jobid> |
| Check completed job accounting | qacct -j <jobid> |
sacct -j <jobid> |
| See node/queue availability | qhost, hpccstatus |
sinfo, parcc_free.py |
Script directive equivalents
Grid Engine directives use #$ at the top of the script; Slurm uses #SBATCH.
HPC3 style (demo.sh):
#!/bin/bash
#$ -N myjob
#$ -j y
#$ -l m_mem_free=6G
#$ -pe openmp 2
#$ -q short.q
module load python
python myscript.py
Betty/Slurm equivalent:
#!/bin/bash
#SBATCH --job-name=myjob
#SBATCH --output=logs/%x_%j.out
#SBATCH --error=logs/%x_%j.err
#SBATCH --partition=genoa-std-mem
#SBATCH --ntasks=1
#SBATCH --cpus-per-task=2
#SBATCH --mem-per-cpu=5632M
#SBATCH --time=04:00:00
module load python/3.13.12
python myscript.py
Key differences to watch for
- Partitions replace queues. Where HPC3 had
hpc3.q,short.q,mem.q, andgpu.q, Betty organizes hardware into partitions, selected with--partition=. As of this writing the main partitions are:Partition Hardware Notes dgx-b200NVIDIA DGX B200 GPU nodes For AI/ML training b200-mig9090GB MIG GPU instance Medium GPU jobs b200-mig4545GB MIG GPU instance Small GPU jobs genoa-std-memAMD Genoa CPUs, standard memory General CPU jobs genoa-large-memAMD Genoa CPUs, high memory Jobs needing >256GB RAM - Always request a time limit (
--time=HH:MM:SS). Be realistic, but don’t leave it off. - GPUs are requested with
--gpus=Nrather than by picking a special queue, but you still need the right--partition. - For array jobs, use
sbatch --array=1-100 myjob.shinstead ofqsub -t 1-100, and reference$SLURM_ARRAY_TASK_IDinstead of$SGE_TASK_ID. - For job dependencies, use
sbatch --dependency=afterok:<jobid>instead of-hold_jid. - For interactive debugging:
srun --partition=genoa-std-mem --ntasks=1 --cpus-per-task=2 --mem-per-cpu=5632M --time=04:00:00 --pty bash. That’s the Betty version ofqrsh/qlogin. - If you’re in multiple projects, the
-Pequivalent is-A. Your default project will bePI_PENNKEY-wharton. - Don’t run real computation on the Betty login nodes. Same rule as HPC3, but Betty enforces it more strictly since login nodes are shared across the whole university.
Before you submit anything on Betty, go through your existing HPC3 .sh job scripts and rewrite the header block from #$ directives to #SBATCH directives, and swap any embedded qsub/qrsh/qstat/qdel calls for their Slurm equivalents above.
2. GUI Access: FastX becomes Open OnDemand (OOD)
On HPC3, graphical access (RStudio, MATLAB, a full desktop) went through FastX. On Betty, the equivalent is Open OnDemand (OOD), a web portal that launches interactive apps like Jupyter or a remote desktop as Slurm jobs behind the scenes.
The key difference: on HPC3 you’d open a FastX desktop and then manually run qrsh/qlogin from a terminal to grab compute resources. On Betty’s OOD, launching an interactive app is the resource request. You pick the partition, CPU/GPU count, memory, and walltime in a form, and OOD submits the Slurm job for you.
- Like FastX sessions, OOD sessions have a hard walltime and get killed if idle. Set a walltime that covers your actual work session and close the session when you’re done, so you’re not holding resources other researchers need.
- If you relied on FastX’s “Applications” menu for RStudio/MATLAB/Stata, on Betty you either load the Lmod module (
module load <tool>) inside your session, or pick a preconfigured interactive app from the OOD menu if one exists.
In your first week on Betty, log into OOD once to confirm Duo and Kerberos are working end-to-end, before you’re depending on it for a deadline.
3. Copying Your Current Project Data: Use Globus
For active projects, use Globus to move data from HPC3 to Betty. It’s more reliable than scp or rsync over a login node: transfers resume after interruptions and get checksummed at the end, so you know they actually finished.
Setting up Globus
- See the PARCC Globus Data Transfer documentation.
- In a browser, go to https://globus.org and click Log In.
- Search for “University of Pennsylvania” as your organization and continue.
- Authenticate with your PennKey and password (Duo if prompted).
- (Optional) If you use Globus elsewhere, you can link identities. See the Globus’s identity linking guide.
Doing the transfer
- In the Globus File Manager, open one panel to the “Wharton – HPC3 Home Directories” endpoint/collection and a second panel to the “PARCC Betty VAST Projects – High Assurance” endpoint/collection.
- The first time you connect to a given collection, Globus will ask for your UPenn credentials and prompt you to approve a data-access consent. Do this once per collection.
- Navigate to your source folder on the HPC3 in one panel and your destination folder (e.g.
/vast/projects/<your-project>/) on the Betty side in the other panel. - Select the files/folders to move and click Start on the source panel.
- Track progress under Activity in Globus.
Why Globus instead of scp/ rsync / rclone for this
- It resumes automatically if a transfer is interrupted (important for large research datasets).
- It verifies data integrity (checksums), rather than trusting that a raw copy succeeded.
- It doesn’t tie up your terminal or a login node for the duration of a multi-hour transfer.
- You get an email with a report when the transfer finishes.
Before deleting anything from HPC3, spot-check that files transferred via Globus match in size and count on the Betty side. parcc_du.py <path> and parcc_quota.py are useful for seeing what actually landed.
4. Archiving Older Projects: A Note on Dropbox
If you’d rather move old, inactive projects off the cluster instead of migrating them to Betty, Dropbox works fine for cold storage. One carryover from HPC3:
rcloneis the practical way to push data from a cluster shell to Dropbox (or Box, Google Drive, S3). Configure a remote once withrclone config, choose Dropbox and complete the OAuth flow, then archive a project with something like:
rclone copy -u -v --transfers 4 some_project dropbox:HPC3/Archive/some_project --progress
- Alternatively, for modest amounts of data, you can download the project to your laptop first and upload it to Dropbox through the normal web interface or desktop app on your own machine, with no cluster-side Dropbox integration needed.
Before archiving, strip out anything you don’t need long-term: scratch files, old job logs, Python virtualenvs, duplicate copies of raw data. Archives are easier to live with when they aren’t just an unfiltered dump of your project folder.
5. Rebuilding Python Virtual Environments and R Libraries
Don’t try to copy your HPC3 venv/conda env/R library folders over to Betty. They were built against HPC3’s OS and CPUs and will break on Betty. Rebuild environments from a manifest instead.
Python
- On the HPC3 (while you still have access), capture what you have:
pip freeze > requirements.txt
# or if you used conda:
conda env export --no-builds > environment.yml
- On Betty, load the Python/Conda tooling via modules:
module load miniconda3
- Rebuild the environment fresh:
pip install -r requirements.txt
# or for conda
conda create -n myproject python=3.13
conda activate myproject
- Don’t
pip install --userinto the system Python on Betty; PARCC’s own guidance discourages it. Keep every project in its own named environment. - If you use MPI or GPU-linked packages (PyTorch with CUDA, mpi4py), reinstall them against Betty’s CUDA and MPI versions rather than assuming the HPC3-built wheel will work. The GPU hardware and CUDA versions are different.
R
- On HPC3, get a list of installed packages before you leave:
installed.packages()[, "Package"]
# Better: if you used renv, just keep your renv.lock file
- On Betty, load the R module:
module load arch/zen4
module load r/4.5.2
- If your project already uses
renv, this is the easiest path: copy over just therenv.lockfile (via Globus or git, not the whole library folder) and run:
renv::restore()
from inside the project directory on Betty. This rebuilds exactly the package versions you had, compiled fresh for Betty.
- If you don’t already use
renv, now’s a good time to start. It turns “what packages do I need” into a single lockfile you can move between systems, instead of a folder of compiled binaries. - For packages with system-library dependencies (e.g.
sf,rJava, anything linking to GDAL or JAGS), checkmodule availon Betty for the matching system modules before compiling from source. Module names and versions may differ from HPC3.
For every active project, produce a requirements.txt or environment.yml (Python) or renv.lock (R) before you lose convenient access to HPC3, so you have a manifest to rebuild from instead of reverse-engineering what was installed.
6. Put Your Code in Git Instead of Copying It
A straight copy via Globus makes sense for data. For your code, use the migration as an excuse to put it in a git repository: GitHub, GitLab, or a bare repo on shared project storage.
Why bother, when you could just copy a folder?
- A folder copy only has today’s version. A git repo has every version you ever committed, which is what you actually want when a result changes and you need to figure out why.
- It’s a real backup that’s independent of either cluster. If a copy step fails, or you find a bug in code you already “migrated,” your code isn’t only living on university-managed storage.
- The same repo works on HPC3, Betty, your laptop, or wherever you end up next:
git cloneinstead of coordinating another file transfer. - Commit your
requirements.txt,environment.yml, orrenv.lockalongside the code, and setting up the project on a new machine becomesgit cloneplus a rebuild from the manifest. - Collaboration gets easier too, which matters more now that PARCC is university-wide. Collaborators outside Wharton can pull your code without needing access to Wharton storage.
A reasonable order of operations:
- Pick a small-to-medium active project as a pilot.
- From HPC3 (or your laptop, if you already have a local copy), initialize a repo if one doesn’t exist:
cd myproject
git init
git add .
git commit -m "Initial commit before PARCC migration"
- Push it to a remote (GitHub/GitLab/Penn-hosted git service).
- On Betty,
git clonethe repo instead of copying the code folder via Globus. - Keep large data files out of git (use
.gitignore); those still move via Globus as described in Section 3. Git is for code and configs, not multi-gigabyte datasets.
At minimum, get your analysis and pipeline code into git before or during the move. Don’t wait until after everything’s copied over to Betty to think about version control.
Migration Checklist
- Confirm Betty account is active and you can
kinit+ssh login.betty.parcc.upenn.edu - Run
srun hostnameto confirm Slurm access works - Rewrite active HPC3
qsubscripts as Slurmsbatchscripts (Section 1) - Log into Open OnDemand once to confirm GUI/interactive access works (Section 2)
- Use Globus to move active project data from HPC3 to the right Betty storage path (Section 3)
- Decide which old projects get archived to Dropbox (via
rclone) instead of migrated (Section 4) - Export
requirements.txt/environment.yml/renv.lockfrom HPC3 before losing access, and rebuild fresh on Betty (Section 5) - Move current, active code into a git repository rather than copying the folder as-is (Section 6)
- Verify storage quotas on Betty with
parcc_quota.py - Confirm with your PI which partition(s)/accounts you should be using for jobs
Getting Help
- Wharton Research & Analytics (HPC3 questions, migration coordination): research-computing@wharton.upenn.edu
- PARCC support: via the PARCC support page/contact form: https://parcc.upenn.edu/support/
- PARCC documentation: https://docs.parcc.upenn.edu/
