<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="https://ccl.cse.nd.edu/feed.xml" rel="self" type="application/atom+xml"/><link href="https://ccl.cse.nd.edu/" rel="alternate" type="text/html" hreflang="en"/><updated>2026-10-08T19:02:18+00:00</updated><id>https://ccl.cse.nd.edu/feed.xml</id><title type="html">The Cooperative Computing Lab</title><subtitle>Cooperative Computing Lab website: news, projects, publications, software, and community updates. </subtitle><entry><title type="html">Declare, Resolve, Reuse: Portable Data Handling for Notebook Workflows in Floability</title><link href="https://ccl.cse.nd.edu/blog/2026/floability-escience/" rel="alternate" type="text/html" title="Declare, Resolve, Reuse: Portable Data Handling for Notebook Workflows in Floability"/><published>2026-10-08T17:00:00+00:00</published><updated>2026-10-08T17:00:00+00:00</updated><id>https://ccl.cse.nd.edu/blog/2026/floability-escience</id><content type="html" xml:base="https://ccl.cse.nd.edu/blog/2026/floability-escience/"><![CDATA[<div class="row justify-content-sm-center"> <div class="col-sm-12"> <figure> <picture> <source class="responsive-img-srcset" srcset="/assets/blog/2026/floability-escience/data-portability-gap-480.webp 480w,/assets/blog/2026/floability-escience/data-portability-gap-800.webp 800w,/assets/blog/2026/floability-escience/data-portability-gap-1400.webp 1400w," type="image/webp" sizes="95vw"/> <img src="/assets/blog/2026/floability-escience/data-portability-gap.png" class="img-fluid rounded z-depth-1" width="100%" height="auto" title="" data-zoomable="" loading="lazy" onerror="this.onerror=null; $('.responsive-img-srcset').remove();"/> </picture> </figure> </div> </div> <p>In a new paper presented at IEEE eScience 2026, <strong>Md Saiful Islam</strong> along with co-authors Reyer Band, Jin Zhou, Tanu Malik, Kevin Lannon, and Douglas Thain address one of the most stubborn obstacles in computational science: data portability across High-Performance Computing (HPC) systems.</p> <p>In their paper, <strong><a href="/assets/paper/pdf/floability-escience-2026.pdf">Declare, Resolve, Reuse: A Portable Data Layer for Notebook Workflows Across HPC Systems</a></strong>, <strong>Saiful</strong> introduces an externalized, declarative data layer built for the <strong>Floability</strong> workflow engine. This framework expands on the “backpack” packaging abstraction, allowing data-intensive Jupyter notebooks to run seamlessly across disparate HPC environments without code modifications.</p> <h3 id="the-problem-the-data-portability-gap">The Problem: The Data Portability Gap</h3> <p>Jupyter notebooks are ubiquitous in exploratory science, yet studies reveal that up to three-quarters of published notebooks fail when re-executed end-to-end. While software environments are increasingly containerized or packaged with tools like Conda and Apptainer, data handling remains fragile.</p> <p>As highlighted in <strong>Figure 2</strong> (above), scientific notebooks routinely embed site-specific assumptions into Python cells:</p> <ul> <li>Hard-coded absolute file paths (e.g., <code class="language-plaintext highlighter-rouge">/scratch/data...</code>) that break when transferred to another cluster.</li> <li>Ad-hoc download cells that re-fetch gigabytes of data on every single execution.</li> <li>Unset or site-dependent environment variables.</li> </ul> <p>When a researcher attempts to move a notebook from Site A to Site B or Site C, the notebook code must be manually edited and rewritten into distinct, fragile variants.</p> <h3 id="the-solution-declare-resolve-reuse">The Solution: Declare, Resolve, Reuse</h3> <p>Saiful’s approach decouples data requirements from notebook code by introducing an explicit specification file (<code class="language-plaintext highlighter-rouge">data.yml</code>) managed by the Floability runtime. The architecture relies on three core tenets:</p> <ol> <li><strong>Declare:</strong> Workflows define input datasets, logical names, expected validation criteria (such as file size and SHA-256 checksums), and target runtime paths in a declarative YAML file. Profiles allow users to switch between dataset variants (e.g., <code class="language-plaintext highlighter-rouge">train_set</code> vs. <code class="language-plaintext highlighter-rouge">test_set</code>) while serving data to the notebook at the exact same relative target path.</li> <li><strong>Resolve:</strong> Floability abstracts access across heterogeneous sources—including Pelican federated storage, S3 object stores, HTTP endpoints, and local filesystems—with support for multi-source fallback policies.</li> <li><strong>Reuse:</strong> An HPC-local cache indexes datasets using a combination of the specification schema key and remote source metadata (such as ETag, modification time, and file size). Unchanged datasets are identified instantly without downloading full contents, letting repeat runs skip data transfers safely.</li> </ol> <h3 id="multi-site-evaluation">Multi-Site Evaluation</h3> <p>To evaluate the portable data layer, Saiful tested three large-scale, data-intensive workflows:</p> <ul> <li><strong>DV5:</strong> A High-Energy Physics (HEP) analysis running over ~108 GB of simulated LHC data across 44,010 tasks.</li> <li><strong>LFV:</strong> A Lepton Flavor Violation analysis over ~7.5 GB of data.</li> <li><strong>DConv:</strong> An image convolution workflow processing ~93 GB of GOES-16 satellite imagery across 48,528 tasks.</li> </ul> <p>The evaluation deployed identical Floability backpacks across three distinct HPC facilities: <strong>ND CRC</strong> (HTCondor scheduler), <strong>Purdue Anvil</strong> (Slurm scheduler), and <strong>TACC Stampede3</strong> (Slurm scheduler).</p> <p><strong>Key Findings:</strong></p> <ul> <li><strong>Zero Code Edits:</strong> The exact same notebook code ran completely unchanged across all three systems, with site-specific configurations supplied strictly via CLI options.</li> <li><strong>Minimal Lookup Overhead:</strong> Metadata-based cache key lookups took ~0.12 seconds for single files (up to 1 GB) and remained under 4.3 seconds even for complex dataset directories containing 10,000 files.</li> <li><strong>Streamlined Execution:</strong> On repeat executions, cached dataset reuse completely removed data materialization and software environment creation from the critical runtime path.</li> </ul> <p>By taking data movement and staging logic out of individual notebook cells, Saiful’s work turns portable, repeatable scientific execution from an ad-hoc engineering chore into an automated property of the workflow.</p> <hr/> <h3 id="resources">Resources</h3> <ul> <li><strong>Paper PDF:</strong> <a href="/assets/paper/pdf/floability-escience-2026.pdf">Declare, Resolve, Reuse: A Portable Data Layer for Notebook Workflows Across HPC Systems</a></li> <li><strong>Project Website:</strong> <a href="https://floability.github.io">floability.github.io</a></li> <li><strong>Artifacts &amp; Benchmarks:</strong> <a href="https://github.com/saifulislampi/floability-data-experiments">GitHub Repository</a></li> </ul>]]></content><author><name>Cooperative Computing Lab</name></author><category term="research"/><category term="publications"/><category term="floability"/><category term="notebooks"/><category term="hpc"/><category term="data-portability"/><category term="backpacks"/><summary type="html"><![CDATA[Introducing a portable data layer for Floability that eliminates hard-coded paths and enables reproducible notebook execution across heterogeneous HPC clusters.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://ccl.cse.nd.edu/assets/blog/2026/floability-escience/data-portability-gap.png"/><media:content medium="image" url="https://ccl.cse.nd.edu/assets/blog/2026/floability-escience/data-portability-gap.png" xmlns:media="http://search.yahoo.com/mrss/"/></entry><entry><title type="html">CCL at eScience’26</title><link href="https://ccl.cse.nd.edu/blog/2026/escience-26/" rel="alternate" type="text/html" title="CCL at eScience’26"/><published>2026-09-29T17:00:00+00:00</published><updated>2026-09-29T17:00:00+00:00</updated><id>https://ccl.cse.nd.edu/blog/2026/escience-26</id><content type="html" xml:base="https://ccl.cse.nd.edu/blog/2026/escience-26/"><![CDATA[<div class="row justify-content-sm-center"> <div class="col-sm-12"> <figure> <picture> <source class="responsive-img-srcset" srcset="/assets/blog/2026/escience-26/escience-dark-logo-480.webp 480w,/assets/blog/2026/escience-26/escience-dark-logo-800.webp 800w,/assets/blog/2026/escience-26/escience-dark-logo-1400.webp 1400w," type="image/webp" sizes="95vw"/> <img src="/assets/blog/2026/escience-26/escience-dark-logo.png" class="img-fluid rounded z-depth-1" width="100%" height="auto" title="" data-zoomable="" loading="lazy" onerror="this.onerror=null; $('.responsive-img-srcset').remove();"/> </picture> </figure> </div> </div> <hr/> <p>This week, <strong>Dr. Thain</strong>, <strong>Alan Rodrigues</strong>, and <strong>Barry</strong> are attending the <a href="https://www.escience-conference.org/2026/">eScience’26 conference</a> in Naples, Italy. The conference is being held at the Villa Doria d’Angri, an architectural masterpiece belonging to the University of Naples “Parthenope,” from September 28 - October 2, 2026.</p> <p>Barry is presenting his work on: <strong><a href="/assets/paper/pdf/reshaping-escience-2026.pdf">Fusion and Reshaping of Hidden Task Graphs for High Energy Physics Applications</a></strong>.</p> <p>Alan is presenting his work on: <strong><a href="/assets/paper/pdf/hl-lhc-escience-2026.pdf">Hybrid Workflow Composition for Extreme-Scale Data Processing: A Case Study on the HL-LHC</a></strong>.</p> <p>Dr. Thain is presenting (on behalf of Saiful): <strong><a href="/assets/paper/pdf/floability-escience-2026.pdf">Declare, Resolve, Reuse: A Portable Data Layer for Notebook Workflows Across HPC Systems</a></strong>.</p> <div class="row justify-content-sm-center"> <div class="col-sm-12"> <figure> <picture> <source class="responsive-img-srcset" srcset="/assets/blog/2026/escience-26/IMG_7476-480.webp 480w,/assets/blog/2026/escience-26/IMG_7476-800.webp 800w,/assets/blog/2026/escience-26/IMG_7476-1400.webp 1400w," type="image/webp" sizes="95vw"/> <img src="/assets/blog/2026/escience-26/IMG_7476.jpg" class="img-fluid rounded z-depth-1" width="100%" height="auto" title="" data-zoomable="" loading="lazy" onerror="this.onerror=null; $('.responsive-img-srcset').remove();"/> </picture> </figure> </div> </div>]]></content><author><name>Cooperative Computing Lab</name></author><category term="news"/><category term="news"/><category term="conference"/><category term="escience"/><summary type="html"><![CDATA[This week, Alan, Barry, and Dr. Thain are attending the eScience'26 conference in Naples, Italy.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://ccl.cse.nd.edu/assets/blog/2026/escience-26/escience-dark-logo.png"/><media:content medium="image" url="https://ccl.cse.nd.edu/assets/blog/2026/escience-26/escience-dark-logo.png" xmlns:media="http://search.yahoo.com/mrss/"/></entry><entry><title type="html">SADE Drone Simulation at NASA ULI</title><link href="https://ccl.cse.nd.edu/blog/2026/nasa-uli/" rel="alternate" type="text/html" title="SADE Drone Simulation at NASA ULI"/><published>2026-09-22T17:00:00+00:00</published><updated>2026-09-22T17:00:00+00:00</updated><id>https://ccl.cse.nd.edu/blog/2026/nasa-uli</id><content type="html" xml:base="https://ccl.cse.nd.edu/blog/2026/nasa-uli/"><![CDATA[<div class="row justify-content-sm-center"> <div class="col-sm-12"> <figure> <picture> <source class="responsive-img-srcset" srcset="/assets/blog/2026/nasa-uli/canvas-480.webp 480w,/assets/blog/2026/nasa-uli/canvas-800.webp 800w,/assets/blog/2026/nasa-uli/canvas-1400.webp 1400w," type="image/webp" sizes="95vw"/> <img src="/assets/blog/2026/nasa-uli/canvas.png" class="img-fluid rounded z-depth-1" width="100%" height="auto" title="" data-zoomable="" loading="lazy" onerror="this.onerror=null; $('.responsive-img-srcset').remove();"/> </picture> </figure> </div> </div> <hr/> <p>Last Tuesday, September 15, our <strong>Safety-Aware Drone Ecosystem (SADE)</strong> team participated in a <a href="https://uli.arc.nasa.gov/">NASA University Leadership Initiative (ULI)</a> presentation titled “<strong><a href="/assets/blog/2026/nasa-uli/ULI-Talk.pdf">Who Should Enter? Reputation, Risk, and Decision Making for UAVs in Low-Altitude Airspace.</a></strong>” The broader SADE project, led by <strong><a href="https://engineering.nd.edu/faculty/jane-cleland-huang/">Prof. Jane Cleland-Huang</a></strong>, brings together researchers from the University of Notre Dame and other collaborating institutions to explore how small uncrewed aircraft systems can safely operate in managed airspace through fair, transparent, explainable, and consistent decision-making. The presentation highlighted several components of the ecosystem, including safety certification, proving-ground evaluation, runtime monitoring and reputation models, system architecture, and simulation.</p> <p>During the presentation, <strong><a href="https://engineering.nd.edu/faculty/douglas-thain/">Prof. Douglas Thain</a></strong> introduced the key components of the platform and its goal of providing a self-service environment for evaluating custom software pilots interacting with <strong>SADE Zones</strong> under challenging and realistic conditions. The platform integrates <a href="https://px4.io/">PX4</a>, <a href="https://gazebosim.org/">Gazebo</a>, <a href="https://www.unrealengine.com/">Unreal Engine</a>, and realistic geographic environments, enabling researchers to create complex scenarios involving multiple drones, terrain, buildings, wind conditions, and dynamically managed airspace. The presentation highlighted several case studies developed by our team, including the <strong>Utah Mountains</strong> simulation with 40 drones, <strong>Yosemite Search and Rescue</strong>, <strong>Indianapolis Airport</strong>, and <strong>Chicago Downtown</strong> scenarios.</p> <p>We also showcased videos and screenshots demonstrating different capabilities of the platform. These included drones requesting permission to enter a <strong>SADE Zone</strong>, rerouting around the zone when access was denied, experiencing the effects of realistic wind conditions generated for the simulation, and interacting with real terrain and buildings—including examples where a drone collides with a building in Chicago. Together, these demonstrations showed how <strong>SADE Simulation</strong> can be used to study drone behavior and software-pilot decisions in realistic, safety-critical environments.</p> <p>It was rewarding to see the simulation work presented alongside the other components of SADE, demonstrating how the different research efforts come together toward a common goal: enabling safer and more trustworthy drone operations in increasingly complex low-altitude airspace. The talk was also a great reminder of how our day-to-day engineering work contributes to the broader NASA ULI research effort and the future of safe autonomous aviation.</p>]]></content><author><name>Cooperative Computing Lab</name></author><category term="news"/><category term="news"/><category term="sade"/><category term="drone-simulation"/><category term="uav"/><category term="px4"/><category term="gazebo"/><category term="unreal-engine"/><summary type="html"><![CDATA[The Safety-Aware Drone Ecosystem (SADE) team recently presented their realistic simulation platform at a NASA ULI event, showcasing how complex virtual testing environments advance safe and trustworthy low-altitude drone operations.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://ccl.cse.nd.edu/assets/blog/2026/nasa-uli/canvas.png"/><media:content medium="image" url="https://ccl.cse.nd.edu/assets/blog/2026/nasa-uli/canvas.png" xmlns:media="http://search.yahoo.com/mrss/"/></entry><entry><title type="html">Floability at APeX Summit</title><link href="https://ccl.cse.nd.edu/blog/2026/apex-summit-26/" rel="alternate" type="text/html" title="Floability at APeX Summit"/><published>2026-09-16T17:00:00+00:00</published><updated>2026-09-16T17:00:00+00:00</updated><id>https://ccl.cse.nd.edu/blog/2026/apex-summit-26</id><content type="html" xml:base="https://ccl.cse.nd.edu/blog/2026/apex-summit-26/"><![CDATA[<div class="row justify-content-sm-center"> <div class="col-sm-12"> <figure> <picture> <source class="responsive-img-srcset" srcset="/assets/blog/2026/apex-summit-26/apex_logo-480.webp 480w,/assets/blog/2026/apex-summit-26/apex_logo-800.webp 800w,/assets/blog/2026/apex-summit-26/apex_logo-1400.webp 1400w," type="image/webp" sizes="95vw"/> <img src="/assets/blog/2026/apex-summit-26/apex_logo.png" class="img-fluid rounded z-depth-1" width="100%" height="auto" title="" data-zoomable="" loading="lazy" onerror="this.onerror=null; $('.responsive-img-srcset').remove();"/> </picture> </figure> </div> </div> <hr/> <p>This week, CCL fourth-year PhD student <strong>Md Saiful Islam</strong> and second-year PhD student <strong>Ryan Hartung</strong> traveled to Chicago for <strong><a href="https://parsl-project.org/parslfest/apex2026.html">APeX Summit 2026</a></strong>, Academy, Parsl, Globus Compute, held at the University of Chicago’s Data Science Institute from September 14–15, 2026. Saiful presented his work <strong>Floability Backpacks: Packaging Workflows for Portable HPC Deployment</strong>.</p> <div class="row justify-content-sm-center"> <div class="col-sm-12"> <figure> <picture> <source class="responsive-img-srcset" srcset="/assets/blog/2026/apex-summit-26/20260914_163052-480.webp 480w,/assets/blog/2026/apex-summit-26/20260914_163052-800.webp 800w,/assets/blog/2026/apex-summit-26/20260914_163052-1400.webp 1400w," type="image/webp" sizes="95vw"/> <img src="/assets/blog/2026/apex-summit-26/20260914_163052.jpg" class="img-fluid rounded z-depth-1" width="100%" height="auto" title="" data-zoomable="" loading="lazy" onerror="this.onerror=null; $('.responsive-img-srcset').remove();"/> </picture> </figure> <figure> <picture> <source class="responsive-img-srcset" srcset="/assets/blog/2026/apex-summit-26/20260914_163230-480.webp 480w,/assets/blog/2026/apex-summit-26/20260914_163230-800.webp 800w,/assets/blog/2026/apex-summit-26/20260914_163230-1400.webp 1400w," type="image/webp" sizes="95vw"/> <img src="/assets/blog/2026/apex-summit-26/20260914_163230.jpg" class="img-fluid rounded z-depth-1" width="100%" height="auto" title="" data-zoomable="" loading="lazy" onerror="this.onerror=null; $('.responsive-img-srcset').remove();"/> </picture> </figure> <figure> <picture> <source class="responsive-img-srcset" srcset="/assets/blog/2026/apex-summit-26/20260914_163756-480.webp 480w,/assets/blog/2026/apex-summit-26/20260914_163756-800.webp 800w,/assets/blog/2026/apex-summit-26/20260914_163756-1400.webp 1400w," type="image/webp" sizes="95vw"/> <img src="/assets/blog/2026/apex-summit-26/20260914_163756.jpg" class="img-fluid rounded z-depth-1" width="100%" height="auto" title="" data-zoomable="" loading="lazy" onerror="this.onerror=null; $('.responsive-img-srcset').remove();"/> </picture> </figure> </div> </div>]]></content><author><name>Cooperative Computing Lab</name></author><category term="news"/><category term="news"/><category term="conference"/><category term="floability"/><summary type="html"><![CDATA[This week, Saiful and Ryan traveled to the APeX Summit 2026 (previously ParslFest) conference at The University of Chicago.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://ccl.cse.nd.edu/assets/blog/2026/apex-summit-26/apex_logo.png"/><media:content medium="image" url="https://ccl.cse.nd.edu/assets/blog/2026/apex-summit-26/apex_logo.png" xmlns:media="http://search.yahoo.com/mrss/"/></entry><entry><title type="html">The Vine CMS Analysis Stack: Use Case at Notre Dame</title><link href="https://ccl.cse.nd.edu/blog/2026/uscms_af_vine-stack/" rel="alternate" type="text/html" title="The Vine CMS Analysis Stack: Use Case at Notre Dame"/><published>2026-09-08T17:00:00+00:00</published><updated>2026-09-08T17:00:00+00:00</updated><id>https://ccl.cse.nd.edu/blog/2026/uscms_af_vine-stack</id><content type="html" xml:base="https://ccl.cse.nd.edu/blog/2026/uscms_af_vine-stack/"><![CDATA[<div class="row justify-content-sm-center"> <div class="col-sm-12"> <figure> <picture> <source class="responsive-img-srcset" srcset="/assets/blog/2026/uscms_af_vine-stack/banner-480.webp 480w,/assets/blog/2026/uscms_af_vine-stack/banner-800.webp 800w,/assets/blog/2026/uscms_af_vine-stack/banner-1400.webp 1400w," type="image/webp" sizes="95vw"/> <img src="/assets/blog/2026/uscms_af_vine-stack/banner.png" class="img-fluid rounded z-depth-1" width="100%" height="auto" title="" data-zoomable="" loading="lazy" onerror="this.onerror=null; $('.responsive-img-srcset').remove();"/> </picture> </figure> </div> </div> <hr/> <p>This week, Ben, presented his work on the <strong><a href="https://github.com/cooperative-computing-lab/vine-cms-analysis-stack">Vine CMS analysis stack</a></strong> during the US CMS Analysis Facilities monthly meeting.</p> <p>The Vine CMS analysis stack is a reference stack for running CMS analysis workflows with <strong><a href="https://github.com/scikit-hep/coffea">Coffea</a></strong> on top of <strong><a href="https://cctools.readthedocs.io/en/stable/taskvine">TaskVine</a></strong>, orchestrated by <strong><a href="https://github.com/cooperative-computing-lab/vine-reduce">VineReduce</a></strong>. It does not depend on Notre Dame resources, so it can work anywhere there is a Python environment and either local cores or a batch cluster (HTCondor, SLURM, SGE, …) to point workers at.</p> <p>You can view his presentation slides <strong><a href="/assets/blog/2026/uscms_af_vine-stack/USCMS_AF_vine-stack.pdf">HERE</a></strong>.</p>]]></content><author><name>Cooperative Computing Lab</name></author><category term="news"/><category term="ccl"/><category term="lab-updates"/><category term="coffea"/><category term="taskvine"/><category term="cms"/><summary type="html"><![CDATA[Ben presented his work on the Vine CMS analysis stack this week.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://ccl.cse.nd.edu/assets/blog/2026/uscms_af_vine-stack/banner.png"/><media:content medium="image" url="https://ccl.cse.nd.edu/assets/blog/2026/uscms_af_vine-stack/banner.png" xmlns:media="http://search.yahoo.com/mrss/"/></entry><entry><title type="html">Demystifying Cluster Storage: CephFS, Scratch, and I/O Bottlenecks</title><link href="https://ccl.cse.nd.edu/blog/2026/cluster-storage/" rel="alternate" type="text/html" title="Demystifying Cluster Storage: CephFS, Scratch, and I/O Bottlenecks"/><published>2026-09-01T17:00:00+00:00</published><updated>2026-09-01T17:00:00+00:00</updated><id>https://ccl.cse.nd.edu/blog/2026/cluster-storage</id><content type="html" xml:base="https://ccl.cse.nd.edu/blog/2026/cluster-storage/"><![CDATA[<div class="row justify-content-sm-center"> <div class="col-sm-12"> <figure> <picture> <source class="responsive-img-srcset" srcset="/assets/blog/2026/cluster-storage/beginners-guide-to-hpc-480.webp 480w,/assets/blog/2026/cluster-storage/beginners-guide-to-hpc-800.webp 800w,/assets/blog/2026/cluster-storage/beginners-guide-to-hpc-1400.webp 1400w," type="image/webp" sizes="95vw"/> <img src="/assets/blog/2026/cluster-storage/beginners-guide-to-hpc.png" class="img-fluid rounded z-depth-1" width="100%" height="auto" title="" data-zoomable="" loading="lazy" onerror="this.onerror=null; $('.responsive-img-srcset').remove();"/> </picture> </figure> </div> </div> <hr/> <p>Shared network filesystems, CephFS, Lustre, or NFS, are the backbone of high-performance computing clusters. They allow hundreds of compute nodes to seamlessly read and write to the same central directories simultaneously.</p> <p>However, shared parallel storage operates under vastly different physical constraints than a local laptop SSD. When users treat shared network storage like a personal hard drive, they often encounter mysterious slowdowns, hit unexpected quota limits, or bring storage responsiveness to a crawl for the entire cluster.</p> <h2 id="the-small-file-problem-why-100000-small-files-destroy-performance">The Small File Problem: Why 100,000 Small Files Destroy Performance</h2> <p>Parallel network filesystems are optimized for <strong>high bandwidth throughput</strong>, meaning they excel at streaming massive, multi-gigabyte files (like large dataset archives or continuous checkpoint files) across dedicated network hardware.</p> <p>They perform poorly, however, when handling <strong>small file I/O operations</strong>.</p> <h3 id="metadata-bottlenecks-explained">Metadata Bottlenecks Explained</h3> <p>Every file creation, directory listing, read, write, and deletion request requires a communication step with the filesystem’s <strong>Metadata Server (MDS)</strong>. The MDS tracks file ownership, directory trees, permissions, and physical storage locations (inodes).</p> <ul> <li>Writing <strong>one 10GB binary file</strong> requires <strong>1 metadata request</strong> to allocate space, followed by continuous high-speed data streaming.</li> <li>Writing <strong>100,000 tiny 100KB log files</strong> requires <strong>100,000 individual metadata requests</strong>, forcing the MDS server to handle constant network handshakes and lock updates.</li> </ul> <p>When a batch job generates thousands of tiny intermediate files or reads an uncompressed dataset of tiny images directly from shared storage, the metadata server becomes overloaded. This creates massive I/O latency, causing job execution to stall and slowing down directory navigation cluster-wide.</p> <h2 id="decoding-storage-quotas-capacity-vs-inodes">Decoding Storage Quotas: Capacity vs. Inodes</h2> <p>When a job fails with <code class="language-plaintext highlighter-rouge">Disk quota exceeded</code> or <code class="language-plaintext highlighter-rouge">No space left on device</code>, your immediate instinct is to check your disk space usage. But cluster storage quotas track two completely separate limits:</p> <ol> <li><strong>Block Quota (Capacity):</strong> The physical amount of raw data storage allocated to your user or project (measured in GB or TB).</li> <li><strong>Inode Quota (File Count):</strong> The total number of individual files and directories allowed in your space, regardless of file size.</li> </ol> <p>Creating hundreds of thousands of small logs, virtual environments, or temporary output files will max out your <strong>Inode quota</strong> long before you consume your block storage allocation. Once your inode limit is reached, the operating system blocks the creation of new files—even if you have terabytes of unused disk space remaining.</p> <h2 id="leveraging-node-local-tmp-space-safely">Leveraging Node-Local <code class="language-plaintext highlighter-rouge">/tmp</code> Space Safely</h2> <p>To bypass network latency, protect metadata servers, and prevent quota exhaustion, heavy file operations should take place on <strong>node-local storage</strong> (such as fast local NVMe or SSD drives mounted at <code class="language-plaintext highlighter-rouge">/tmp</code> or <code class="language-plaintext highlighter-rouge">$TMPDIR</code>).</p> <p>Node-local storage sits directly inside the compute node hosting your job, bypassing the shared network network entirely.</p> <h3 id="the-recommended-node-local-workflow-pattern">The Recommended Node-Local Workflow Pattern:</h3> <p>Structure your submission script to stage files locally during job execution:</p> <div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">#!/bin/bash</span>
<span class="c">#SBATCH --job-name=fast_io_job</span>

