<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>User Guide on IOPS</title><link>https://iops.gitlabpages.inria.fr/user-guide/</link><description>Recent content in User Guide on IOPS</description><generator>Hugo</generator><language>en-us</language><atom:link href="https://iops.gitlabpages.inria.fr/user-guide/index.xml" rel="self" type="application/rss+xml"/><item><title>IOPS YAML Format Reference</title><link>https://iops.gitlabpages.inria.fr/user-guide/yaml-schema/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://iops.gitlabpages.inria.fr/user-guide/yaml-schema/</guid><description>&lt;p>&lt;em>Complete guide to the IOPS benchmark configuration format&lt;/em>&lt;/p>
&lt;hr>
&lt;h2 id="table-of-contents">Table of Contents&lt;/h2>
&lt;ol>
&lt;li>&lt;a href="#file-structure-overview">File Structure Overview&lt;/a>&lt;/li>
&lt;li>&lt;a href="#benchmark">&lt;code>benchmark&lt;/code>&lt;/a>&lt;/li>
&lt;li>&lt;a href="#vars">&lt;code>vars&lt;/code>&lt;/a>&lt;/li>
&lt;li>&lt;a href="#constraints-optional">&lt;code>constraints&lt;/code> (optional)&lt;/a>&lt;/li>
&lt;li>&lt;a href="#command">&lt;code>command&lt;/code>&lt;/a>&lt;/li>
&lt;li>&lt;a href="#scripts">&lt;code>scripts&lt;/code>&lt;/a>&lt;/li>
&lt;li>&lt;a href="#output">&lt;code>output&lt;/code>&lt;/a>&lt;/li>
&lt;li>&lt;a href="#reporting-optional">&lt;code>reporting&lt;/code> (optional)&lt;/a>&lt;/li>
&lt;li>&lt;a href="#hooks-optional">&lt;code>hooks&lt;/code> (optional)&lt;/a>&lt;/li>
&lt;li>&lt;a href="#machines-optional">&lt;code>machines&lt;/code> (optional)&lt;/a>&lt;/li>
&lt;/ol>
&lt;p>See also: &lt;a href="../templating-and-context">Templating and Context Reference&lt;/a> for Jinja2 syntax, dynamic values, conditionals, and context variables.&lt;/p>
&lt;hr>
&lt;h2 id="file-structure-overview">File Structure Overview&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">benchmark&lt;/span>: &lt;span style="color:#75715e"># Global configuration (name, workdir, executor, search method)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">vars&lt;/span>: &lt;span style="color:#75715e"># Variable definitions (swept and derived)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">constraints&lt;/span>: &lt;span style="color:#75715e"># (Optional) Parameter validation rules&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">command&lt;/span>: &lt;span style="color:#75715e"># Command template and labels&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">scripts&lt;/span>: &lt;span style="color:#75715e"># Execution scripts and parsers&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">output&lt;/span>: &lt;span style="color:#75715e"># Output configuration (CSV, Parquet, SQLite)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">reporting&lt;/span>: &lt;span style="color:#75715e"># (Optional) Report generation settings&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">hooks&lt;/span>: &lt;span style="color:#75715e"># (Optional) Commands fired on run events&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">machines&lt;/span>: &lt;span style="color:#75715e"># (Optional) Per-machine config overrides&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>Required sections:&lt;/strong> &lt;code>benchmark&lt;/code>, &lt;code>vars&lt;/code>, &lt;code>command&lt;/code>, &lt;code>scripts&lt;/code>, &lt;code>output&lt;/code>&lt;/p></description></item><item><title>Templating and Context Reference</title><link>https://iops.gitlabpages.inria.fr/user-guide/templating-and-context/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://iops.gitlabpages.inria.fr/user-guide/templating-and-context/</guid><description>&lt;p>IOPS uses Jinja2 templating throughout the configuration to enable dynamic values, conditional logic, and computed expressions. This guide covers both the Jinja2 syntax and the context variables available in each configuration section.&lt;/p>
&lt;hr>
&lt;h2 id="table-of-contents">Table of Contents&lt;/h2>
&lt;ol>
&lt;li>&lt;a href="#overview">Overview&lt;/a>&lt;/li>
&lt;li>&lt;a href="#jinja2-syntax-reference">Jinja2 Syntax Reference&lt;/a>
&lt;ul>
&lt;li>&lt;a href="#variable-substitution">Variable Substitution&lt;/a>&lt;/li>
&lt;li>&lt;a href="#conditionals">Conditionals&lt;/a>&lt;/li>
&lt;li>&lt;a href="#loops">Loops&lt;/a>&lt;/li>
&lt;li>&lt;a href="#filters">Filters&lt;/a>&lt;/li>
&lt;li>&lt;a href="#expressions">Expressions&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="#context-by-configuration-section">Context by Configuration Section&lt;/a>
&lt;ul>
&lt;li>&lt;a href="#commandtemplate">command.template&lt;/a>&lt;/li>
&lt;li>&lt;a href="#commandenv">command.env&lt;/a>&lt;/li>
&lt;li>&lt;a href="#scriptsscript_template">scripts[].script_template&lt;/a>&lt;/li>
&lt;li>&lt;a href="#scriptspostscript">scripts[].post.script&lt;/a>&lt;/li>
&lt;li>&lt;a href="#scriptsparserfile">scripts[].parser.file&lt;/a>&lt;/li>
&lt;li>&lt;a href="#scriptsparserparser_script">scripts[].parser.parser_script&lt;/a>&lt;/li>
&lt;li>&lt;a href="#varsexpr">vars[].expr&lt;/a>&lt;/li>
&lt;li>&lt;a href="#outputsinkpath">output.sink.path&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="#complete-example">Complete Example&lt;/a>&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="overview">Overview&lt;/h2>
&lt;h3 id="template-support-by-field">Template Support by Field&lt;/h3>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Field&lt;/th>
 &lt;th>Jinja2 Support&lt;/th>
 &lt;th>File Path Support&lt;/th>
 &lt;th>Inline Support&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>command.template&lt;/code>&lt;/td>
 &lt;td>Yes&lt;/td>
 &lt;td>No&lt;/td>
 &lt;td>Yes&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>command.env&lt;/code> values&lt;/td>
 &lt;td>Yes&lt;/td>
 &lt;td>No&lt;/td>
 &lt;td>Yes&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>scripts[].script_template&lt;/code>&lt;/td>
 &lt;td>Yes&lt;/td>
 &lt;td>Yes&lt;/td>
 &lt;td>Yes&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>scripts[].post.script&lt;/code>&lt;/td>
 &lt;td>Yes&lt;/td>
 &lt;td>Yes&lt;/td>
 &lt;td>Yes&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>scripts[].parser.file&lt;/code>&lt;/td>
 &lt;td>Yes&lt;/td>
 &lt;td>No&lt;/td>
 &lt;td>Yes&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>scripts[].parser.parser_script&lt;/code>&lt;/td>
 &lt;td>&lt;strong>No&lt;/strong>&lt;/td>
 &lt;td>Yes&lt;/td>
 &lt;td>Yes&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>vars[].expr&lt;/code>&lt;/td>
 &lt;td>Yes&lt;/td>
 &lt;td>No&lt;/td>
 &lt;td>Yes&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>output.sink.path&lt;/code>&lt;/td>
 &lt;td>Yes&lt;/td>
 &lt;td>No&lt;/td>
 &lt;td>Yes&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>hooks[].command&lt;/code>&lt;/td>
 &lt;td>Yes (own context, see &lt;a href="../hooks#command-context">Hooks&lt;/a>)&lt;/td>
 &lt;td>No&lt;/td>
 &lt;td>Yes&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h3 id="standard-context-variables">Standard Context Variables&lt;/h3>
&lt;p>These variables are available in all Jinja2 templates:&lt;/p></description></item><item><title>Writing Scripts</title><link>https://iops.gitlabpages.inria.fr/user-guide/writing-scripts/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://iops.gitlabpages.inria.fr/user-guide/writing-scripts/</guid><description>&lt;p>The &lt;code>scripts[]&lt;/code> section of your YAML tells IOPS &lt;em>how&lt;/em> to launch your benchmark. IOPS owns the parameter sweep and the result database; you own the shell script that actually runs the workload. This page is the practical guide to writing scripts; for the schema (every field, every option), see &lt;a href="../yaml-schema/#scripts">YAML Schema Reference / scripts&lt;/a>.&lt;/p>
&lt;hr>
&lt;h2 id="why-you-need-a-script-template">Why You Need a Script Template&lt;/h2>
&lt;p>IOPS does not assume anything about how your benchmark is launched: some benchmarks are a single executable, others need MPI launchers, module loads, environment setup, or pre-flight checks. The &lt;code>script_template&lt;/code> is the bridge: a Jinja2-rendered shell script that IOPS materializes to disk and hands to the configured executor. Per test execution, IOPS writes it to &lt;code>&amp;lt;execution_dir&amp;gt;/run_&amp;lt;name&amp;gt;.sh&lt;/code> so you can inspect (or rerun) exactly what was executed.&lt;/p></description></item><item><title>Writing Parsers</title><link>https://iops.gitlabpages.inria.fr/user-guide/writing-parsers/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://iops.gitlabpages.inria.fr/user-guide/writing-parsers/</guid><description>&lt;p>IOPS does not know the output format of your benchmark. Instead, you provide a small Python script (the &lt;strong>parser&lt;/strong>) that reads whatever your benchmark produces and returns the metrics you care about. This page explains how parsers work, how to write one, and where the extracted data ends up.&lt;/p>
&lt;hr>
&lt;h2 id="how-it-works">How It Works&lt;/h2>
&lt;p>Every benchmark writes its results differently: JSON files, plain text logs, CSV tables, binary formats. The parser is the bridge between raw benchmark output and structured data that IOPS can store, plot, and analyze. After each execution completes, IOPS runs it through this sequence:&lt;/p></description></item><item><title>Execution Matrix Generation</title><link>https://iops.gitlabpages.inria.fr/user-guide/matrix-generation/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://iops.gitlabpages.inria.fr/user-guide/matrix-generation/</guid><description>&lt;p>&lt;em>How IOPS builds the parameter space from your variable definitions&lt;/em>&lt;/p>
&lt;hr>
&lt;h2 id="overview">Overview&lt;/h2>
&lt;p>IOPS generates an &lt;strong>execution matrix&lt;/strong> from your variable definitions; each row is a unique parameter combination to test.&lt;/p>
&lt;pre tabindex="0">&lt;code>vars: Execution Matrix:
 nodes: [1, 2] → | nodes | threads |
 threads: [4, 8] | 1 | 4 |
 | 1 | 8 |
 | 2 | 4 |
 | 2 | 8 |