<span class="c"># 1. Define a temporary directory unique to this job on local node storage</span>
<span class="nv">LOCAL_DIR</span><span class="o">=</span><span class="s2">"/tmp/</span><span class="nv">$USER</span><span class="s2">/</span><span class="nv">$SLURM_JOB_ID</span><span class="s2">"</span>
<span class="nb">mkdir</span> <span class="nt">-p</span> <span class="s2">"</span><span class="nv">$LOCAL_DIR</span><span class="s2">"</span>

<span class="c"># 2. Copy and uncompress input datasets from central storage to local storage</span>
<span class="nb">cp</span> /scratch/username/dataset.tar.gz <span class="s2">"</span><span class="nv">$LOCAL_DIR</span><span class="s2">/"</span>
<span class="nb">tar</span> <span class="nt">-xzf</span> <span class="s2">"</span><span class="nv">$LOCAL_DIR</span><span class="s2">/dataset.tar.gz"</span> <span class="nt">-C</span> <span class="s2">"</span><span class="nv">$LOCAL_DIR</span><span class="s2">/"</span>

<span class="c"># 3. Execute your program using local /tmp paths for input and intermediate output</span>
python3 my_training_script.py <span class="nt">--data-dir</span> <span class="s2">"</span><span class="nv">$LOCAL_DIR</span><span class="s2">/dataset"</span> <span class="nt">--out-dir</span> <span class="s2">"</span><span class="nv">$LOCAL_DIR</span><span class="s2">/output"</span>