&lt;/code>&lt;/pre>&lt;hr>
&lt;h2 id="variable-types">Variable Types&lt;/h2>
&lt;h3 id="swept-variables">Swept Variables&lt;/h3>
&lt;p>Variables with &lt;code>sweep&lt;/code> define the parameter space. IOPS creates a &lt;strong>Cartesian product&lt;/strong> of all swept variables.&lt;/p></description></item><item><title>Search Methods</title><link>https://iops.gitlabpages.inria.fr/user-guide/search-methods/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://iops.gitlabpages.inria.fr/user-guide/search-methods/</guid><description>&lt;p>IOPS supports multiple search strategies for exploring your parameter space, each with different trade-offs between thoroughness and efficiency.&lt;/p>
&lt;h2 id="exhaustive-search">Exhaustive Search&lt;/h2>
&lt;p>Tests all possible parameter combinations. Thorough but expensive for large parameter spaces.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">benchmark&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">search_method&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;exhaustive&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="bayesian-optimization">Bayesian Optimization&lt;/h2>
&lt;p>Uses a surrogate model to explore the parameter space, focusing on promising regions. Default parameters are empirically tuned: with 20 iterations (~7% of search space), Bayesian optimization achieves ~90% of optimal vs ~79% for random search.&lt;/p></description></item><item><title>Bayesian Optimization</title><link>https://iops.gitlabpages.inria.fr/user-guide/bayesian-optimization/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://iops.gitlabpages.inria.fr/user-guide/bayesian-optimization/</guid><description>&lt;p>Bayesian optimization lets IOPS explore a parameter space to find configurations that maximize or minimize a target metric, using far fewer evaluations than exhaustive search. Instead of testing every combination, it builds a surrogate model from observed results and focuses on the most promising regions.&lt;/p>
&lt;h2 id="table-of-contents">Table of Contents&lt;/h2>
&lt;ol>
&lt;li>&lt;a href="#overview">Overview&lt;/a>&lt;/li>
&lt;li>&lt;a href="#basic-configuration">Basic Configuration&lt;/a>&lt;/li>
&lt;li>&lt;a href="#how-iops-implements-bayesian-optimization">How IOPS Implements Bayesian Optimization&lt;/a>
&lt;ul>
&lt;li>&lt;a href="#the-optimization-loop">The optimization loop&lt;/a>&lt;/li>
&lt;li>&lt;a href="#parameter-space-encoding">Parameter space encoding&lt;/a>&lt;/li>
&lt;li>&lt;a href="#nearest-neighbor-mapping">Nearest-neighbor mapping&lt;/a>&lt;/li>
&lt;li>&lt;a href="#feedback-and-metric-aggregation">Feedback and metric aggregation&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="#choosing-a-surrogate-model">Choosing a Surrogate Model&lt;/a>&lt;/li>
&lt;li>&lt;a href="#acquisition-functions">Acquisition Functions&lt;/a>&lt;/li>
&lt;li>&lt;a href="#convergence-and-early-stopping">Convergence and Early Stopping&lt;/a>
&lt;ul>
&lt;li>&lt;a href="#default-behavior">Default behavior&lt;/a>&lt;/li>
&lt;li>&lt;a href="#early-stopping-with-xi-boost">Early stopping with xi boost&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="#combining-with-exhaustive-variables">Combining with Exhaustive Variables&lt;/a>&lt;/li>
&lt;li>&lt;a href="#fallback-to-exhaustive">Fallback to Exhaustive&lt;/a>&lt;/li>
&lt;li>&lt;a href="#configuration-reference">Configuration Reference&lt;/a>&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="overview">Overview&lt;/h2>
&lt;p>Bayesian optimization (BO) is a sequential, model-based strategy for optimizing expensive black-box functions. In benchmarking, each &amp;ldquo;function evaluation&amp;rdquo; is a full benchmark run that may take minutes or hours; BO reduces the number of runs needed by learning from previous results. Use it when runs are expensive and you want the best configuration without testing every combination. Prefer exhaustive or random search when the space is small enough to cover fully, when you need complete coverage for statistical analysis, or when there is no clear optimization target.&lt;/p></description></item><item><title>Adaptive Variables</title><link>https://iops.gitlabpages.inria.fr/user-guide/adaptive-variables/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://iops.gitlabpages.inria.fr/user-guide/adaptive-variables/</guid><description>&lt;p>Adaptive variables let IOPS probe for threshold values by starting at an initial value and progressing until a stop condition is met. Use them to find limits such as maximum problem sizes, memory capacities, or performance cliffs without manually defining the search space.&lt;/p>
&lt;h2 id="table-of-contents">Table of Contents&lt;/h2>
&lt;ol>
&lt;li>&lt;a href="#overview">Overview&lt;/a>&lt;/li>
&lt;li>&lt;a href="#basic-configuration">Basic Configuration&lt;/a>&lt;/li>
&lt;li>&lt;a href="#step-methods">Step Methods&lt;/a>&lt;/li>
&lt;li>&lt;a href="#stop-conditions">Stop Conditions&lt;/a>&lt;/li>
&lt;li>&lt;a href="#direction">Direction&lt;/a>&lt;/li>
&lt;li>&lt;a href="#safety-limits">Safety Limits&lt;/a>&lt;/li>
&lt;li>&lt;a href="#probe-results">Probe Results&lt;/a>&lt;/li>
&lt;li>&lt;a href="#multiple-repetitions">Multiple Repetitions&lt;/a>&lt;/li>
&lt;li>&lt;a href="#combining-with-swept-variables">Combining with Swept Variables&lt;/a>
&lt;ul>
&lt;li>&lt;a href="#how-probes-advance">How probes advance&lt;/a>&lt;/li>
&lt;li>&lt;a href="#multiple-swept-variables">Multiple swept variables&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="#staircase-search-with-an-escalating-variable">Staircase Search with an Escalating Variable&lt;/a>
&lt;ul>
&lt;li>&lt;a href="#how-the-staircase-walks">How the staircase walks&lt;/a>&lt;/li>
&lt;li>&lt;a href="#reading-the-frontier">Reading the frontier&lt;/a>&lt;/li>
&lt;li>&lt;a href="#when-not-to-use-it">When not to use it&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="#complete-example">Complete Example&lt;/a>&lt;/li>
&lt;li>&lt;a href="#constraints">Constraints&lt;/a>
&lt;ul>
&lt;li>&lt;a href="#why-only-one-adaptive-variable">Why only one adaptive variable?&lt;/a>&lt;/li>
&lt;li>&lt;a href="#adaptive-vs-bayesian-optimization">Adaptive vs Bayesian optimization&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="#configuration-reference">Configuration Reference&lt;/a>&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="overview">Overview&lt;/h2>
&lt;p>Unlike swept variables (which test a fixed list of values) or derived variables (which are computed from other variables), an adaptive variable is driven by a feedback loop:&lt;/p></description></item><item><title>Caching</title><link>https://iops.gitlabpages.inria.fr/user-guide/caching/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://iops.gitlabpages.inria.fr/user-guide/caching/</guid><description>&lt;hr>
&lt;h2 id="table-of-contents">Table of Contents&lt;/h2>
&lt;ol>
&lt;li>&lt;a href="#overview">Overview&lt;/a>&lt;/li>
&lt;li>&lt;a href="#configuration">Configuration&lt;/a>
&lt;ul>
&lt;li>&lt;a href="#basic-usage">Basic Usage&lt;/a>&lt;/li>
&lt;li>&lt;a href="#cache-only-mode">Cache-Only Mode&lt;/a>&lt;/li>
&lt;li>&lt;a href="#parameter-hashing">Parameter Hashing&lt;/a>&lt;/li>
&lt;li>&lt;a href="#excluding-variables-from-cache">Excluding Variables from Cache&lt;/a>&lt;/li>
&lt;li>&lt;a href="#cache-schema">Cache Schema&lt;/a>&lt;/li>
&lt;li>&lt;a href="#important-command-changes-are-not-detected">Important: Command Changes Are Not Detected&lt;/a>&lt;/li>
&lt;li>&lt;a href="#what-gets-cached">What Gets Cached&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="#inspecting-the-cache">Inspecting the Cache&lt;/a>&lt;/li>
&lt;li>&lt;a href="#rebuilding-the-cache">Rebuilding the Cache&lt;/a>&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="overview">Overview&lt;/h2>
&lt;p>IOPS caches execution results in SQLite so that tests with identical parameters can be skipped on re-runs. This speeds up iterative development, lets you safely retry failed runs without re-executing successful tests, and handles repetitions correctly (each repetition is cached separately).&lt;/p></description></item><item><title>Machine Overrides</title><link>https://iops.gitlabpages.inria.fr/user-guide/machines/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://iops.gitlabpages.inria.fr/user-guide/machines/</guid><description>&lt;p>Use a single configuration file across multiple systems with per-machine overrides.&lt;/p>
&lt;hr>
&lt;h2 id="table-of-contents">Table of Contents&lt;/h2>
&lt;ol>
&lt;li>&lt;a href="#overview">Overview&lt;/a>&lt;/li>
&lt;li>&lt;a href="#merge-rules">Merge Rules&lt;/a>&lt;/li>
&lt;li>&lt;a href="#configuration">Configuration&lt;/a>&lt;/li>
&lt;li>&lt;a href="#example-local-development--hpc-cluster">Example: Local Development + HPC Cluster&lt;/a>&lt;/li>
&lt;li>&lt;a href="#use-cases">Use Cases&lt;/a>&lt;/li>
&lt;li>&lt;a href="#tips">Tips&lt;/a>&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="overview">Overview&lt;/h2>
&lt;p>The &lt;code>machines&lt;/code> section lets you define per-machine overrides inside a single YAML file. Instead of maintaining separate configs for your laptop, HPC clusters, or cloud instances, write one base config and override only what differs per environment.&lt;/p>
&lt;p>Select the target machine at runtime:&lt;/p></description></item><item><title>Execution Backends</title><link>https://iops.gitlabpages.inria.fr/user-guide/execution-backends/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://iops.gitlabpages.inria.fr/user-guide/execution-backends/</guid><description>&lt;p>IOPS supports two execution backends for running benchmarks: local execution and SLURM cluster submission.&lt;/p>
&lt;hr>
&lt;h2 id="table-of-contents">Table of Contents&lt;/h2>
&lt;ol>
&lt;li>&lt;a href="#local-executor">Local Executor&lt;/a>&lt;/li>
&lt;li>&lt;a href="#parallel-execution">Parallel Execution&lt;/a>&lt;/li>
&lt;li>&lt;a href="#slurm-executor">SLURM Executor&lt;/a>
&lt;ul>
&lt;li>&lt;a href="#budget-control">Budget Control&lt;/a> → &lt;a href="../budget-control">dedicated guide&lt;/a>&lt;/li>
&lt;li>&lt;a href="#job-monitoring">Job Monitoring&lt;/a>&lt;/li>
&lt;li>&lt;a href="#custom-slurm-commands">Custom SLURM Commands&lt;/a>&lt;/li>
&lt;li>&lt;a href="#single-allocation-mode">Single-Allocation Mode&lt;/a> → &lt;a href="../single-allocation-mode">dedicated guide&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="local-executor">Local Executor&lt;/h2>
&lt;p>Runs benchmarks directly on your local machine using subprocesses. Suited for development, small experiments, single-node benchmarks, and quick iterations.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">benchmark&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">name&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;Local Test&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">workdir&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;./workdir&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">executor&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;local&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">scripts&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#f92672">name&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;benchmark&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">script_template&lt;/span>: |&lt;span style="color:#e6db74">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> #!/bin/bash
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> set -euo pipefail
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> {{ command.template }}&lt;/span> 
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="parallel-execution">Parallel Execution&lt;/h2>
&lt;p>By default, IOPS runs tests sequentially (one at a time). Run multiple tests concurrently by setting the &lt;code>parallel&lt;/code> option:&lt;/p></description></item><item><title>Running IO500 with IOPS</title><link>https://iops.gitlabpages.inria.fr/user-guide/io500/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://iops.gitlabpages.inria.fr/user-guide/io500/</guid><description>&lt;hr>
&lt;h2 id="running-the-io500-benchmark-with-iops">Running the IO500 Benchmark with IOPS&lt;/h2>
&lt;p>The configuration generated by:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>iops generate --io500
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;blockquote>
&lt;p>[!NOTE]
This is a &lt;strong>ready-to-use template&lt;/strong>, but it should not be used as-is. Before running any benchmark, make sure to review and adjust the configuration to match your HPC system, storage setup, and testing goals.&lt;/p>
&lt;p>The generated YAML file includes comments that explain each parameter and how to customize it. It is strongly recommended to read them before starting the benchmark.&lt;/p></description></item><item><title>Single-Allocation Mode</title><link>https://iops.gitlabpages.inria.fr/user-guide/single-allocation-mode/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://iops.gitlabpages.inria.fr/user-guide/single-allocation-mode/</guid><description>&lt;blockquote>
&lt;p>&lt;strong>Experimental Feature&lt;/strong>&lt;/p>
&lt;p>Single-allocation mode is experimental. It may contain bugs or undergo breaking changes in future releases. Please report any issues you encounter.&lt;/p>
&lt;/blockquote>
&lt;p>Single-allocation mode runs all tests within a single SLURM allocation instead of submitting separate jobs for each test.&lt;/p>
&lt;hr>
&lt;h2 id="table-of-contents">Table of Contents&lt;/h2>
&lt;ol>
&lt;li>&lt;a href="#overview">Overview&lt;/a>&lt;/li>
&lt;li>&lt;a href="#when-to-use">When to Use&lt;/a>&lt;/li>
&lt;li>&lt;a href="#basic-configuration">Basic Configuration&lt;/a>&lt;/li>
&lt;li>&lt;a href="#how-it-works">How It Works&lt;/a>&lt;/li>
&lt;li>&lt;a href="#running-mpi-programs">Running MPI Programs&lt;/a>&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="overview">Overview&lt;/h2>
&lt;p>By default, IOPS submits a separate SLURM job for each test (&lt;code>per-test&lt;/code> mode). Single-allocation mode changes this behavior:&lt;/p></description></item><item><title>Budget Control</title><link>https://iops.gitlabpages.inria.fr/user-guide/budget-control/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://iops.gitlabpages.inria.fr/user-guide/budget-control/</guid><description>&lt;p>IOPS can track core-hours consumption and automatically stop execution when a budget limit is reached, helping prevent exceeding compute allocations on HPC systems.&lt;/p>
&lt;hr>
&lt;h2 id="table-of-contents">Table of Contents&lt;/h2>
&lt;ol>
&lt;li>&lt;a href="#configuration">Configuration&lt;/a>&lt;/li>
&lt;li>&lt;a href="#how-core-hours-are-calculated">How Core-Hours Are Calculated&lt;/a>&lt;/li>
&lt;li>&lt;a href="#duration-source-and-accuracy">Duration Source and Accuracy&lt;/a>&lt;/li>
&lt;li>&lt;a href="#budget-enforcement-behavior">Budget Enforcement Behavior&lt;/a>&lt;/li>
&lt;li>&lt;a href="#dry-run-estimation">Dry-Run Estimation&lt;/a>&lt;/li>
&lt;li>&lt;a href="#cache-interaction">Cache Interaction&lt;/a>&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="configuration">Configuration&lt;/h2>
&lt;p>Set a budget limit in your YAML config:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">benchmark&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">max_core_hours&lt;/span>: &lt;span style="color:#ae81ff">1000&lt;/span> &lt;span style="color:#75715e"># Stop after 1000 core-hours&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">cores_expr&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;{{ nodes * processes_per_node }}&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Or from command line (overrides config value):&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>iops run config.yaml --max-core-hours &lt;span style="color:#ae81ff">1000&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Option&lt;/th>
 &lt;th>Description&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>max_core_hours&lt;/code>&lt;/td>
 &lt;td>Maximum core-hours budget. Execution stops when reached.&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>cores_expr&lt;/code>&lt;/td>
 &lt;td>Jinja2 expression to compute cores per test. Defaults to &lt;code>1&lt;/code> if not set.&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2 id="how-core-hours-are-calculated">How Core-Hours Are Calculated&lt;/h2>
&lt;pre tabindex="0">&lt;code>core_hours = cores × (duration_seconds / 3600)
&lt;/code>&lt;/pre>&lt;ul>
&lt;li>&lt;strong>&lt;code>cores&lt;/code>&lt;/strong>: Evaluated from &lt;code>cores_expr&lt;/code> using test variables&lt;/li>
&lt;li>&lt;strong>&lt;code>duration_seconds&lt;/code>&lt;/strong>: Actual script execution time (see &lt;a href="#duration-source-and-accuracy">Duration Source&lt;/a>)&lt;/li>
&lt;/ul>
&lt;h3 id="setting-cores_expr-correctly">Setting cores_expr Correctly&lt;/h3>
&lt;p>The &lt;code>cores_expr&lt;/code> should reflect the cores you&amp;rsquo;re actually charged for on your HPC system:&lt;/p></description></item><item><title>Hooks</title><link>https://iops.gitlabpages.inria.fr/user-guide/hooks/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://iops.gitlabpages.inria.fr/user-guide/hooks/</guid><description>&lt;p>Hooks run a command of your choice when something happens during a run: the run starts, a share of the tests has concluded, too many tests are failing, or the run ends. The typical use is monitoring a long run on a cluster, for example sending a mail when the run is half done and another when it finishes. They are equally useful for housekeeping, such as copying the results somewhere once the run is over.&lt;/p></description></item><item><title>Resource Sampling</title><link>https://iops.gitlabpages.inria.fr/user-guide/resource-tracing/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://iops.gitlabpages.inria.fr/user-guide/resource-tracing/</guid><description>&lt;p>IOPS can optionally sample CPU, memory, GPU, and I/O activity during benchmark execution, so you can correlate parameter configurations with resource footprint (e.g., heatmap analysis of how parameters affect resource usage).&lt;/p>
&lt;p>&lt;strong>Warning: Performance Impact&lt;/strong>&lt;/p>
&lt;p>Resource sampling runs background processes that periodically collect system metrics and write to CSV files. Although the samplers run at low priority (via &lt;code>renice&lt;/code>), they may still affect benchmark results: a small amount of CPU time for reading proc files, an &lt;code>nvidia-smi&lt;/code> invocation per GPU sample, one CSV append per sample interval, and ~1-2 MB of memory per process. For performance-critical measurements, run your benchmark &lt;strong>without sampling first&lt;/strong> to establish a baseline, then enable sampling in a separate run to collect resource data.&lt;/p></description></item><item><title>Metadata Files</title><link>https://iops.gitlabpages.inria.fr/user-guide/metadata-files/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://iops.gitlabpages.inria.fr/user-guide/metadata-files/</guid><description>&lt;p>IOPS generates metadata files with the &lt;code>__iops_&lt;/code> prefix to track executions, enable fast lookups, and support report generation. This page documents each file, when it is written, and how to control its generation.&lt;/p>
&lt;hr>
&lt;h2 id="table-of-contents">Table of Contents&lt;/h2>
&lt;ol>
&lt;li>&lt;a href="#io-overhead-considerations">I/O Overhead Considerations&lt;/a>&lt;/li>
&lt;li>&lt;a href="#metadata-files-overview">Metadata Files Overview&lt;/a>&lt;/li>
&lt;li>&lt;a href="#controlling-metadata-generation">Controlling Metadata Generation&lt;/a>&lt;/li>
&lt;li>&lt;a href="#file-reference">File Reference&lt;/a>&lt;/li>
&lt;li>&lt;a href="#best-practices">Best Practices&lt;/a>&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="io-overhead-considerations">I/O Overhead Considerations&lt;/h2>
&lt;p>Metadata files are written to the &lt;strong>workdir&lt;/strong> during benchmark execution. They are small (typically a few KB each), but consider disabling them when:&lt;/p></description></item><item><title>Exploring Executions</title><link>https://iops.gitlabpages.inria.fr/user-guide/exploring-executions/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://iops.gitlabpages.inria.fr/user-guide/exploring-executions/</guid><description>&lt;p>IOPS provides tools to explore, search, and inspect execution folders after running benchmarks, useful for large parameter sweeps where you need to find specific configurations or investigate failures. For the full flag reference, see the &lt;a href="../cli#find---explore-executions">CLI guide&lt;/a>.&lt;/p>
&lt;hr>
&lt;h2 id="table-of-contents">Table of Contents&lt;/h2>
&lt;ol>
&lt;li>&lt;a href="#finding-executions">Finding Executions&lt;/a>&lt;/li>
&lt;li>&lt;a href="#filtering-executions">Filtering Executions&lt;/a>&lt;/li>
&lt;li>&lt;a href="#advanced-options">Advanced Options&lt;/a>&lt;/li>
&lt;li>&lt;a href="#watch-mode">Watch Mode&lt;/a>&lt;/li>
&lt;li>&lt;a href="#iops-metadata-files">IOPS Metadata Files&lt;/a>&lt;/li>
&lt;li>&lt;a href="#inspecting-archives">Inspecting Archives&lt;/a>&lt;/li>
&lt;li>&lt;a href="#archiving-workdirs">Archiving Workdirs&lt;/a>&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="finding-executions">Finding Executions&lt;/h2>
&lt;p>Use the &lt;code>find&lt;/code> command to locate and display execution folders with their parameters:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>iops find /path/to/workdir
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The &lt;code>find&lt;/code> command works with four types of paths:&lt;/p></description></item><item><title>Command Line Interface</title><link>https://iops.gitlabpages.inria.fr/user-guide/cli/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://iops.gitlabpages.inria.fr/user-guide/cli/</guid><description>&lt;p>Complete reference for the IOPS command-line interface.&lt;/p>
&lt;hr>
&lt;h2 id="table-of-contents">Table of Contents&lt;/h2>
&lt;ol>
&lt;li>&lt;a href="#overview">Overview&lt;/a>&lt;/li>
&lt;li>&lt;a href="#basic-usage">Basic Usage&lt;/a>&lt;/li>
&lt;li>&lt;a href="#subcommand-reference">Subcommand Reference&lt;/a>&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="overview">Overview&lt;/h2>
&lt;p>IOPS uses a subcommand-based CLI similar to git and docker. Each subcommand has its own options and help.&lt;/p>
&lt;h2 id="basic-usage">Basic Usage&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>iops &amp;lt;subcommand&amp;gt; &lt;span style="color:#f92672">[&lt;/span>arguments&lt;span style="color:#f92672">]&lt;/span> &lt;span style="color:#f92672">[&lt;/span>options&lt;span style="color:#f92672">]&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Command&lt;/th>
 &lt;th>Purpose&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>iops run &amp;lt;config.yaml&amp;gt;&lt;/code>&lt;/td>
 &lt;td>Execute benchmark&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>iops check &amp;lt;config.yaml&amp;gt;&lt;/code>&lt;/td>
 &lt;td>Validate configuration&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>iops generate [path]&lt;/code>&lt;/td>
 &lt;td>Create config template&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>iops report &amp;lt;path&amp;gt;&lt;/code>&lt;/td>
 &lt;td>Generate HTML report&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>iops find &amp;lt;path&amp;gt; [filters...]&lt;/code>&lt;/td>
 &lt;td>Explore executions&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>iops archive &amp;lt;create|extract&amp;gt;&lt;/code>&lt;/td>
 &lt;td>Archive and extract workdirs&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>iops cache &amp;lt;create|rebuild|list|show|stats&amp;gt;&lt;/code>&lt;/td>
 &lt;td>Cache management&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>iops convert &amp;lt;file.xml&amp;gt;&lt;/code>&lt;/td>
 &lt;td>Convert JUBE XML to IOPS YAML&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h2 id="subcommand-reference">Subcommand Reference&lt;/h2>