<span class="c"># 4. Pack final results into a single archive file and move back to shared storage</span>
<span class="nb">tar</span> <span class="nt">-czf</span> <span class="s2">"</span><span class="nv">$LOCAL_DIR</span><span class="s2">/final_results.tar.gz"</span> <span class="nt">-C</span> <span class="s2">"</span><span class="nv">$LOCAL_DIR</span><span class="s2">/output"</span> <span class="nb">.</span>
<span class="nb">cp</span> <span class="s2">"</span><span class="nv">$LOCAL_DIR</span><span class="s2">/final_results.tar.gz"</span> /scratch/username/results/job_<span class="k">${</span><span class="nv">SLURM_JOB_ID</span><span class="k">}</span>_results.tar.gz

<span class="c"># 5. Clean up local node space before exiting</span>
<span class="nb">rm</span> <span class="nt">-rf</span> <span class="s2">"</span><span class="nv">$LOCAL_DIR</span><span class="s2">"</span>
</code></pre></div></div> <hr/> <h2 id="summary-the-cluster-storage-hygiene-checklist">Summary: The Cluster Storage Hygiene Checklist</h2> <ol> <li><strong>Avoid uncompressed datasets.</strong> Bundle datasets into a single archive (<code class="language-plaintext highlighter-rouge">.tar</code>, <code class="language-plaintext highlighter-rouge">.zip</code>, <code class="language-plaintext highlighter-rouge">.h5</code>, or <code class="language-plaintext highlighter-rouge">.sqlite</code>) before transferring them to shared storage.</li> <li><strong>Monitor both quota metrics.</strong> Check both your byte allocation and file count allocations using your cluster’s quota tools (e.g., <code class="language-plaintext highlighter-rouge">myquota</code> or <code class="language-plaintext highlighter-rouge">ceph df</code>).</li> <li><strong>Stage temporary files on <code class="language-plaintext highlighter-rouge">/tmp</code>.</strong> Use local node storage (<code class="language-plaintext highlighter-rouge">$TMPDIR</code> or <code class="language-plaintext highlighter-rouge">/tmp</code>) for fast read/write operations during execution.</li> <li><strong>Aggregate output logs.</strong> Buffer runtime output in memory or write progress to a single structured log file rather than generating individual files per iteration.</li> <li><strong>Always clean up local directories.</strong> Include explicit cleanup commands (<code class="language-plaintext highlighter-rouge">rm -rf</code>) in your job script to ensure local scratch disk space stays clean for subsequent users.</li> </ol>]]></content><author><name>Cooperative Computing Lab</name></author><category term="technical-articles"/><category term="hpc"/><category term="storage"/><category term="cephfs"/><category term="io-performance"/><category term="scratch"/><summary type="html"><![CDATA[Understand shared parallel filesystems vs. local storage, why small files crash metadata servers, and how to optimize your job's I/O performance.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://ccl.cse.nd.edu/assets/blog/2026/cluster-storage/beginners-guide-to-hpc.png"/><media:content medium="image" url="https://ccl.cse.nd.edu/assets/blog/2026/cluster-storage/beginners-guide-to-hpc.png" xmlns:media="http://search.yahoo.com/mrss/"/></entry><entry><title type="html">Kicking Off the New Semester: Welcome Andrés and Lab Updates</title><link href="https://ccl.cse.nd.edu/blog/2026/fall-2026-kickoff/" rel="alternate" type="text/html" title="Kicking Off the New Semester: Welcome Andrés and Lab Updates"/><published>2026-08-26T17:00:00+00:00</published><updated>2026-08-26T17:00:00+00:00</updated><id>https://ccl.cse.nd.edu/blog/2026/fall-2026-kickoff</id><content type="html" xml:base="https://ccl.cse.nd.edu/blog/2026/fall-2026-kickoff/"><![CDATA[<div class="row justify-content-sm-center"> <div class="col-sm-12"> <figure> <picture> <source class="responsive-img-srcset" srcset="/assets/blog/2026/fall-2026-kickoff/screenshot-480.webp 480w,/assets/blog/2026/fall-2026-kickoff/screenshot-800.webp 800w,/assets/blog/2026/fall-2026-kickoff/screenshot-1400.webp 1400w," type="image/webp" sizes="95vw"/> <img src="/assets/blog/2026/fall-2026-kickoff/screenshot.png" class="img-fluid rounded z-depth-1" width="100%" height="auto" title="" data-zoomable="" loading="lazy" onerror="this.onerror=null; $('.responsive-img-srcset').remove();"/> </picture> </figure> </div> </div> <p>As campus comes back to life for the start of the new semester, the Cooperative Computing Lab is excited to hit the ground running with fresh research, ongoing projects, and growing software initiatives.</p> <h2 id="welcoming-andrés-iglesias-to-the-lab">Welcoming Andrés Iglesias to the Lab</h2> <p>We are thrilled to re-welcome <strong>Andrés Iglesias</strong> back to the lab! Andrés will be resuming his work on the <strong>Pledge</strong> project in close collaboration with <strong>Colin</strong>. We are excited to see the impact of their continued work.</p> <h2 id="team-roles--responsibilities">Team Roles &amp; Responsibilities</h2> <p>To keep our workflows running smoothly across research, releases, and community engagement, our internal team coordinator roles remain steady for the semester:</p> <ul> <li><strong>Lax:</strong> Team Meeting Organizer (keeping our weekly meetings structured and productive)</li> <li><strong>Ryan:</strong> Communications Coordinator (creating blog posts, managing lab updates, and announcements)</li> <li><strong>Saiful:</strong> Outreach &amp; Training Lead (organizing tutorials and helping new users navigate our tools)</li> <li><strong>Ben:</strong> Release Engineer (ensuring stable, high-quality software builds and deployments)</li> </ul> <p>Here’s to a productive semester of research, collaboration, and open-source computing! Stay tuned for more technical articles and project updates in the coming weeks.</p>]]></content><author><name>Cooperative Computing Lab</name></author><category term="news"/><category term="ccl"/><category term="lab-updates"/><category term="pledge"/><summary type="html"><![CDATA[Welcoming Andrés Iglesias back to the Cooperative Computing Lab as we kick off the new academic semester.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://ccl.cse.nd.edu/assets/blog/2026/new-semester/screenshot.png"/><media:content medium="image" url="https://ccl.cse.nd.edu/assets/blog/2026/new-semester/screenshot.png" xmlns:media="http://search.yahoo.com/mrss/"/></entry><entry><title type="html">Shell Survival Skills: Terminal Tools Every HPC User Needs</title><link href="https://ccl.cse.nd.edu/blog/2026/shell-survival-skills/" rel="alternate" type="text/html" title="Shell Survival Skills: Terminal Tools Every HPC User Needs"/><published>2026-08-18T17:00:00+00:00</published><updated>2026-08-18T17:00:00+00:00</updated><id>https://ccl.cse.nd.edu/blog/2026/shell-survival-skills</id><content type="html" xml:base="https://ccl.cse.nd.edu/blog/2026/shell-survival-skills/"><![CDATA[<div class="row justify-content-sm-center"> <div class="col-sm-12"> <figure> <picture> <source class="responsive-img-srcset" srcset="/assets/blog/2026/shell-survival-skills/Beginner's%20Guide%20to%20HPC-480.webp 480w,/assets/blog/2026/shell-survival-skills/Beginner's%20Guide%20to%20HPC-800.webp 800w,/assets/blog/2026/shell-survival-skills/Beginner's%20Guide%20to%20HPC-1400.webp 1400w," type="image/webp" sizes="95vw"/> <img src="/assets/blog/2026/shell-survival-skills/Beginner's%20Guide%20to%20HPC.png" class="img-fluid rounded z-depth-1" width="100%" height="auto" title="" data-zoomable="" loading="lazy" onerror="this.onerror=null; $('.responsive-img-srcset').remove();"/> </picture> </figure> </div> </div> <p>Working over SSH on a remote supercomputer means your active connection is always at the mercy of your network. A brief Wi-Fi drop, a VPN hiccup, or closing your laptop lid will abruptly close your SSH session—killing whatever interactive build, environment setup, or monitoring script you had running in that terminal window.</p> <p>Beyond connection drops, navigating massive directory trees and digging through hundreds of job output files with basic commands quickly becomes tedious. Mastering a few quality-of-life Linux tools transforms the remote terminal from an unforgiving interface into a safe, efficient workspace.</p> <h2 id="1-terminal-multiplexers-bulletproof-your-remote-sessions">1. Terminal Multiplexers: Bulletproof Your Remote Sessions</h2> <p>A <strong>terminal multiplexer</strong> like <code class="language-plaintext highlighter-rouge">tmux</code> (or GNU <code class="language-plaintext highlighter-rouge">screen</code>) creates a persistent session on the remote server that runs independently of your SSH connection. If your network disconnects, your remote programs keep running in the background. When you log back in, you simply reattach to the session exactly where you left off.</p> <h3 id="essential-tmux-commands">Essential <code class="language-plaintext highlighter-rouge">tmux</code> Commands:</h3> <ul> <li><strong>Start a new named session:</strong> <div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code>tmux new <span class="nt">-s</span> workflow
</code></pre></div> </div> </li> <li><strong>Detach from a session (leaves it running in the background):</strong> Press <code class="language-plaintext highlighter-rouge">Ctrl+b</code>, release, then press <code class="language-plaintext highlighter-rouge">d</code>.</li> <li><strong>List all active sessions:</strong> <div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code>tmux <span class="nb">ls</span>
</code></pre></div> </div> </li> <li><strong>Reattach to a running session:</strong> <div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code>tmux attach <span class="nt">-t</span> workflow
</code></pre></div> </div> </li> <li><strong>Kill a finished session:</strong> <div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code>tmux kill-session <span class="nt">-t</span> workflow
</code></pre></div> </div> </li> </ul> <blockquote> <p><strong>Pro Tip:</strong> Always launch <code class="language-plaintext highlighter-rouge">tmux</code> on a login node <em>before</em> requesting an interactive compute session (<code class="language-plaintext highlighter-rouge">srun</code> or <code class="language-plaintext highlighter-rouge">qsub</code>). If your Wi-Fi drops mid-job, your interactive compute node allocation stays alive!</p> </blockquote> <h2 id="2-searching-fast-with-find-and-grep">2. Searching Fast with <code class="language-plaintext highlighter-rouge">find</code> and <code class="language-plaintext highlighter-rouge">grep</code></h2> <p>When running multi-job workflows, manual file inspection breaks down fast. Combining <code class="language-plaintext highlighter-rouge">find</code> (to locate files) and <code class="language-plaintext highlighter-rouge">grep</code> (to search file text) lets you audit log directories in seconds.</p> <h3 id="locate-specific-files-with-find">Locate Specific Files with <code class="language-plaintext highlighter-rouge">find</code></h3> <p>Locate files by name, age, or extension across deep directory hierarchies:</p> <div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Find all error logs modified in the last 24 hours</span>
find ./logs/ <span class="nt">-name</span> <span class="s2">"*.err"</span> <span class="nt">-mtime</span> <span class="nt">-1</span>

<span class="c"># Find all Singularity image files in your scratch space</span>
find /scratch/<span class="nv">$USER</span> <span class="nt">-name</span> <span class="s2">"*.sif"</span>
</code></pre></div></div> <h3 id="search-text-inside-logs-with-grep">Search Text Inside Logs with <code class="language-plaintext highlighter-rouge">grep</code></h3> <p>Search through hundreds of output files without opening them individually:</p> <div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Search recursively (-r) for "OutOfMemory", displaying line numbers (-n)</span>
<span class="nb">grep</span> <span class="nt">-rn</span> <span class="s2">"OutOfMemory"</span> ./logs/

<span class="c"># Case-insensitive search (-i) across all .err files</span>
<span class="nb">grep</span> <span class="nt">-i</span> <span class="s2">"error"</span> slurm-<span class="k">*</span>.err
</code></pre></div></div> <h3 id="combine-both-tools">Combine Both Tools</h3> <p>Pass matching files directly into <code class="language-plaintext highlighter-rouge">grep</code> using the <code class="language-plaintext highlighter-rouge">-exec</code> flag:</p> <div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code>find ./logs/ <span class="nt">-name</span> <span class="s2">"job_*.out"</span> <span class="nt">-exec</span> <span class="nb">grep</span> <span class="nt">-H</span> <span class="s2">"FAILED"</span> <span class="o">{}</span> +
</code></pre></div></div> <h2 id="3-shell-shortcuts-custom-aliases-in-bashrc">3. Shell Shortcuts: Custom Aliases in <code class="language-plaintext highlighter-rouge">~/.bashrc</code></h2> <p>If you find yourself typing the same long cluster paths or complex monitoring commands every day, automate them using <strong>shell aliases</strong>.</p> <p>An alias is a custom keyword mapped to a longer shell command. By adding aliases to your shell configuration file (<code class="language-plaintext highlighter-rouge">~/.bashrc</code>), they load automatically every time you log in.</p> <h3 id="useful-hpc-aliases-to-add-to-bashrc">Useful HPC Aliases to Add to <code class="language-plaintext highlighter-rouge">~/.bashrc</code>:</h3> <div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Open ~/.bashrc in your favorite editor (e.g., nano ~/.bashrc) and add:</span>

<span class="c"># Fast directory navigation</span>
<span class="nb">alias </span><span class="nv">myscratch</span><span class="o">=</span><span class="s1">'cd /scratch/$USER'</span>
<span class="nb">alias </span><span class="nv">myproject</span><span class="o">=</span><span class="s1">'cd /project/labname/$USER'</span>

<span class="c"># Quick scheduler status checks</span>
<span class="nb">alias </span><span class="nv">sq</span><span class="o">=</span><span class="s1">'squeue -u $USER'</span>
<span class="nb">alias </span><span class="nv">sqstat</span><span class="o">=</span><span class="s1">'squeue --format="%.18i %.9P %.12j %.8u %.2t %.10M %.6D %R"'</span>

<span class="c"># Request a standard 2-hour interactive compute session</span>
<span class="nb">alias </span><span class="nv">devnode</span><span class="o">=</span><span class="s1">'srun --cpus-per-task=4 --mem=16G --time=02:00:00 --pty bash'</span>

<span class="c"># Colorized log checking</span>
<span class="nb">alias </span><span class="nv">tailerr</span><span class="o">=</span><span class="s1">'tail -n 50 -f *.err'</span>
</code></pre></div></div> <p>After editing <code class="language-plaintext highlighter-rouge">~/.bashrc</code>, apply the changes immediately by running:</p> <div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">source</span> ~/.bashrc
</code></pre></div></div> <hr/> <h2 id="summary-the-shell-survival-checklist">Summary: The Shell Survival Checklist</h2> <ol> <li><strong>Never run critical interactive tasks in a bare SSH shell.</strong> Wrap long interactive sessions inside <code class="language-plaintext highlighter-rouge">tmux</code> so network drops won’t kill your progress.</li> <li><strong>Use <code class="language-plaintext highlighter-rouge">grep -rn</code> to debug log folders instantly.</strong> Scan entire directories for error keywords without opening files one by one.</li> <li><strong>Use <code class="language-plaintext highlighter-rouge">find</code> to hunt down abandoned files.</strong> Clean up old scratch files and large core dumps to keep your storage quota under control.</li> <li><strong>Customize <code class="language-plaintext highlighter-rouge">~/.bashrc</code> with shortcuts.</strong> Create aliases for your common cluster paths, job status checks, and interactive node requests.</li> </ol>]]></content><author><name>Cooperative Computing Lab</name></author><category term="technical-articles"/><category term="hpc"/><category term="linux"/><category term="bash"/><category term="tmux"/><category term="terminal"/><summary type="html"><![CDATA[Keep your remote sessions alive across laptop disconnects, search massive log directories instantly, and save hours with custom shell shortcuts.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://ccl.cse.nd.edu/assets/blog/2026/shell-survival-skills/Beginner&apos;s%20Guide%20to%20HPC.png"/><media:content medium="image" url="https://ccl.cse.nd.edu/assets/blog/2026/shell-survival-skills/Beginner&apos;s%20Guide%20to%20HPC.png" xmlns:media="http://search.yahoo.com/mrss/"/></entry><entry><title type="html">How to Read HPC Error Logs (And What Common Failures Actually Mean)</title><link href="https://ccl.cse.nd.edu/blog/2026/how-to-read-hpc-error-logs/" rel="alternate" type="text/html" title="How to Read HPC Error Logs (And What Common Failures Actually Mean)"/><published>2026-07-29T17:00:00+00:00</published><updated>2026-07-29T17:00:00+00:00</updated><id>https://ccl.cse.nd.edu/blog/2026/how-to-read-hpc-error-logs</id><content type="html" xml:base="https://ccl.cse.nd.edu/blog/2026/how-to-read-hpc-error-logs/"><![CDATA[<div class="row justify-content-sm-center"> <div class="col-sm-12"> <figure> <picture> <source class="responsive-img-srcset" srcset="/assets/blog/2026/how-to-read-hpc-error-logs/Beginner's%20Guide%20to%20HPC-480.webp 480w,/assets/blog/2026/how-to-read-hpc-error-logs/Beginner's%20Guide%20to%20HPC-800.webp 800w,/assets/blog/2026/how-to-read-hpc-error-logs/Beginner's%20Guide%20to%20HPC-1400.webp 1400w," type="image/webp" sizes="95vw"/> <img src="/assets/blog/2026/how-to-read-hpc-error-logs/Beginner's%20Guide%20to%20HPC.png" class="img-fluid rounded z-depth-1" width="100%" height="auto" title="" data-zoomable="" loading="lazy" onerror="this.onerror=null; $('.responsive-img-srcset').remove();"/> </picture> </figure> </div> </div> <p>You submit a batch job, wait in the queue, and suddenly see its status transition to <code class="language-plaintext highlighter-rouge">FAILED</code> or <code class="language-plaintext highlighter-rouge">HOLD</code>. When you open your output directory, you are greeted by a 200-line wall of obscure error messages, memory dumps, and cryptic exit codes.</p> <p>It is a classic high-performance computing friction point: feeling overwhelmed by stack traces and assuming something catastrophic went wrong. But <strong>HPC error logs are structured breadcrumbs, not punishments.</strong> Once you know where your scheduler writes these files and how to parse the output, identifying the root cause takes seconds across any Workload Manager—whether your cluster uses <strong>SLURM</strong>, <strong>Univa Grid Engine (UGE / SGE)</strong>, or <strong>HTCondor</strong>.</p> <h2 id="standard-output-vs-standard-error-vs-event-logs">Standard Output vs. Standard Error vs. Event Logs</h2> <p>When running non-interactive batch jobs, system output streams split into separate files depending on your workload manager:</p> <ul> <li><strong>Standard Output (<code class="language-plaintext highlighter-rouge">.out</code> / stdout):</strong> Reserved for standard runtime logs, progress bars, <code class="language-plaintext highlighter-rouge">print()</code> statements, and calculation results.</li> <li><strong>Standard Error (<code class="language-plaintext highlighter-rouge">.err</code> / stderr):</strong> Reserved for system warnings, thrown exceptions, segmentation faults, and library errors.</li> <li><strong>Workflow Event Log (<code class="language-plaintext highlighter-rouge">.log</code>):</strong> Unique to schedulers like <strong>HTCondor</strong>, this file records lifecycle events managed by the scheduler itself (e.g., job submission, node assignment, resource tracking, and hold reasons).</li> </ul> <p>Here is how you define these log files across the three major schedulers:</p> <h3 id="slurm-sub--sh">SLURM (<code class="language-plaintext highlighter-rouge">.sub</code> / <code class="language-plaintext highlighter-rouge">.sh</code>)</h3> <div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">#SBATCH --output=my_job_%j.out</span>
<span class="c">#SBATCH --error=my_job_%j.err</span>
</code></pre></div></div> <p><em>(Where <code class="language-plaintext highlighter-rouge">%j</code> inserts the unique SLURM Job ID).</em></p> <h3 id="univa-grid-engine--sge-sub--sh">Univa Grid Engine / SGE (<code class="language-plaintext highlighter-rouge">.sub</code> / <code class="language-plaintext highlighter-rouge">.sh</code>)</h3> <div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">#$ -o my_job_$JOB_ID.out</span>
<span class="c">#$ -e my_job_$JOB_ID.err</span>
</code></pre></div></div> <p><em>(Where <code class="language-plaintext highlighter-rouge">$JOB_ID</code> inserts the unique Grid Engine Job ID).</em></p> <h3 id="htcondor-submit">HTCondor (<code class="language-plaintext highlighter-rouge">.submit</code>)</h3> <div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>output = my_job_$(Cluster).out
error  = my_job_$(Cluster).err
log    = my_job_$(Cluster).log
</code></pre></div></div> <p><em>(Where <code class="language-plaintext highlighter-rouge">$(Cluster)</code> represents the HTCondor Cluster/Job ID).</em></p> <p>When a job fails, <strong>always inspect the <code class="language-plaintext highlighter-rouge">.err</code> file first</strong> (and check the <code class="language-plaintext highlighter-rouge">.log</code> file if you are using HTCondor).</p> <h2 id="reading-traces-top-to-bottom-vs-bottom-to-top">Reading Traces: Top-to-Bottom vs. Bottom-to-Top</h2> <p>Reading an error log sequentially from line 1 to line 200 is often a waste of time. Different programming languages and runtime tools print stack traces in entirely different directions.</p> <h3 id="python-read-bottom-to-top">Python: Read Bottom-to-Top</h3> <p>Python prints error traces chronologically, meaning the actual fatal exception is always printed at the <strong>very bottom</strong> of the trace.</p> <ul> <li><strong>The Strategy:</strong> Scroll directly to the final line of the <code class="language-plaintext highlighter-rouge">.err</code> file to identify the exact error type (e.g., <code class="language-plaintext highlighter-rouge">KeyError</code>, <code class="language-plaintext highlighter-rouge">IndexError</code>, <code class="language-plaintext highlighter-rouge">ModuleNotFoundError</code>). Once you know <em>what</em> failed, scan upward to find the line pointing to your script rather than an internal library package.</li> </ul> <h3 id="cc-and-fortran-read-top-to-bottom">C/C++ and Fortran: Read Top-to-Bottom</h3> <p>Compiled languages and build tools log errors chronologically as they are encountered during compilation or execution.</p> <ul> <li><strong>The Strategy:</strong> Start at the <strong>very top</strong> of the error log. The first error printed is almost always the true root cause; the hundreds of lines following it are usually cascading failures triggered by that initial crash.</li> </ul> <h3 id="bash--shell-scripts-read-where-it-stops">Bash / Shell Scripts: Read Where It Stops</h3> <p>By default, Bash scripts continue executing subsequent commands even if an earlier line fails (unless <code class="language-plaintext highlighter-rouge">set -e</code> is enabled).</p> <ul> <li><strong>The Strategy:</strong> Search for the specific command line that failed by scanning upward from where output stopped matching your expected workflow.</li> </ul> <h2 id="decoding-the-usual-suspects-classic-hpc-failures">Decoding the Usual Suspects: Classic HPC Failures</h2> <p>Most cluster job crashes stem from three recurring issues. Recognizing how each scheduler reports these failures allows you to fix them instantly.</p> <h3 id="1-out-of-memory-oom--exit-code-137--job-holds">1. Out Of Memory (OOM) / Exit Code 137 / Job Holds</h3> <ul> <li><strong>The Cause:</strong> Your program tried to consume more RAM than requested. To prevent your job from crashing neighboring processes on a shared node, the system kernel or scheduler terminated your process.</li> <li><strong>How Schedulers Report It:</strong></li> <li><strong>SLURM:</strong> Your <code class="language-plaintext highlighter-rouge">.err</code> file or <code class="language-plaintext highlighter-rouge">sacct -j &lt;job_id&gt;</code> reports exit code <strong><code class="language-plaintext highlighter-rouge">137</code></strong> (128 + Signal 9 <code class="language-plaintext highlighter-rouge">SIGKILL</code>), often accompanied by <code class="language-plaintext highlighter-rouge">slurmstepd: error: Detected allocation failure. OOM Killer invoked.</code></li> <li><strong>UGE / SGE:</strong> The job fails with exit code <code class="language-plaintext highlighter-rouge">137</code>. Running <code class="language-plaintext highlighter-rouge">qacct -j &lt;job_id&gt;</code> or <code class="language-plaintext highlighter-rouge">qstat -j &lt;job_id&gt;</code> shows <code class="language-plaintext highlighter-rouge">failed: 100 : Assumed OS problem</code> or reveals that the job exceeded its specified <code class="language-plaintext highlighter-rouge">maxvmem</code> ceiling.</li> <li> <p><strong>HTCondor:</strong> Rather than exiting outright, HTCondor usually places the job in a <strong><code class="language-plaintext highlighter-rouge">HOLD</code></strong> state (<code class="language-plaintext highlighter-rouge">H</code>). Running <code class="language-plaintext highlighter-rouge">condor_q -hold</code> or checking the <code class="language-plaintext highlighter-rouge">.log</code> file explicitly states: <code class="language-plaintext highlighter-rouge">Job used more memory than requested</code>.</p> </li> <li><strong>The Fix:</strong> Increase the requested memory in your submission script:</li> <li><strong>SLURM:</strong> <code class="language-plaintext highlighter-rouge">#SBATCH --mem=32G</code> (or <code class="language-plaintext highlighter-rouge">#SBATCH --mem-per-cpu=8G</code>)</li> <li><strong>UGE:</strong> <code class="language-plaintext highlighter-rouge">#$ -l h_vmem=32G</code></li> <li><strong>HTCondor:</strong> <code class="language-plaintext highlighter-rouge">request_memory = 32GB</code></li> </ul> <h3 id="2-no-space-left-on-device-or-quota-exceeded">2. “No Space Left on Device” or Quota Exceeded</h3> <ul> <li><strong>The Symptom:</strong> <code class="language-plaintext highlighter-rouge">IOError: [Errno 28] No space left on device</code> or <code class="language-plaintext highlighter-rouge">write error: disk quota exceeded</code>.</li> <li><strong>What it means:</strong> Your script ran out of disk space. This rarely happens on large global storage filesystems (<code class="language-plaintext highlighter-rouge">/scratch</code> or <code class="language-plaintext highlighter-rouge">/project</code>), but frequently occurs when temporary files auto-write to small localized <code class="language-plaintext highlighter-rouge">/tmp</code> partitions or constrained home directories (<code class="language-plaintext highlighter-rouge">/home/username</code>).</li> <li><strong>The Fix:</strong> Redirect temporary directory environment variables to high-capacity scratch space directly inside your job script before running code:</li> </ul> <div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">export </span><span class="nv">TMPDIR</span><span class="o">=</span>/scratch/username/tmp
<span class="nb">export </span><span class="nv">PIP_CACHE_DIR</span><span class="o">=</span>/scratch/username/pip_cache
<span class="nb">mkdir</span> <span class="nt">-p</span> <span class="nv">$TMPDIR</span> <span class="nv">$PIP_CACHE_DIR</span>
</code></pre></div></div> <p><em>(In HTCondor, you can also request dedicated local scratch disk space via <code class="language-plaintext highlighter-rouge">request_disk = 50GB</code> in your submit file).</em></p> <h3 id="3-command-not-found-or-modulenotfounderror">3. “Command Not Found” or “ModuleNotFoundError”</h3> <ul> <li><strong>The Symptom:</strong> <code class="language-plaintext highlighter-rouge">bash: line 14: gfortran: command not found</code> or <code class="language-plaintext highlighter-rouge">ModuleNotFoundError: No module named 'torch'</code>.</li> <li><strong>What it means:</strong> Compute nodes start in a clean, isolated environment. They <strong>do not</strong> automatically inherit loaded modules, exported <code class="language-plaintext highlighter-rouge">$PATH</code> variables, or active Conda environments from your login session terminal.</li> <li><strong>The Fix:</strong> Explicitly load system modules and activate virtual environments directly inside your execution script:</li> </ul> <div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Load system modules</span>
module load python/3.11

<span class="c"># Activate your custom environment</span>
<span class="nb">source</span> /scratch/username/envs/my_env/bin/activate

<span class="c"># Execute your application</span>
python3 my_script.py
</code></pre></div></div> <h2 id="quick-scheduler-diagnostic-cheat-sheet">Quick Scheduler Diagnostic Cheat Sheet</h2> <p>When a job finishes or fails unexpectedly, use these diagnostic commands to query job metadata and exit status:</p> <table> <thead> <tr> <th>Scheduler</th> <th>Query Live / Held Jobs</th> <th>Query Finished / Failed Job History</th> </tr> </thead> <tbody> <tr> <td><strong>SLURM</strong></td> <td><code class="language-plaintext highlighter-rouge">squeue -u $USER</code></td> <td><code class="language-plaintext highlighter-rouge">sacct -j &lt;job_id&gt; --format=JobID,State,ExitCode,MaxRSS</code></td> </tr> <tr> <td><strong>UGE / SGE</strong></td> <td><code class="language-plaintext highlighter-rouge">qstat -j &lt;job_id&gt;</code></td> <td><code class="language-plaintext highlighter-rouge">qacct -j &lt;job_id&gt;</code></td> </tr> <tr> <td><strong>HTCondor</strong></td> <td><code class="language-plaintext highlighter-rouge">condor_q -hold</code></td> <td><code class="language-plaintext highlighter-rouge">condor_history &lt;job_id&gt;</code></td> </tr> </tbody> </table> <hr/> <h2 id="the-log-parsing-checklist">The Log Parsing Checklist</h2> <p>Before reaching out to cluster administrators or teammates for help with a broken job, run through these steps:</p> <ol> <li><strong>Locate the standard error log (<code class="language-plaintext highlighter-rouge">.err</code>).</strong> For HTCondor, inspect the workflow <code class="language-plaintext highlighter-rouge">.log</code> file as well for scheduler-level events.</li> <li><strong>Determine the language direction.</strong> Read Python errors from the <strong>bottom up</strong>; read C/C++ build failures or shell errors from the <strong>top down</strong>.</li> <li><strong>Use scheduler diagnostics.</strong> Check <code class="language-plaintext highlighter-rouge">sacct</code> (SLURM), <code class="language-plaintext highlighter-rouge">qacct</code> (UGE), or <code class="language-plaintext highlighter-rouge">condor_q -hold</code> (HTCondor) to verify exit codes and memory usage.</li> <li><strong>Identify resource limits.</strong> An exit status of <strong>137</strong> or a memory hold reason means your job needs a higher memory allocation.</li> <li><strong>Set explicit pathing.</strong> Ensure all <code class="language-plaintext highlighter-rouge">module load</code> commands, <code class="language-plaintext highlighter-rouge">TMPDIR</code> paths, and environment activations are written explicitly inside your job submission file.</li> </ol>]]></content><author><name>Cooperative Computing Lab</name></author><category term="technical-articles"/><category term="hpc"/><category term="debugging"/><category term="slurm"/><category term="uge"/><category term="htcondor"/><category term="linux"/><summary type="html"><![CDATA[Don't panic when your batch job crashes. Here is how to locate log files, decode exit codes, and debug failures across SLURM, Univa Grid Engine (UGE), and HTCondor.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://ccl.cse.nd.edu/assets/blog/2026/how-to-read-hpc-error-logs/Beginner&apos;s%20Guide%20to%20HPC.png"/><media:content medium="image" url="https://ccl.cse.nd.edu/assets/blog/2026/how-to-read-hpc-error-logs/Beginner&apos;s%20Guide%20to%20HPC.png" xmlns:media="http://search.yahoo.com/mrss/"/></entry><entry><title type="html">Interactive Computing: Jupyter Notebooks and VS Code on Compute Nodes</title><link href="https://ccl.cse.nd.edu/blog/2026/interactive-computing/" rel="alternate" type="text/html" title="Interactive Computing: Jupyter Notebooks and VS Code on Compute Nodes"/><published>2026-07-22T17:00:00+00:00</published><updated>2026-07-22T17:00:00+00:00</updated><id>https://ccl.cse.nd.edu/blog/2026/interactive-computing</id><content type="html" xml:base="https://ccl.cse.nd.edu/blog/2026/interactive-computing/"><![CDATA[<div class="row justify-content-sm-center"> <div class="col-sm-12"> <figure> <picture> <source class="responsive-img-srcset" srcset="/assets/blog/2026/interactive-computing/hero-image-480.webp 480w,/assets/blog/2026/interactive-computing/hero-image-800.webp 800w,/assets/blog/2026/interactive-computing/hero-image-1400.webp 1400w," type="image/webp" sizes="95vw"/> <img src="/assets/blog/2026/interactive-computing/hero-image.png" class="img-fluid rounded z-depth-1" width="100%" height="auto" title="" data-zoomable="" loading="lazy" onerror="this.onerror=null; $('.responsive-img-srcset').remove();"/> </picture> </figure> </div> </div> <p>Developing code locally inside a Jupyter Notebook or stepping through lines of Python with VS Code’s debugger is a fast, intuitive way to work. But when your local machine runs out of RAM, CPU cores, or GPU memory, you pack up your workflow and move to a High-Performance Computing (HPC) cluster.</p> <p>Once there, many researchers hit an immediate friction point: clusters are traditionally built around non-interactive batch scripts submitted to job schedulers like SLURM or Grid Engine. Switching from an interactive graphical editor back to pure command-line scripts and print-statement debugging can feel like stepping backward in time.</p> <p>Fortunately, you don’t have to give up your interactive tools to use a supercomputer. You just need to know how to bridge local GUIs with remote cluster compute—<strong>without breaking cluster rules.</strong></p> <h2 id="the-cardinal-sin-running-servers-on-shared-login-nodes">The Cardinal Sin: Running Servers on Shared Login Nodes</h2> <p>When you SSH into a cluster, you land on a <strong>login node</strong> (or head node). Think of the login node as a shared front porch. It is meant exclusively for light administrative tasks: editing text files, organizing directory trees, checking queue status, and submitting job scripts.</p> <p>The most common mistake new cluster users make is running <code class="language-plaintext highlighter-rouge">jupyter notebook</code> or connecting VS Code’s Remote-SSH plugin directly to the login node.</p> <h3 id="why-this-breaks-the-cluster">Why this breaks the cluster:</h3> <ul> <li><strong>VS Code Server (<code class="language-plaintext highlighter-rouge">.vscode-server</code>)</strong> spins up background Node.js processes, language servers, file watchers, and extension host daemons that constantly index workspace directories.</li> <li><strong>Jupyter Notebooks</strong> execute heavy data manipulation, model training, and plotting live inside the server process.</li> </ul> <p>Login nodes are shared simultaneously by hundreds of users. When an interactive server process starts hogging gigabytes of RAM and maxing out CPU cores, the entire command-line interface bogs down for everyone else. To prevent system crashes, administrators install automated automated watcher scripts that will abruptly <strong>kill any long-running or high-memory user process on a login node.</strong></p> <p>To run these tools properly, your server processes <strong>must run on a compute node.</strong></p> <h2 id="strategy-1-ssh-port-forwarding-ssh--l">Strategy 1: SSH Port Forwarding (<code class="language-plaintext highlighter-rouge">ssh -L</code>)</h2> <p>If you want to run Jupyter or VS Code manually, you can use <strong>SSH Local Port Forwarding</strong> (<code class="language-plaintext highlighter-rouge">ssh -L</code>). This technique creates a secure tunnel between a port on your local laptop, through the login node, and directly into an active compute node.</p> <h3 id="step-1-request-an-interactive-compute-session">Step 1: Request an Interactive Compute Session</h3> <p>Before launching any server, request a temporary allocation on a compute node using your cluster’s scheduler:</p> <div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Request 2 CPU cores, 16GB RAM, and 2 hours on SLURM</span>
srun <span class="nt">--tasks</span><span class="o">=</span>1 <span class="nt">--cpus-per-task</span><span class="o">=</span>2 <span class="nt">--mem</span><span class="o">=</span>16G <span class="nt">--time</span><span class="o">=</span>02:00:00 <span class="nt">--pty</span> bash
</code></pre></div></div> <p>Once your shell transfers you to a compute node, take note of the node’s hostname (e.g., <code class="language-plaintext highlighter-rouge">node042.cluster.internal</code>).</p> <h3 id="step-2-launch-the-server-on-the-compute-node">Step 2: Launch the Server on the Compute Node</h3> <p>Start your Jupyter server on the compute node, making sure to disable automatic browser opening:</p> <div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Load your Python module or activate your Conda environment first</span>
module load python
jupyter notebook <span class="nt">--no-browser</span> <span class="nt">--port</span><span class="o">=</span>8888
</code></pre></div></div> <p>Terminal output will provide a URL containing a security token (e.g., <code class="language-plaintext highlighter-rouge">http://localhost:8888/?token=a1b2c3d4...</code>).</p> <h3 id="step-3-establish-the-ssh-tunnel-from-your-local-laptop">Step 3: Establish the SSH Tunnel from Your Local Laptop</h3> <p>Open a <strong>new terminal tab on your local laptop</strong> (not on the cluster) and set up the tunnel using <code class="language-plaintext highlighter-rouge">ssh -L</code>:</p> <div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Syntax: ssh -L [Local_Port]:[Compute_Node_Hostname]:[Remote_Port] [Username]@[Login_Node]</span>
ssh <span class="nt">-L</span> 8888:node042.cluster.internal:8888 netid@cluster.university.edu
</code></pre></div></div> <p>This command forwards traffic from your laptop’s local <code class="language-plaintext highlighter-rouge">localhost:8888</code> through the login node jump host directly to port <code class="language-plaintext highlighter-rouge">8888</code> on compute <code class="language-plaintext highlighter-rouge">node042</code>.</p> <h3 id="step-4-access-the-interface">Step 4: Access the Interface</h3> <p>Open your local web browser and navigate to <code class="language-plaintext highlighter-rouge">http://localhost:8888</code>. Paste the security token generated in Step 2, and you now have a full Jupyter GUI running on dedicated cluster hardware!</p> <blockquote> <p><strong>VS Code Remote Tip:</strong> When using VS Code’s Remote SSH extension on shared systems, home directory file locking can sometimes break connections. Refer to resources like <a href="https://docs.crc.nd.edu/general_pages/v/vscode.html">Notre Dame’s CRC VS Code Documentation</a> for cluster-specific settings, such as enabling <strong>“Lockfiles In Tmp”</strong> in your extension settings to ensure seamless reconnects.</p> </blockquote> <h2 id="strategy-2-open-ondemand-the-modern-web-portal">Strategy 2: Open OnDemand (The Modern Web Portal)</h2> <p>Setting up SSH tunnels manually works well, but it requires managing port numbers, tokens, and multiple terminal windows. Many modern HPC centers simplify this entirely by deploying <strong>Open OnDemand (OOD)</strong>.</p> <p>Open OnDemand is an open-source, web-based portal that gives you graphical access to cluster resources straight through a web browser without needing any local SSH configuration or command-line tunneling.</p> <h3 id="how-open-ondemand-works">How Open OnDemand Works:</h3> <ol> <li><strong>Log in via Web Browser:</strong> Navigate to your university’s Open OnDemand URL (e.g., <code class="language-plaintext highlighter-rouge">ondemand.crc.nd.edu</code>) and authenticate with your institutional login.</li> <li><strong>Select an Interactive App:</strong> Choose <strong>Jupyter</strong>, <strong>VS Code</strong>, <strong>RStudio</strong>, or <strong>MATLAB</strong> from the interactive applications menu.</li> <li><strong>Configure Your Resource Allocation:</strong> A form will ask you to specify your required resources (number of CPUs, GPUs, RAM amount, and maximum runtime).</li> <li><strong>Launch:</strong> Click <strong>Launch</strong>.</li> </ol> <p>Under the hood, Open OnDemand automatically writes a job script, submits it to the cluster scheduler (SLURM/Grid Engine), waits for a compute node to be allocated, launches the server process, builds a secure web proxy, and presents a <strong>“Connect”</strong> button in your browser window.</p> <p>Because Open OnDemand routes all compute through scheduled jobs, you get the full speed of dedicated compute hardware and GPUs without violating cluster usage policies or risking process kills on login nodes.</p> <hr/> <h2 id="summary-the-interactive-computing-checklist">Summary: The Interactive Computing Checklist</h2> <p>Interactive development and HPC compute can easily coexist if you follow these rules:</p> <ol> <li><strong>Never run Jupyter Notebooks or VS Code Server processes on login nodes.</strong> Keep login nodes clean for light editing and job submission.</li> <li><strong>Check for Open OnDemand first.</strong> If your site hosts an Open OnDemand portal, use it for one-click interactive web sessions.</li> <li><strong>Allocate compute nodes before launching servers manually.</strong> Always start with an interactive job allocation (<code class="language-plaintext highlighter-rouge">srun</code> or <code class="language-plaintext highlighter-rouge">qsub</code>).</li> <li><strong>Tunnel securely with <code class="language-plaintext highlighter-rouge">ssh -L</code>.</strong> Forward local ports through the login host to the specific compute node hosting your active server.</li> <li><strong>Clean up when finished.</strong> Terminate your interactive compute sessions and close notebook servers when you finish working so cluster resources return to the queue for other researchers.</li> </ol>]]></content><author><name>Cooperative Computing Lab</name></author><category term="technical-articles"/><category term="hpc"/><category term="vscode"/><category term="jupyter"/><category term="open-ondemand"/><category term="ssh"/><summary type="html"><![CDATA[Bridge the gap between local, GUI-based development and remote cluster compute without crashing login nodes or violating HPC policies.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://ccl.cse.nd.edu/assets/blog/2026/interactive-computing/hero-image.png"/><media:content medium="image" url="https://ccl.cse.nd.edu/assets/blog/2026/interactive-computing/hero-image.png" xmlns:media="http://search.yahoo.com/mrss/"/></entry></feed>