&lt;h3 id="run---execute-benchmark">run - Execute Benchmark&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>iops run &amp;lt;config.yaml&amp;gt; &lt;span style="color:#f92672">[&lt;/span>options&lt;span style="color:#f92672">]&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>Options:&lt;/strong>&lt;/p></description></item><item><title>Custom Reports &amp; Visualization</title><link>https://iops.gitlabpages.inria.fr/user-guide/reporting/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://iops.gitlabpages.inria.fr/user-guide/reporting/</guid><description>&lt;p>IOPS includes a reporting system that generates interactive HTML reports with custom plots and statistical analysis from your benchmark results.&lt;/p>
&lt;hr>
&lt;h2 id="table-of-contents">Table of Contents&lt;/h2>
&lt;ol>
&lt;li>&lt;a href="#introduction">Introduction&lt;/a>&lt;/li>
&lt;li>&lt;a href="#basic-usage">Basic Usage&lt;/a>&lt;/li>
&lt;li>&lt;a href="#report-sections">Report Sections&lt;/a>&lt;/li>
&lt;li>&lt;a href="#controlling-sections">Controlling Sections&lt;/a>&lt;/li>
&lt;li>&lt;a href="#custom-plots">Custom Plots&lt;/a>
&lt;ul>
&lt;li>&lt;a href="#logarithmic-axis-scales">Logarithmic Axis Scales&lt;/a>&lt;/li>
&lt;li>&lt;a href="#explicit-axis-ranges">Explicit Axis Ranges&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="#default-plots">Default Plots&lt;/a>&lt;/li>
&lt;li>&lt;a href="#themes-and-styling">Themes and Styling&lt;/a>&lt;/li>
&lt;li>&lt;a href="#plot-sizing-and-defaults">Plot Sizing and Defaults&lt;/a>&lt;/li>
&lt;li>&lt;a href="#output-configuration">Output Configuration&lt;/a>&lt;/li>
&lt;li>&lt;a href="#per-test-image-gallery">Per-Test Image Gallery&lt;/a>&lt;/li>
&lt;li>&lt;a href="#software-version-capture-probe">Software Version Capture Probe&lt;/a>&lt;/li>
&lt;li>&lt;a href="#examples">Examples&lt;/a>&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="introduction">Introduction&lt;/h2>
&lt;p>Reports are generated as self-contained HTML files with embedded interactive Plotly visualizations. You can auto-generate reports after execution, define custom plots and themes per metric, control which sections appear, regenerate reports with different configurations without re-running benchmarks, and optionally export all plots as image files (requires kaleido).&lt;/p></description></item><item><title>JUBE Conversion</title><link>https://iops.gitlabpages.inria.fr/user-guide/jube-conversion/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://iops.gitlabpages.inria.fr/user-guide/jube-conversion/</guid><description>&lt;blockquote>
&lt;p>&lt;strong>Experimental Feature&lt;/strong>&lt;/p>
&lt;p>JUBE conversion is experimental. It may contain bugs or undergo breaking changes in future releases. Please report any issues you encounter.&lt;/p>
&lt;/blockquote>
&lt;p>Convert existing &lt;a href="https://github.com/FZJ-JSC/JUBE">JUBE&lt;/a> benchmark configurations to IOPS format using &lt;code>iops convert&lt;/code>.&lt;/p>
&lt;hr>
&lt;h2 id="overview">Overview&lt;/h2>
&lt;p>JUBE (Juelich Benchmarking Environment) is an HPC benchmarking framework that uses XML configurations. &lt;code>iops convert&lt;/code> provides a best-effort translation of JUBE benchmarks to IOPS YAML, using JUBE&amp;rsquo;s own Python library to parse the XML for accurate interpretation of JUBE-specific syntax. The output includes TODO markers for features that require manual adjustment.&lt;/p></description></item></channel></rss>