<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.anunna.wur.nl/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Honfi001</id>
	<title>HPCwiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.anunna.wur.nl/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Honfi001"/>
	<link rel="alternate" type="text/html" href="https://wiki.anunna.wur.nl/Special:Contributions/Honfi001"/>
	<updated>2026-08-30T01:54:27Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>https://wiki.anunna.wur.nl/index.php?title=Software&amp;diff=3084</id>
		<title>Software</title>
		<link rel="alternate" type="text/html" href="https://wiki.anunna.wur.nl/index.php?title=Software&amp;diff=3084"/>
		<updated>2026-08-26T06:25:22Z</updated>

		<summary type="html">&lt;p&gt;Honfi001: /* Containers */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The software available on Anunna and how to use, install, and manage it.&lt;br /&gt;
&lt;br /&gt;
== Organization ==&lt;br /&gt;
&lt;br /&gt;
* [[Software Overview]] — the software landscape&lt;br /&gt;
* [[Environment Modules]] — loading software with modules and buckets&lt;br /&gt;
* [[Installing Personal Software]] — installing into your own space&lt;br /&gt;
* [[Licensed Software]] — software that needs a licence&lt;br /&gt;
&lt;br /&gt;
== Scripting Languanges ==&lt;br /&gt;
* [[Python]] &lt;br /&gt;
* [[R]] &lt;br /&gt;
* [[Julia]] &lt;br /&gt;
&lt;br /&gt;
== Containers ==&lt;br /&gt;
* [[Apptainer]]&lt;br /&gt;
&lt;br /&gt;
== MPI Implemenations ==&lt;br /&gt;
* [[OpenMPI]]&lt;br /&gt;
* [[IntelMPI]]&lt;/div&gt;</summary>
		<author><name>Honfi001</name></author>
	</entry>
	<entry>
		<id>https://wiki.anunna.wur.nl/index.php?title=Archival_Storage&amp;diff=3083</id>
		<title>Archival Storage</title>
		<link rel="alternate" type="text/html" href="https://wiki.anunna.wur.nl/index.php?title=Archival_Storage&amp;diff=3083"/>
		<updated>2026-08-25T12:52:03Z</updated>

		<summary type="html">&lt;p&gt;Honfi001: /* Group pages */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;code&amp;gt;/archive&amp;lt;/code&amp;gt; is Anunna&#039;s warm storage tier for data you want to keep but are not actively computing on. Storing data there costs less than on [[Compute Storage|Lustre]], and datasets that have not been used for a long time are moved on to long-term tape archive — automatically, through the [[#Tapeworm|Tapeworm]] service — to keep the warm tier free for active work.&lt;br /&gt;
&lt;br /&gt;
== The /archive filesystem ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/archive&amp;lt;/code&amp;gt; is a mount that is only accessible from the login nodes, it cannot be used for compute work, and it is only available to WUR users.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/archive&amp;lt;/code&amp;gt; is backed up periodically on the same schedule as your [[Home Directory|home directory]] — restorable from roughly a week of history (see [[Backup Policy]]). That backup is separate from the long-term tape archival described below: a backup is a short-term safety copy, while archival moves data off &amp;lt;code&amp;gt;/archive&amp;lt;/code&amp;gt; for long-term keeping.&lt;br /&gt;
&lt;br /&gt;
== Tapeworm ==&lt;br /&gt;
&lt;br /&gt;
Tapeworm (https://tapeworm.anunna.wur.nl/) helps you manage data on &amp;lt;code&amp;gt;/archive&amp;lt;/code&amp;gt; by identifying datasets that are no longer actively used and preparing them for tape archival. The goal is simple: keep our warm storage available for active work, while safely preserving older data on tape.&lt;br /&gt;
&lt;br /&gt;
With Tapeworm, you can:&lt;br /&gt;
* See which of your datasets are being considered for tape archival&lt;br /&gt;
* Review planned moves before they happen&lt;br /&gt;
* Approve, snooze, or block moves when needed&lt;br /&gt;
* Add metadata to help describe archived datasets. The metadata is included on tape and can be used to view/retrieve from tape, should you need to do so in the future&lt;br /&gt;
&lt;br /&gt;
If you do nothing, Tapeworm will continue with the planned move after the review period. That is why we recommend checking your pending actions regularly. You will also receive notification emails about pending actions.&lt;br /&gt;
&lt;br /&gt;
From time to time, the user pages may temporarily be unavailable during maintenance. In that case, Tapeworm will show a short maintenance page instead of the normal interface.&lt;br /&gt;
&lt;br /&gt;
=== How Tapeworm works ===&lt;br /&gt;
&lt;br /&gt;
# Tapeworm scans &amp;lt;code&amp;gt;/archive&amp;lt;/code&amp;gt; and builds an index of paths and filesystem metadata.&lt;br /&gt;
# At the dataset discovery step, it groups those paths into datasets, determines size, owner, and last active use, and makes them available in the GUI. Very small datasets are filtered out and will not be shown.&lt;br /&gt;
# A policy engine checks which discovered datasets look inactive (for example: 60+ days old and larger than 1GB).&lt;br /&gt;
# Matching datasets are marked as &#039;&#039;&#039;planned&#039;&#039;&#039; and shown in your overview.&lt;br /&gt;
# You will be notified by email that Tapeworm plans to move data you own.&lt;br /&gt;
# You can review and change what should happen, or block the move(s) entirely.&lt;br /&gt;
# If no action is taken, after a wait period of 4 weeks, planned moves will become scheduled and then executed.&lt;br /&gt;
# Data is moved to tape, and removed from &amp;lt;code&amp;gt;/archive&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Who sees what? ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Regular users&#039;&#039;&#039; see only their own datasets and actions.&lt;br /&gt;
* &#039;&#039;&#039;Group admins/contacts&#039;&#039;&#039; see data for their configured group(s), in addition to their own data.&lt;br /&gt;
&lt;br /&gt;
=== User pages ===&lt;br /&gt;
&lt;br /&gt;
==== 1) Overview ====&lt;br /&gt;
This is your action page. It shows items that currently need your decision.&lt;br /&gt;
[[File:Screenshot from 2026-03-17 15-19-46.png|none|thumb|1400x1400px]]&lt;br /&gt;
For each candidate, you can:&lt;br /&gt;
* &#039;&#039;&#039;Approve&#039;&#039;&#039;: proceed with the tape move. It will schedule for the next day&lt;br /&gt;
* &#039;&#039;&#039;Deny&#039;&#039;&#039;: stop this move, configure an override for this path. Tapeworm will not try to move this dataset/path again, until you choose to remove the override&lt;br /&gt;
* &#039;&#039;&#039;Snooze&#039;&#039;&#039;: postpone the decision to a future date&lt;br /&gt;
* &#039;&#039;&#039;Edit metadata&#039;&#039;&#039;: add key/value notes for archived data. These values are included on tape and can be used to view/retrieve datasets on tape&lt;br /&gt;
&lt;br /&gt;
You can also select multiple rows and apply actions in bulk.&lt;br /&gt;
&lt;br /&gt;
==== 2) Datasets ====&lt;br /&gt;
This page shows your discovered datasets, their sizes, and last activity times. The application has no concept of what data belongs together and should be considered a &#039;dataset&#039;. If the selections on this page are wrong, you can change how Tapeworm should handle these datasets instead.&lt;br /&gt;
[[File:Screenshot from 2026-03-17 15-20-23.png|none|thumb|1400x1400px]]&lt;br /&gt;
&#039;&#039;&#039;Important:&#039;&#039;&#039;&lt;br /&gt;
* If a dataset already has an active move candidate, scheduling controls are disabled.&lt;br /&gt;
 The dataset list is informational; move decisions are handled through the Schedule page.&lt;br /&gt;
&lt;br /&gt;
==== 3) Schedule ====&lt;br /&gt;
This page shows move candidates and their status over time.&lt;br /&gt;
[[File:Screenshot from 2026-03-17 15-20-58.png|none|thumb|1400x1400px]]&lt;br /&gt;
Common statuses:&lt;br /&gt;
* &#039;&#039;&#039;Planned&#039;&#039;&#039;: under review&lt;br /&gt;
* &#039;&#039;&#039;Scheduled&#039;&#039;&#039;: move is planned for a specific date&lt;br /&gt;
* &#039;&#039;&#039;Executing / Tape staged / On tape&#039;&#039;&#039;: move is in progress or completed&lt;br /&gt;
* &#039;&#039;&#039;Error&#039;&#039;&#039;: move needs admin attention. You may be contacted, maybe we resolve it ourselves :)&lt;br /&gt;
&lt;br /&gt;
Once a move is already executing or completed, schedule-changing actions are locked.&lt;br /&gt;
&lt;br /&gt;
==== 4) Overrides ====&lt;br /&gt;
Overrides tell Tapeworm to ignore specific paths in future planning.&lt;br /&gt;
[[File:Screenshot from 2026-03-17 15-21-49.png|none|thumb|1400x1400px]]&lt;br /&gt;
Use overrides when:&lt;br /&gt;
* a project is still active and needs to remain on /archive&lt;br /&gt;
* policy suggestions are not appropriate for that location&lt;br /&gt;
&lt;br /&gt;
If you agree that the dataset can in principle be moved to tape, but you don&#039;t (yet) know when, you can choose to postpone/snooze the archival instead of overriding it.&lt;br /&gt;
&lt;br /&gt;
Overrides apply to the selected path and everything below it.&lt;br /&gt;
&lt;br /&gt;
==== 5) History ====&lt;br /&gt;
This page shows completed archival moves. When a dataset has been successfully archived and finalized, it is removed from active scheduling pages and moved into history.&lt;br /&gt;
[[File:Screenshot from 2026-03-17 15-24-40.png|none|thumb|1400x1400px]]&lt;br /&gt;
&lt;br /&gt;
=== Group pages ===&lt;br /&gt;
&lt;br /&gt;
Group admins have a separate additional set of pages for their group scope:&lt;br /&gt;
* &#039;&#039;&#039;Group overview&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Group datasets&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Group schedule&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Group overrides&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Group history&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
If you manage more than one group, you can switch group scope in the selector at the top of the group pages.&lt;br /&gt;
&lt;br /&gt;
=== Notifications (email) ===&lt;br /&gt;
&lt;br /&gt;
Tapeworm sends email updates when actions are pending, dates are approaching, or move state changes happen.&lt;br /&gt;
&lt;br /&gt;
Emails typically include:&lt;br /&gt;
* Dataset path&lt;br /&gt;
* Size&lt;br /&gt;
* Last activity&lt;br /&gt;
* Current status&lt;br /&gt;
* Review/scheduled date&lt;br /&gt;
&lt;br /&gt;
Notification types you may receive:&lt;br /&gt;
* &#039;&#039;&#039;Action required&#039;&#039;&#039;: please approve, snooze, or deny&lt;br /&gt;
* &#039;&#039;&#039;Reminder&#039;&#039;&#039;: review date is approaching&lt;br /&gt;
* &#039;&#039;&#039;Informational&#039;&#039;&#039;: move status changed (for example scheduled, staging, or completed)&lt;br /&gt;
* &#039;&#039;&#039;Escalation&#039;&#039;&#039;: sent to group contacts when no user response is received&lt;br /&gt;
&lt;br /&gt;
Please read these emails carefully — they are your chance to adjust decisions before execution.&lt;br /&gt;
&lt;br /&gt;
=== Best practices for users ===&lt;br /&gt;
&lt;br /&gt;
* Check your &#039;&#039;&#039;Overview&#039;&#039;&#039; page regularly&lt;br /&gt;
* Use &#039;&#039;&#039;Snooze&#039;&#039;&#039; if you need time to validate impact&lt;br /&gt;
* Add &#039;&#039;&#039;metadata&#039;&#039;&#039; when approving important datasets&lt;br /&gt;
* Use &#039;&#039;&#039;Overrides&#039;&#039;&#039; for known and persisting exceptions&lt;br /&gt;
* If unsure, contact HPC support before a scheduled move date&lt;br /&gt;
&lt;br /&gt;
=== Tapeworm FAQ ===&lt;br /&gt;
&lt;br /&gt;
==== What happens if I do nothing? ====&lt;br /&gt;
Planned items can move forward automatically after the review window (4 weeks).&lt;br /&gt;
&lt;br /&gt;
==== Can I undo after tape staging? ====&lt;br /&gt;
Not directly in Tapeworm. Retrieval is done via the tape/iRODS workflow. See: https://irods.wur.nl/userguide/tape_retrieval/&lt;br /&gt;
&lt;br /&gt;
==== What does &amp;quot;completed&amp;quot; mean? ====&lt;br /&gt;
Completed means Tapeworm saw the tape workflow finish and finalized the move. Before finalization, the system verifies the archive in iRODS and only then removes the staged source copy.&lt;br /&gt;
&lt;br /&gt;
==== Why is an action button disabled? ====&lt;br /&gt;
Usually because the move has already progressed (executing/staged/on tape/error), so schedule edits are no longer valid.&lt;br /&gt;
&lt;br /&gt;
==== Why do some paths on /archive/ not appear as datasets in Tapeworm? ====&lt;br /&gt;
Tapeworm only shows paths that are discovered as datasets and pass a minimum-size threshold. Very small paths, single text files, and other tiny items are intentionally filtered out.&lt;br /&gt;
&lt;br /&gt;
=== Need help? ===&lt;br /&gt;
If anything is unclear, or you think a move is incorrect but you cannot alter it in the provided GUI, please open an HPC support ticket.&lt;br /&gt;
&lt;br /&gt;
== Manual tape access with iRODS besides Tapeworm ==&lt;br /&gt;
&lt;br /&gt;
Anunna hosts its own iRODS instance, with which you can push data manually to the WUR tape storage for archiving. For general usage information, see https://irods.wur.nl/. The best course of action is to loosely follow the course using your own data, and use your personal space for data upload and transfer to tape.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Be sure to check whether the data is correctly stored on tape before you remove your data.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
On Anunna there are some differences and additions to the linked site:&lt;br /&gt;
&lt;br /&gt;
* The zone is &amp;lt;code&amp;gt;HPC&amp;lt;/code&amp;gt;.&lt;br /&gt;
* With &amp;lt;code&amp;gt;iinit&amp;lt;/code&amp;gt; you can initialise the iRODS environment. Use your account password.&lt;br /&gt;
* With &amp;lt;code&amp;gt;ils&amp;lt;/code&amp;gt; you can see your available iRODS collections. You need that as a destination location for &amp;lt;code&amp;gt;itape&amp;lt;/code&amp;gt;.&lt;br /&gt;
* We have a function to ease uploads (use &amp;lt;code&amp;gt;-h&amp;lt;/code&amp;gt; for help): &amp;lt;code&amp;gt;itape&amp;lt;/code&amp;gt;.&lt;br /&gt;
* We have aliases to ease checking the status of your archive process (it takes a while): &amp;lt;code&amp;gt;itapestat&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;itapestatnp&amp;lt;/code&amp;gt;. The first is for human use — it shows a paginated status of all your files. The latter dumps all the info, so you can e.g. use grep to filter.&lt;br /&gt;
* If you remove data with &amp;lt;code&amp;gt;irm&amp;lt;/code&amp;gt; within iRODS, the data isn&#039;t actually removed but moved to a trash bin. The advantage is that you can retrieve it if the removal was in error; the disadvantage is that the data will keep costing money. To empty it, see &amp;lt;code&amp;gt;irmtrash -h&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Because of hardware limitations on the backend tape storage, the size limit per file for our tape archive is 5 TB.&lt;br /&gt;
&lt;br /&gt;
== Retrieving data from tape ==&lt;br /&gt;
As the tape storage is maintained by a different team, it is best to follow their documentation on retrieval.&lt;br /&gt;
&lt;br /&gt;
For that, see here: https://irods.wur.nl/userguide/archiving_research_data_using_icommands/&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Storage Systems Overview]]&lt;br /&gt;
* [[Backup Policy]]&lt;br /&gt;
* [[Compute Storage]]&lt;br /&gt;
* [[Tariffs|Costs associated with resource usage]]&lt;br /&gt;
&lt;br /&gt;
== External links ==&lt;br /&gt;
* [http://wiki.lustre.org/index.php/Main_Page Lustre website]&lt;/div&gt;</summary>
		<author><name>Honfi001</name></author>
	</entry>
	<entry>
		<id>https://wiki.anunna.wur.nl/index.php?title=Archival_Storage&amp;diff=3082</id>
		<title>Archival Storage</title>
		<link rel="alternate" type="text/html" href="https://wiki.anunna.wur.nl/index.php?title=Archival_Storage&amp;diff=3082"/>
		<updated>2026-08-25T12:51:14Z</updated>

		<summary type="html">&lt;p&gt;Honfi001: /* Group pages */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;code&amp;gt;/archive&amp;lt;/code&amp;gt; is Anunna&#039;s warm storage tier for data you want to keep but are not actively computing on. Storing data there costs less than on [[Compute Storage|Lustre]], and datasets that have not been used for a long time are moved on to long-term tape archive — automatically, through the [[#Tapeworm|Tapeworm]] service — to keep the warm tier free for active work.&lt;br /&gt;
&lt;br /&gt;
== The /archive filesystem ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/archive&amp;lt;/code&amp;gt; is a mount that is only accessible from the login nodes, it cannot be used for compute work, and it is only available to WUR users.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/archive&amp;lt;/code&amp;gt; is backed up periodically on the same schedule as your [[Home Directory|home directory]] — restorable from roughly a week of history (see [[Backup Policy]]). That backup is separate from the long-term tape archival described below: a backup is a short-term safety copy, while archival moves data off &amp;lt;code&amp;gt;/archive&amp;lt;/code&amp;gt; for long-term keeping.&lt;br /&gt;
&lt;br /&gt;
== Tapeworm ==&lt;br /&gt;
&lt;br /&gt;
Tapeworm (https://tapeworm.anunna.wur.nl/) helps you manage data on &amp;lt;code&amp;gt;/archive&amp;lt;/code&amp;gt; by identifying datasets that are no longer actively used and preparing them for tape archival. The goal is simple: keep our warm storage available for active work, while safely preserving older data on tape.&lt;br /&gt;
&lt;br /&gt;
With Tapeworm, you can:&lt;br /&gt;
* See which of your datasets are being considered for tape archival&lt;br /&gt;
* Review planned moves before they happen&lt;br /&gt;
* Approve, snooze, or block moves when needed&lt;br /&gt;
* Add metadata to help describe archived datasets. The metadata is included on tape and can be used to view/retrieve from tape, should you need to do so in the future&lt;br /&gt;
&lt;br /&gt;
If you do nothing, Tapeworm will continue with the planned move after the review period. That is why we recommend checking your pending actions regularly. You will also receive notification emails about pending actions.&lt;br /&gt;
&lt;br /&gt;
From time to time, the user pages may temporarily be unavailable during maintenance. In that case, Tapeworm will show a short maintenance page instead of the normal interface.&lt;br /&gt;
&lt;br /&gt;
=== How Tapeworm works ===&lt;br /&gt;
&lt;br /&gt;
# Tapeworm scans &amp;lt;code&amp;gt;/archive&amp;lt;/code&amp;gt; and builds an index of paths and filesystem metadata.&lt;br /&gt;
# At the dataset discovery step, it groups those paths into datasets, determines size, owner, and last active use, and makes them available in the GUI. Very small datasets are filtered out and will not be shown.&lt;br /&gt;
# A policy engine checks which discovered datasets look inactive (for example: 60+ days old and larger than 1GB).&lt;br /&gt;
# Matching datasets are marked as &#039;&#039;&#039;planned&#039;&#039;&#039; and shown in your overview.&lt;br /&gt;
# You will be notified by email that Tapeworm plans to move data you own.&lt;br /&gt;
# You can review and change what should happen, or block the move(s) entirely.&lt;br /&gt;
# If no action is taken, after a wait period of 4 weeks, planned moves will become scheduled and then executed.&lt;br /&gt;
# Data is moved to tape, and removed from &amp;lt;code&amp;gt;/archive&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Who sees what? ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Regular users&#039;&#039;&#039; see only their own datasets and actions.&lt;br /&gt;
* &#039;&#039;&#039;Group admins/contacts&#039;&#039;&#039; see data for their configured group(s), in addition to their own data.&lt;br /&gt;
&lt;br /&gt;
=== User pages ===&lt;br /&gt;
&lt;br /&gt;
==== 1) Overview ====&lt;br /&gt;
This is your action page. It shows items that currently need your decision.&lt;br /&gt;
[[File:Screenshot from 2026-03-17 15-19-46.png|none|thumb|1400x1400px]]&lt;br /&gt;
For each candidate, you can:&lt;br /&gt;
* &#039;&#039;&#039;Approve&#039;&#039;&#039;: proceed with the tape move. It will schedule for the next day&lt;br /&gt;
* &#039;&#039;&#039;Deny&#039;&#039;&#039;: stop this move, configure an override for this path. Tapeworm will not try to move this dataset/path again, until you choose to remove the override&lt;br /&gt;
* &#039;&#039;&#039;Snooze&#039;&#039;&#039;: postpone the decision to a future date&lt;br /&gt;
* &#039;&#039;&#039;Edit metadata&#039;&#039;&#039;: add key/value notes for archived data. These values are included on tape and can be used to view/retrieve datasets on tape&lt;br /&gt;
&lt;br /&gt;
You can also select multiple rows and apply actions in bulk.&lt;br /&gt;
&lt;br /&gt;
==== 2) Datasets ====&lt;br /&gt;
This page shows your discovered datasets, their sizes, and last activity times. The application has no concept of what data belongs together and should be considered a &#039;dataset&#039;. If the selections on this page are wrong, you can change how Tapeworm should handle these datasets instead.&lt;br /&gt;
[[File:Screenshot from 2026-03-17 15-20-23.png|none|thumb|1400x1400px]]&lt;br /&gt;
&#039;&#039;&#039;Important:&#039;&#039;&#039;&lt;br /&gt;
* If a dataset already has an active move candidate, scheduling controls are disabled.&lt;br /&gt;
 The dataset list is informational; move decisions are handled through the Schedule page.&lt;br /&gt;
&lt;br /&gt;
==== 3) Schedule ====&lt;br /&gt;
This page shows move candidates and their status over time.&lt;br /&gt;
[[File:Screenshot from 2026-03-17 15-20-58.png|none|thumb|1400x1400px]]&lt;br /&gt;
Common statuses:&lt;br /&gt;
* &#039;&#039;&#039;Planned&#039;&#039;&#039;: under review&lt;br /&gt;
* &#039;&#039;&#039;Scheduled&#039;&#039;&#039;: move is planned for a specific date&lt;br /&gt;
* &#039;&#039;&#039;Executing / Tape staged / On tape&#039;&#039;&#039;: move is in progress or completed&lt;br /&gt;
* &#039;&#039;&#039;Error&#039;&#039;&#039;: move needs admin attention. You may be contacted, maybe we resolve it ourselves :)&lt;br /&gt;
&lt;br /&gt;
Once a move is already executing or completed, schedule-changing actions are locked.&lt;br /&gt;
&lt;br /&gt;
==== 4) Overrides ====&lt;br /&gt;
Overrides tell Tapeworm to ignore specific paths in future planning.&lt;br /&gt;
[[File:Screenshot from 2026-03-17 15-21-49.png|none|thumb|1400x1400px]]&lt;br /&gt;
Use overrides when:&lt;br /&gt;
* a project is still active and needs to remain on /archive&lt;br /&gt;
* policy suggestions are not appropriate for that location&lt;br /&gt;
&lt;br /&gt;
If you agree that the dataset can in principle be moved to tape, but you don&#039;t (yet) know when, you can choose to postpone/snooze the archival instead of overriding it.&lt;br /&gt;
&lt;br /&gt;
Overrides apply to the selected path and everything below it.&lt;br /&gt;
&lt;br /&gt;
==== 5) History ====&lt;br /&gt;
This page shows completed archival moves. When a dataset has been successfully archived and finalized, it is removed from active scheduling pages and moved into history.&lt;br /&gt;
[[File:Screenshot from 2026-03-17 15-24-40.png|none|thumb|1400x1400px]]&lt;br /&gt;
&lt;br /&gt;
=== Group pages ===&lt;br /&gt;
&lt;br /&gt;
Group admins have an additional set of pages for their group scope:&lt;br /&gt;
* &#039;&#039;&#039;Group overview&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Group datasets&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Group schedule&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Group overrides&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Group history&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
If you manage more than one group, you can switch group scope in the selector at the top of the group pages.&lt;br /&gt;
&lt;br /&gt;
=== Notifications (email) ===&lt;br /&gt;
&lt;br /&gt;
Tapeworm sends email updates when actions are pending, dates are approaching, or move state changes happen.&lt;br /&gt;
&lt;br /&gt;
Emails typically include:&lt;br /&gt;
* Dataset path&lt;br /&gt;
* Size&lt;br /&gt;
* Last activity&lt;br /&gt;
* Current status&lt;br /&gt;
* Review/scheduled date&lt;br /&gt;
&lt;br /&gt;
Notification types you may receive:&lt;br /&gt;
* &#039;&#039;&#039;Action required&#039;&#039;&#039;: please approve, snooze, or deny&lt;br /&gt;
* &#039;&#039;&#039;Reminder&#039;&#039;&#039;: review date is approaching&lt;br /&gt;
* &#039;&#039;&#039;Informational&#039;&#039;&#039;: move status changed (for example scheduled, staging, or completed)&lt;br /&gt;
* &#039;&#039;&#039;Escalation&#039;&#039;&#039;: sent to group contacts when no user response is received&lt;br /&gt;
&lt;br /&gt;
Please read these emails carefully — they are your chance to adjust decisions before execution.&lt;br /&gt;
&lt;br /&gt;
=== Best practices for users ===&lt;br /&gt;
&lt;br /&gt;
* Check your &#039;&#039;&#039;Overview&#039;&#039;&#039; page regularly&lt;br /&gt;
* Use &#039;&#039;&#039;Snooze&#039;&#039;&#039; if you need time to validate impact&lt;br /&gt;
* Add &#039;&#039;&#039;metadata&#039;&#039;&#039; when approving important datasets&lt;br /&gt;
* Use &#039;&#039;&#039;Overrides&#039;&#039;&#039; for known and persisting exceptions&lt;br /&gt;
* If unsure, contact HPC support before a scheduled move date&lt;br /&gt;
&lt;br /&gt;
=== Tapeworm FAQ ===&lt;br /&gt;
&lt;br /&gt;
==== What happens if I do nothing? ====&lt;br /&gt;
Planned items can move forward automatically after the review window (4 weeks).&lt;br /&gt;
&lt;br /&gt;
==== Can I undo after tape staging? ====&lt;br /&gt;
Not directly in Tapeworm. Retrieval is done via the tape/iRODS workflow. See: https://irods.wur.nl/userguide/tape_retrieval/&lt;br /&gt;
&lt;br /&gt;
==== What does &amp;quot;completed&amp;quot; mean? ====&lt;br /&gt;
Completed means Tapeworm saw the tape workflow finish and finalized the move. Before finalization, the system verifies the archive in iRODS and only then removes the staged source copy.&lt;br /&gt;
&lt;br /&gt;
==== Why is an action button disabled? ====&lt;br /&gt;
Usually because the move has already progressed (executing/staged/on tape/error), so schedule edits are no longer valid.&lt;br /&gt;
&lt;br /&gt;
==== Why do some paths on /archive/ not appear as datasets in Tapeworm? ====&lt;br /&gt;
Tapeworm only shows paths that are discovered as datasets and pass a minimum-size threshold. Very small paths, single text files, and other tiny items are intentionally filtered out.&lt;br /&gt;
&lt;br /&gt;
=== Need help? ===&lt;br /&gt;
If anything is unclear, or you think a move is incorrect but you cannot alter it in the provided GUI, please open an HPC support ticket.&lt;br /&gt;
&lt;br /&gt;
== Manual tape access with iRODS besides Tapeworm ==&lt;br /&gt;
&lt;br /&gt;
Anunna hosts its own iRODS instance, with which you can push data manually to the WUR tape storage for archiving. For general usage information, see https://irods.wur.nl/. The best course of action is to loosely follow the course using your own data, and use your personal space for data upload and transfer to tape.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Be sure to check whether the data is correctly stored on tape before you remove your data.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
On Anunna there are some differences and additions to the linked site:&lt;br /&gt;
&lt;br /&gt;
* The zone is &amp;lt;code&amp;gt;HPC&amp;lt;/code&amp;gt;.&lt;br /&gt;
* With &amp;lt;code&amp;gt;iinit&amp;lt;/code&amp;gt; you can initialise the iRODS environment. Use your account password.&lt;br /&gt;
* With &amp;lt;code&amp;gt;ils&amp;lt;/code&amp;gt; you can see your available iRODS collections. You need that as a destination location for &amp;lt;code&amp;gt;itape&amp;lt;/code&amp;gt;.&lt;br /&gt;
* We have a function to ease uploads (use &amp;lt;code&amp;gt;-h&amp;lt;/code&amp;gt; for help): &amp;lt;code&amp;gt;itape&amp;lt;/code&amp;gt;.&lt;br /&gt;
* We have aliases to ease checking the status of your archive process (it takes a while): &amp;lt;code&amp;gt;itapestat&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;itapestatnp&amp;lt;/code&amp;gt;. The first is for human use — it shows a paginated status of all your files. The latter dumps all the info, so you can e.g. use grep to filter.&lt;br /&gt;
* If you remove data with &amp;lt;code&amp;gt;irm&amp;lt;/code&amp;gt; within iRODS, the data isn&#039;t actually removed but moved to a trash bin. The advantage is that you can retrieve it if the removal was in error; the disadvantage is that the data will keep costing money. To empty it, see &amp;lt;code&amp;gt;irmtrash -h&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Because of hardware limitations on the backend tape storage, the size limit per file for our tape archive is 5 TB.&lt;br /&gt;
&lt;br /&gt;
== Retrieving data from tape ==&lt;br /&gt;
As the tape storage is maintained by a different team, it is best to follow their documentation on retrieval.&lt;br /&gt;
&lt;br /&gt;
For that, see here: https://irods.wur.nl/userguide/archiving_research_data_using_icommands/&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Storage Systems Overview]]&lt;br /&gt;
* [[Backup Policy]]&lt;br /&gt;
* [[Compute Storage]]&lt;br /&gt;
* [[Tariffs|Costs associated with resource usage]]&lt;br /&gt;
&lt;br /&gt;
== External links ==&lt;br /&gt;
* [http://wiki.lustre.org/index.php/Main_Page Lustre website]&lt;/div&gt;</summary>
		<author><name>Honfi001</name></author>
	</entry>
	<entry>
		<id>https://wiki.anunna.wur.nl/index.php?title=Archival_Storage&amp;diff=3081</id>
		<title>Archival Storage</title>
		<link rel="alternate" type="text/html" href="https://wiki.anunna.wur.nl/index.php?title=Archival_Storage&amp;diff=3081"/>
		<updated>2026-08-25T12:48:22Z</updated>

		<summary type="html">&lt;p&gt;Honfi001: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;code&amp;gt;/archive&amp;lt;/code&amp;gt; is Anunna&#039;s warm storage tier for data you want to keep but are not actively computing on. Storing data there costs less than on [[Compute Storage|Lustre]], and datasets that have not been used for a long time are moved on to long-term tape archive — automatically, through the [[#Tapeworm|Tapeworm]] service — to keep the warm tier free for active work.&lt;br /&gt;
&lt;br /&gt;
== The /archive filesystem ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/archive&amp;lt;/code&amp;gt; is a mount that is only accessible from the login nodes, it cannot be used for compute work, and it is only available to WUR users.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/archive&amp;lt;/code&amp;gt; is backed up periodically on the same schedule as your [[Home Directory|home directory]] — restorable from roughly a week of history (see [[Backup Policy]]). That backup is separate from the long-term tape archival described below: a backup is a short-term safety copy, while archival moves data off &amp;lt;code&amp;gt;/archive&amp;lt;/code&amp;gt; for long-term keeping.&lt;br /&gt;
&lt;br /&gt;
== Tapeworm ==&lt;br /&gt;
&lt;br /&gt;
Tapeworm (https://tapeworm.anunna.wur.nl/) helps you manage data on &amp;lt;code&amp;gt;/archive&amp;lt;/code&amp;gt; by identifying datasets that are no longer actively used and preparing them for tape archival. The goal is simple: keep our warm storage available for active work, while safely preserving older data on tape.&lt;br /&gt;
&lt;br /&gt;
With Tapeworm, you can:&lt;br /&gt;
* See which of your datasets are being considered for tape archival&lt;br /&gt;
* Review planned moves before they happen&lt;br /&gt;
* Approve, snooze, or block moves when needed&lt;br /&gt;
* Add metadata to help describe archived datasets. The metadata is included on tape and can be used to view/retrieve from tape, should you need to do so in the future&lt;br /&gt;
&lt;br /&gt;
If you do nothing, Tapeworm will continue with the planned move after the review period. That is why we recommend checking your pending actions regularly. You will also receive notification emails about pending actions.&lt;br /&gt;
&lt;br /&gt;
From time to time, the user pages may temporarily be unavailable during maintenance. In that case, Tapeworm will show a short maintenance page instead of the normal interface.&lt;br /&gt;
&lt;br /&gt;
=== How Tapeworm works ===&lt;br /&gt;
&lt;br /&gt;
# Tapeworm scans &amp;lt;code&amp;gt;/archive&amp;lt;/code&amp;gt; and builds an index of paths and filesystem metadata.&lt;br /&gt;
# At the dataset discovery step, it groups those paths into datasets, determines size, owner, and last active use, and makes them available in the GUI. Very small datasets are filtered out and will not be shown.&lt;br /&gt;
# A policy engine checks which discovered datasets look inactive (for example: 60+ days old and larger than 1GB).&lt;br /&gt;
# Matching datasets are marked as &#039;&#039;&#039;planned&#039;&#039;&#039; and shown in your overview.&lt;br /&gt;
# You will be notified by email that Tapeworm plans to move data you own.&lt;br /&gt;
# You can review and change what should happen, or block the move(s) entirely.&lt;br /&gt;
# If no action is taken, after a wait period of 4 weeks, planned moves will become scheduled and then executed.&lt;br /&gt;
# Data is moved to tape, and removed from &amp;lt;code&amp;gt;/archive&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Who sees what? ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Regular users&#039;&#039;&#039; see only their own datasets and actions.&lt;br /&gt;
* &#039;&#039;&#039;Group admins/contacts&#039;&#039;&#039; see data for their configured group(s), in addition to their own data.&lt;br /&gt;
&lt;br /&gt;
=== User pages ===&lt;br /&gt;
&lt;br /&gt;
==== 1) Overview ====&lt;br /&gt;
This is your action page. It shows items that currently need your decision.&lt;br /&gt;
[[File:Screenshot from 2026-03-17 15-19-46.png|none|thumb|1400x1400px]]&lt;br /&gt;
For each candidate, you can:&lt;br /&gt;
* &#039;&#039;&#039;Approve&#039;&#039;&#039;: proceed with the tape move. It will schedule for the next day&lt;br /&gt;
* &#039;&#039;&#039;Deny&#039;&#039;&#039;: stop this move, configure an override for this path. Tapeworm will not try to move this dataset/path again, until you choose to remove the override&lt;br /&gt;
* &#039;&#039;&#039;Snooze&#039;&#039;&#039;: postpone the decision to a future date&lt;br /&gt;
* &#039;&#039;&#039;Edit metadata&#039;&#039;&#039;: add key/value notes for archived data. These values are included on tape and can be used to view/retrieve datasets on tape&lt;br /&gt;
&lt;br /&gt;
You can also select multiple rows and apply actions in bulk.&lt;br /&gt;
&lt;br /&gt;
==== 2) Datasets ====&lt;br /&gt;
This page shows your discovered datasets, their sizes, and last activity times. The application has no concept of what data belongs together and should be considered a &#039;dataset&#039;. If the selections on this page are wrong, you can change how Tapeworm should handle these datasets instead.&lt;br /&gt;
[[File:Screenshot from 2026-03-17 15-20-23.png|none|thumb|1400x1400px]]&lt;br /&gt;
&#039;&#039;&#039;Important:&#039;&#039;&#039;&lt;br /&gt;
* If a dataset already has an active move candidate, scheduling controls are disabled.&lt;br /&gt;
 The dataset list is informational; move decisions are handled through the Schedule page.&lt;br /&gt;
&lt;br /&gt;
==== 3) Schedule ====&lt;br /&gt;
This page shows move candidates and their status over time.&lt;br /&gt;
[[File:Screenshot from 2026-03-17 15-20-58.png|none|thumb|1400x1400px]]&lt;br /&gt;
Common statuses:&lt;br /&gt;
* &#039;&#039;&#039;Planned&#039;&#039;&#039;: under review&lt;br /&gt;
* &#039;&#039;&#039;Scheduled&#039;&#039;&#039;: move is planned for a specific date&lt;br /&gt;
* &#039;&#039;&#039;Executing / Tape staged / On tape&#039;&#039;&#039;: move is in progress or completed&lt;br /&gt;
* &#039;&#039;&#039;Error&#039;&#039;&#039;: move needs admin attention. You may be contacted, maybe we resolve it ourselves :)&lt;br /&gt;
&lt;br /&gt;
Once a move is already executing or completed, schedule-changing actions are locked.&lt;br /&gt;
&lt;br /&gt;
==== 4) Overrides ====&lt;br /&gt;
Overrides tell Tapeworm to ignore specific paths in future planning.&lt;br /&gt;
[[File:Screenshot from 2026-03-17 15-21-49.png|none|thumb|1400x1400px]]&lt;br /&gt;
Use overrides when:&lt;br /&gt;
* a project is still active and needs to remain on /archive&lt;br /&gt;
* policy suggestions are not appropriate for that location&lt;br /&gt;
&lt;br /&gt;
If you agree that the dataset can in principle be moved to tape, but you don&#039;t (yet) know when, you can choose to postpone/snooze the archival instead of overriding it.&lt;br /&gt;
&lt;br /&gt;
Overrides apply to the selected path and everything below it.&lt;br /&gt;
&lt;br /&gt;
==== 5) History ====&lt;br /&gt;
This page shows completed archival moves. When a dataset has been successfully archived and finalized, it is removed from active scheduling pages and moved into history.&lt;br /&gt;
[[File:Screenshot from 2026-03-17 15-24-40.png|none|thumb|1400x1400px]]&lt;br /&gt;
&lt;br /&gt;
=== Group pages ===&lt;br /&gt;
&lt;br /&gt;
Group admins have a separate set of pages for their group scope:&lt;br /&gt;
* &#039;&#039;&#039;Group overview&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Group datasets&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Group schedule&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Group overrides&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Group history&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
If you manage more than one group, you can switch group scope in the selector at the top of the group pages.&lt;br /&gt;
&lt;br /&gt;
=== Notifications (email) ===&lt;br /&gt;
&lt;br /&gt;
Tapeworm sends email updates when actions are pending, dates are approaching, or move state changes happen.&lt;br /&gt;
&lt;br /&gt;
Emails typically include:&lt;br /&gt;
* Dataset path&lt;br /&gt;
* Size&lt;br /&gt;
* Last activity&lt;br /&gt;
* Current status&lt;br /&gt;
* Review/scheduled date&lt;br /&gt;
&lt;br /&gt;
Notification types you may receive:&lt;br /&gt;
* &#039;&#039;&#039;Action required&#039;&#039;&#039;: please approve, snooze, or deny&lt;br /&gt;
* &#039;&#039;&#039;Reminder&#039;&#039;&#039;: review date is approaching&lt;br /&gt;
* &#039;&#039;&#039;Informational&#039;&#039;&#039;: move status changed (for example scheduled, staging, or completed)&lt;br /&gt;
* &#039;&#039;&#039;Escalation&#039;&#039;&#039;: sent to group contacts when no user response is received&lt;br /&gt;
&lt;br /&gt;
Please read these emails carefully — they are your chance to adjust decisions before execution.&lt;br /&gt;
&lt;br /&gt;
=== Best practices for users ===&lt;br /&gt;
&lt;br /&gt;
* Check your &#039;&#039;&#039;Overview&#039;&#039;&#039; page regularly&lt;br /&gt;
* Use &#039;&#039;&#039;Snooze&#039;&#039;&#039; if you need time to validate impact&lt;br /&gt;
* Add &#039;&#039;&#039;metadata&#039;&#039;&#039; when approving important datasets&lt;br /&gt;
* Use &#039;&#039;&#039;Overrides&#039;&#039;&#039; for known and persisting exceptions&lt;br /&gt;
* If unsure, contact HPC support before a scheduled move date&lt;br /&gt;
&lt;br /&gt;
=== Tapeworm FAQ ===&lt;br /&gt;
&lt;br /&gt;
==== What happens if I do nothing? ====&lt;br /&gt;
Planned items can move forward automatically after the review window (4 weeks).&lt;br /&gt;
&lt;br /&gt;
==== Can I undo after tape staging? ====&lt;br /&gt;
Not directly in Tapeworm. Retrieval is done via the tape/iRODS workflow. See: https://irods.wur.nl/userguide/tape_retrieval/&lt;br /&gt;
&lt;br /&gt;
==== What does &amp;quot;completed&amp;quot; mean? ====&lt;br /&gt;
Completed means Tapeworm saw the tape workflow finish and finalized the move. Before finalization, the system verifies the archive in iRODS and only then removes the staged source copy.&lt;br /&gt;
&lt;br /&gt;
==== Why is an action button disabled? ====&lt;br /&gt;
Usually because the move has already progressed (executing/staged/on tape/error), so schedule edits are no longer valid.&lt;br /&gt;
&lt;br /&gt;
==== Why do some paths on /archive/ not appear as datasets in Tapeworm? ====&lt;br /&gt;
Tapeworm only shows paths that are discovered as datasets and pass a minimum-size threshold. Very small paths, single text files, and other tiny items are intentionally filtered out.&lt;br /&gt;
&lt;br /&gt;
=== Need help? ===&lt;br /&gt;
If anything is unclear, or you think a move is incorrect but you cannot alter it in the provided GUI, please open an HPC support ticket.&lt;br /&gt;
&lt;br /&gt;
== Manual tape access with iRODS besides Tapeworm ==&lt;br /&gt;
&lt;br /&gt;
Anunna hosts its own iRODS instance, with which you can push data manually to the WUR tape storage for archiving. For general usage information, see https://irods.wur.nl/. The best course of action is to loosely follow the course using your own data, and use your personal space for data upload and transfer to tape.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Be sure to check whether the data is correctly stored on tape before you remove your data.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
On Anunna there are some differences and additions to the linked site:&lt;br /&gt;
&lt;br /&gt;
* The zone is &amp;lt;code&amp;gt;HPC&amp;lt;/code&amp;gt;.&lt;br /&gt;
* With &amp;lt;code&amp;gt;iinit&amp;lt;/code&amp;gt; you can initialise the iRODS environment. Use your account password.&lt;br /&gt;
* With &amp;lt;code&amp;gt;ils&amp;lt;/code&amp;gt; you can see your available iRODS collections. You need that as a destination location for &amp;lt;code&amp;gt;itape&amp;lt;/code&amp;gt;.&lt;br /&gt;
* We have a function to ease uploads (use &amp;lt;code&amp;gt;-h&amp;lt;/code&amp;gt; for help): &amp;lt;code&amp;gt;itape&amp;lt;/code&amp;gt;.&lt;br /&gt;
* We have aliases to ease checking the status of your archive process (it takes a while): &amp;lt;code&amp;gt;itapestat&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;itapestatnp&amp;lt;/code&amp;gt;. The first is for human use — it shows a paginated status of all your files. The latter dumps all the info, so you can e.g. use grep to filter.&lt;br /&gt;
* If you remove data with &amp;lt;code&amp;gt;irm&amp;lt;/code&amp;gt; within iRODS, the data isn&#039;t actually removed but moved to a trash bin. The advantage is that you can retrieve it if the removal was in error; the disadvantage is that the data will keep costing money. To empty it, see &amp;lt;code&amp;gt;irmtrash -h&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Because of hardware limitations on the backend tape storage, the size limit per file for our tape archive is 5 TB.&lt;br /&gt;
&lt;br /&gt;
== Retrieving data from tape ==&lt;br /&gt;
As the tape storage is maintained by a different team, it is best to follow their documentation on retrieval.&lt;br /&gt;
&lt;br /&gt;
For that, see here: https://irods.wur.nl/userguide/archiving_research_data_using_icommands/&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Storage Systems Overview]]&lt;br /&gt;
* [[Backup Policy]]&lt;br /&gt;
* [[Compute Storage]]&lt;br /&gt;
* [[Tariffs|Costs associated with resource usage]]&lt;br /&gt;
&lt;br /&gt;
== External links ==&lt;br /&gt;
* [http://wiki.lustre.org/index.php/Main_Page Lustre website]&lt;/div&gt;</summary>
		<author><name>Honfi001</name></author>
	</entry>
	<entry>
		<id>https://wiki.anunna.wur.nl/index.php?title=Archival_Storage&amp;diff=3080</id>
		<title>Archival Storage</title>
		<link rel="alternate" type="text/html" href="https://wiki.anunna.wur.nl/index.php?title=Archival_Storage&amp;diff=3080"/>
		<updated>2026-08-25T12:43:47Z</updated>

		<summary type="html">&lt;p&gt;Honfi001: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;code&amp;gt;/archive&amp;lt;/code&amp;gt; is Anunna&#039;s warm storage tier for data you want to keep but are not actively computing on. Storing data there costs less than on [[Compute Storage|Lustre]], and datasets that have not been used for a long time are moved on to long-term tape archive — automatically, through the [[#Tapeworm|Tapeworm]] service — to keep the warm tier free for active work.&lt;br /&gt;
&lt;br /&gt;
== The /archive filesystem ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/archive&amp;lt;/code&amp;gt; is a mount that is only accessible from the login nodes, it cannot be used for compute work, and it is only available to WUR users.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/archive&amp;lt;/code&amp;gt; is backed up periodically on the same schedule as your [[Home Directory|home directory]] — restorable from roughly a week of history (see [[Backup Policy]]). That backup is separate from the long-term tape archival described below: a backup is a short-term safety copy, while archival moves data off &amp;lt;code&amp;gt;/archive&amp;lt;/code&amp;gt; for long-term keeping.&lt;br /&gt;
&lt;br /&gt;
== Tapeworm ==&lt;br /&gt;
&lt;br /&gt;
Tapeworm (https://tapeworm.anunna.wur.nl/) helps you manage data on &amp;lt;code&amp;gt;/archive&amp;lt;/code&amp;gt; by identifying datasets that are no longer actively used and preparing them for tape archival. The goal is simple: keep our warm storage available for active work, while safely preserving older data on tape.&lt;br /&gt;
&lt;br /&gt;
With Tapeworm, you can:&lt;br /&gt;
* See which of your datasets are being considered for tape archival&lt;br /&gt;
* Review planned moves before they happen&lt;br /&gt;
* Approve, snooze, or block moves when needed&lt;br /&gt;
* Add metadata to help describe archived datasets. The metadata is included on tape and can be used to view/retrieve from tape, should you need to do so in the future&lt;br /&gt;
&lt;br /&gt;
If you do nothing, Tapeworm will continue with the planned move after the review period. That is why we recommend checking your pending actions regularly. You will also receive notification emails about pending actions.&lt;br /&gt;
&lt;br /&gt;
From time to time, the user pages may temporarily be unavailable during maintenance. In that case, Tapeworm will show a short maintenance page instead of the normal interface.&lt;br /&gt;
&lt;br /&gt;
=== How Tapeworm works ===&lt;br /&gt;
&lt;br /&gt;
# Tapeworm scans &amp;lt;code&amp;gt;/archive&amp;lt;/code&amp;gt; and builds an index of paths and filesystem metadata.&lt;br /&gt;
# At the dataset discovery step, it groups those paths into datasets, determines size, owner, and last active use, and makes them available in the GUI. Very small datasets are filtered out and will not be shown.&lt;br /&gt;
# A policy engine checks which discovered datasets look inactive (for example: 60+ days old and larger than 1GB).&lt;br /&gt;
# Matching datasets are marked as &#039;&#039;&#039;planned&#039;&#039;&#039; and shown in your overview.&lt;br /&gt;
# You will be notified by email that Tapeworm plans to move data you own.&lt;br /&gt;
# You can review and change what should happen, or block the move(s) entirely.&lt;br /&gt;
# If no action is taken, after a wait period of 4 weeks, planned moves will become scheduled and then executed.&lt;br /&gt;
# Data is moved to tape, and removed from &amp;lt;code&amp;gt;/archive&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Who sees what? ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Regular users&#039;&#039;&#039; see only their own datasets and actions.&lt;br /&gt;
* &#039;&#039;&#039;Group admins/contacts&#039;&#039;&#039; see data for their configured group(s), in addition to their own data.&lt;br /&gt;
&lt;br /&gt;
=== User pages ===&lt;br /&gt;
&lt;br /&gt;
==== 1) Overview ====&lt;br /&gt;
This is your action page. It shows items that currently need your decision.&lt;br /&gt;
[[File:Screenshot from 2026-03-17 15-19-46.png|none|thumb|1400x1400px]]&lt;br /&gt;
For each candidate, you can:&lt;br /&gt;
* &#039;&#039;&#039;Approve&#039;&#039;&#039;: proceed with the tape move. It will schedule for the next day&lt;br /&gt;
* &#039;&#039;&#039;Deny&#039;&#039;&#039;: stop this move, configure an override for this path. Tapeworm will not try to move this dataset/path again, until you choose to remove the override&lt;br /&gt;
* &#039;&#039;&#039;Snooze&#039;&#039;&#039;: postpone the decision to a future date&lt;br /&gt;
* &#039;&#039;&#039;Edit metadata&#039;&#039;&#039;: add key/value notes for archived data. These values are included on tape and can be used to view/retrieve datasets on tape&lt;br /&gt;
&lt;br /&gt;
You can also select multiple rows and apply actions in bulk.&lt;br /&gt;
&lt;br /&gt;
==== 2) Datasets ====&lt;br /&gt;
This page shows your discovered datasets, their sizes, and last activity times. The application has no concept of what data belongs together and should be considered a &#039;dataset&#039;. If the selections on this page are wrong, you can change how Tapeworm should handle these datasets instead.&lt;br /&gt;
[[File:Screenshot from 2026-03-17 15-20-23.png|none|thumb|1400x1400px]]&lt;br /&gt;
Important:&lt;br /&gt;
* If a dataset already has an active move candidate, scheduling controls are disabled.&lt;br /&gt;
 The dataset list is informational; move decisions are handled through the Schedule page.&lt;br /&gt;
&lt;br /&gt;
==== 3) Schedule ====&lt;br /&gt;
This page shows move candidates and their status over time.&lt;br /&gt;
[[File:Screenshot from 2026-03-17 15-20-58.png|none|thumb|1400x1400px]]&lt;br /&gt;
Common statuses:&lt;br /&gt;
* &#039;&#039;&#039;Planned&#039;&#039;&#039;: under review&lt;br /&gt;
* &#039;&#039;&#039;Scheduled&#039;&#039;&#039;: move is planned for a specific date&lt;br /&gt;
* &#039;&#039;&#039;Executing / Tape staged / On tape&#039;&#039;&#039;: move is in progress or completed&lt;br /&gt;
* &#039;&#039;&#039;Error&#039;&#039;&#039;: move needs admin attention. You may be contacted, maybe we resolve it ourselves :)&lt;br /&gt;
&lt;br /&gt;
Once a move is already executing or completed, schedule-changing actions are locked.&lt;br /&gt;
&lt;br /&gt;
==== 4) Overrides ====&lt;br /&gt;
Overrides tell Tapeworm to ignore specific paths in future planning.&lt;br /&gt;
[[File:Screenshot from 2026-03-17 15-21-49.png|none|thumb|1400x1400px]]&lt;br /&gt;
Use overrides when:&lt;br /&gt;
* a project is still active and needs to remain on /archive&lt;br /&gt;
* policy suggestions are not appropriate for that location&lt;br /&gt;
&lt;br /&gt;
If you agree that the dataset can in principle be moved to tape, but you don&#039;t (yet) know when, you can choose to postpone/snooze the archival instead of overriding it.&lt;br /&gt;
&lt;br /&gt;
Overrides apply to the selected path and everything below it.&lt;br /&gt;
&lt;br /&gt;
==== 5) History ====&lt;br /&gt;
This page shows completed archival moves. When a dataset has been successfully archived and finalized, it is removed from active scheduling pages and moved into history.&lt;br /&gt;
[[File:Screenshot from 2026-03-17 15-24-40.png|none|thumb|1400x1400px]]&lt;br /&gt;
&lt;br /&gt;
=== Group pages ===&lt;br /&gt;
&lt;br /&gt;
Group admins have a separate set of pages for their group scope:&lt;br /&gt;
* &#039;&#039;&#039;Group overview&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Group datasets&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Group schedule&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Group overrides&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Group history&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
If you manage more than one group, you can switch group scope in the selector at the top of the group pages.&lt;br /&gt;
&lt;br /&gt;
=== Notifications (email) ===&lt;br /&gt;
&lt;br /&gt;
Tapeworm sends email updates when actions are pending, dates are approaching, or move state changes happen.&lt;br /&gt;
&lt;br /&gt;
Emails typically include:&lt;br /&gt;
* Dataset path&lt;br /&gt;
* Size&lt;br /&gt;
* Last activity&lt;br /&gt;
* Current status&lt;br /&gt;
* Review/scheduled date&lt;br /&gt;
&lt;br /&gt;
Notification types you may receive:&lt;br /&gt;
* &#039;&#039;&#039;Action required&#039;&#039;&#039;: please approve, snooze, or deny&lt;br /&gt;
* &#039;&#039;&#039;Reminder&#039;&#039;&#039;: review date is approaching&lt;br /&gt;
* &#039;&#039;&#039;Informational&#039;&#039;&#039;: move status changed (for example scheduled, staging, or completed)&lt;br /&gt;
* &#039;&#039;&#039;Escalation&#039;&#039;&#039;: sent to group contacts when no user response is received&lt;br /&gt;
&lt;br /&gt;
Please read these emails carefully — they are your chance to adjust decisions before execution.&lt;br /&gt;
&lt;br /&gt;
=== Best practices for users ===&lt;br /&gt;
&lt;br /&gt;
* Check your &#039;&#039;&#039;Overview&#039;&#039;&#039; page regularly&lt;br /&gt;
* Use &#039;&#039;&#039;Snooze&#039;&#039;&#039; if you need time to validate impact&lt;br /&gt;
* Add &#039;&#039;&#039;metadata&#039;&#039;&#039; when approving important datasets&lt;br /&gt;
* Use &#039;&#039;&#039;Overrides&#039;&#039;&#039; for known and persisting exceptions&lt;br /&gt;
* If unsure, contact HPC support before a scheduled move date&lt;br /&gt;
&lt;br /&gt;
=== Tapeworm FAQ ===&lt;br /&gt;
&lt;br /&gt;
==== What happens if I do nothing? ====&lt;br /&gt;
Planned items can move forward automatically after the review window (4 weeks).&lt;br /&gt;
&lt;br /&gt;
==== Can I undo after tape staging? ====&lt;br /&gt;
Not directly in Tapeworm. Retrieval is done via the tape/iRODS workflow. See: https://irods.wur.nl/userguide/tape_retrieval/&lt;br /&gt;
&lt;br /&gt;
==== What does &amp;quot;completed&amp;quot; mean? ====&lt;br /&gt;
Completed means Tapeworm saw the tape workflow finish and finalized the move. Before finalization, the system verifies the archive in iRODS and only then removes the staged source copy.&lt;br /&gt;
&lt;br /&gt;
==== Why is an action button disabled? ====&lt;br /&gt;
Usually because the move has already progressed (executing/staged/on tape/error), so schedule edits are no longer valid.&lt;br /&gt;
&lt;br /&gt;
==== Why do some paths on /archive/ not appear as datasets in Tapeworm? ====&lt;br /&gt;
Tapeworm only shows paths that are discovered as datasets and pass a minimum-size threshold. Very small paths, single text files, and other tiny items are intentionally filtered out.&lt;br /&gt;
&lt;br /&gt;
=== Need help? ===&lt;br /&gt;
If anything is unclear, or you think a move is incorrect but you cannot alter it in the provided GUI, please open an HPC support ticket.&lt;br /&gt;
&lt;br /&gt;
== Manual tape access with iRODS besides Tapeworm ==&lt;br /&gt;
&lt;br /&gt;
Anunna hosts its own iRODS instance, with which you can push data manually to the WUR tape storage for archiving. For general usage information, see https://irods.wur.nl/. The best course of action is to loosely follow the course using your own data, and use your personal space for data upload and transfer to tape.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Be sure to check whether the data is correctly stored on tape before you remove your data.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
On Anunna there are some differences and additions to the linked site:&lt;br /&gt;
&lt;br /&gt;
* The zone is &amp;lt;code&amp;gt;HPC&amp;lt;/code&amp;gt;.&lt;br /&gt;
* With &amp;lt;code&amp;gt;iinit&amp;lt;/code&amp;gt; you can initialise the iRODS environment. Use your account password.&lt;br /&gt;
* With &amp;lt;code&amp;gt;ils&amp;lt;/code&amp;gt; you can see your available iRODS collections. You need that as a destination location for &amp;lt;code&amp;gt;itape&amp;lt;/code&amp;gt;.&lt;br /&gt;
* We have a function to ease uploads (use &amp;lt;code&amp;gt;-h&amp;lt;/code&amp;gt; for help): &amp;lt;code&amp;gt;itape&amp;lt;/code&amp;gt;.&lt;br /&gt;
* We have aliases to ease checking the status of your archive process (it takes a while): &amp;lt;code&amp;gt;itapestat&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;itapestatnp&amp;lt;/code&amp;gt;. The first is for human use — it shows a paginated status of all your files. The latter dumps all the info, so you can e.g. use grep to filter.&lt;br /&gt;
* If you remove data with &amp;lt;code&amp;gt;irm&amp;lt;/code&amp;gt; within iRODS, the data isn&#039;t actually removed but moved to a trash bin. The advantage is that you can retrieve it if the removal was in error; the disadvantage is that the data will keep costing money. To empty it, see &amp;lt;code&amp;gt;irmtrash -h&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Because of hardware limitations on the backend tape storage, the size limit per file for our tape archive is 5 TB.&lt;br /&gt;
&lt;br /&gt;
== Retrieving data from tape ==&lt;br /&gt;
As the tape storage is maintained by a different team, it is best to follow their documentation on retrieval.&lt;br /&gt;
&lt;br /&gt;
For that, see here: https://irods.wur.nl/userguide/archiving_research_data_using_icommands/&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Storage Systems Overview]]&lt;br /&gt;
* [[Backup Policy]]&lt;br /&gt;
* [[Compute Storage]]&lt;br /&gt;
* [[Tariffs|Costs associated with resource usage]]&lt;br /&gt;
&lt;br /&gt;
== External links ==&lt;br /&gt;
* [http://wiki.lustre.org/index.php/Main_Page Lustre website]&lt;/div&gt;</summary>
		<author><name>Honfi001</name></author>
	</entry>
	<entry>
		<id>https://wiki.anunna.wur.nl/index.php?title=Archival_Storage&amp;diff=3079</id>
		<title>Archival Storage</title>
		<link rel="alternate" type="text/html" href="https://wiki.anunna.wur.nl/index.php?title=Archival_Storage&amp;diff=3079"/>
		<updated>2026-08-25T12:17:33Z</updated>

		<summary type="html">&lt;p&gt;Honfi001: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;code&amp;gt;/archive&amp;lt;/code&amp;gt; is Anunna&#039;s warm storage tier for data you want to keep but are not actively computing on. Storing data there costs less than on [[Compute Storage|Lustre]], and datasets that have not been used for a long time are moved on to long-term tape archive — automatically, through the [[#Tapeworm|Tapeworm]] service — to keep the warm tier free for active work.&lt;br /&gt;
&lt;br /&gt;
== The /archive filesystem ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/archive&amp;lt;/code&amp;gt; is a mount that is only accessible from the login nodes, it cannot be used for compute work, and it is only available to WUR users.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/archive&amp;lt;/code&amp;gt; is backed up periodically on the same schedule as your [[Home Directory|home directory]] — restorable from roughly a week of history (see [[Backup Policy]]). That backup is separate from the long-term tape archival described below: a backup is a short-term safety copy, while archival moves data off &amp;lt;code&amp;gt;/archive&amp;lt;/code&amp;gt; for long-term keeping.&lt;br /&gt;
&lt;br /&gt;
== Tapeworm ==&lt;br /&gt;
&lt;br /&gt;
Tapeworm (https://tapeworm.anunna.wur.nl/) helps you manage data on &amp;lt;code&amp;gt;/archive&amp;lt;/code&amp;gt; by identifying datasets that are no longer actively used and preparing them for tape archival. The goal is simple: keep our warm storage available for active work, while safely preserving older data on tape.&lt;br /&gt;
&lt;br /&gt;
With Tapeworm, you can:&lt;br /&gt;
* See which of your datasets are being considered for tape archival&lt;br /&gt;
* Review planned moves before they happen&lt;br /&gt;
* Approve, snooze, or block moves when needed&lt;br /&gt;
* Add metadata to help describe archived datasets. The metadata is included on tape and can be used to view/retrieve from tape, should you need to do so in the future&lt;br /&gt;
&lt;br /&gt;
If you do nothing, Tapeworm will continue with the planned move after the review period. That is why we recommend checking your pending actions regularly. You will also receive notification emails about pending actions.&lt;br /&gt;
&lt;br /&gt;
From time to time, the user pages may temporarily be unavailable during maintenance. In that case, Tapeworm will show a short maintenance page instead of the normal interface.&lt;br /&gt;
&lt;br /&gt;
=== How Tapeworm works ===&lt;br /&gt;
&lt;br /&gt;
# Tapeworm scans &amp;lt;code&amp;gt;/archive&amp;lt;/code&amp;gt; and builds an index of paths and filesystem metadata.&lt;br /&gt;
# At the dataset discovery step, it groups those paths into datasets, determines size, owner, and last active use, and makes them available in the GUI. Very small datasets are filtered out and will not be shown.&lt;br /&gt;
# A policy engine checks which discovered datasets look inactive (for example: 60+ days old and larger than 1GB).&lt;br /&gt;
# Matching datasets are marked as &#039;&#039;&#039;planned&#039;&#039;&#039; and shown in your overview.&lt;br /&gt;
# You will be notified by email that Tapeworm plans to move data you own.&lt;br /&gt;
# You can review and change what should happen, or block the move(s) entirely.&lt;br /&gt;
# If no action is taken, after a wait period of 4 weeks, planned moves can become scheduled and then executed.&lt;br /&gt;
# Data is moved to tape, and removed from &amp;lt;code&amp;gt;/archive&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Who sees what? ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Regular users&#039;&#039;&#039; see only their own datasets and actions.&lt;br /&gt;
* &#039;&#039;&#039;Group admins/contacts&#039;&#039;&#039; see data for their configured group(s), in addition to their own data.&lt;br /&gt;
&lt;br /&gt;
=== User pages ===&lt;br /&gt;
&lt;br /&gt;
==== 1) Overview ====&lt;br /&gt;
This is your action page. It shows items that currently need your decision.&lt;br /&gt;
[[File:Screenshot from 2026-03-17 15-19-46.png|none|thumb|1400x1400px]]&lt;br /&gt;
For each candidate, you can:&lt;br /&gt;
* &#039;&#039;&#039;Approve&#039;&#039;&#039;: proceed with the tape move. It will schedule for the next day&lt;br /&gt;
* &#039;&#039;&#039;Deny&#039;&#039;&#039;: stop this move, configure an override for this path. Tapeworm will not try to move this dataset/path again, until you choose to remove the override&lt;br /&gt;
* &#039;&#039;&#039;Snooze&#039;&#039;&#039;: postpone the decision to a future date&lt;br /&gt;
* &#039;&#039;&#039;Edit metadata&#039;&#039;&#039;: add key/value notes for archived data. These values are included on tape and can be used to view/retrieve datasets on tape&lt;br /&gt;
&lt;br /&gt;
You can also select multiple rows and apply actions in bulk.&lt;br /&gt;
&lt;br /&gt;
==== 2) Datasets ====&lt;br /&gt;
This page shows your discovered datasets, their sizes, and last activity times. The application has no concept of what data belongs together and should be considered a &#039;dataset&#039;. If the selections on this page are wrong, you can change how Tapeworm should handle these datasets instead.&lt;br /&gt;
[[File:Screenshot from 2026-03-17 15-20-23.png|none|thumb|1400x1400px]]&lt;br /&gt;
Important:&lt;br /&gt;
* If a dataset already has an active move candidate, scheduling controls are disabled.&lt;br /&gt;
 The dataset list is informational; move decisions are handled through the Schedule page.&lt;br /&gt;
&lt;br /&gt;
==== 3) Schedule ====&lt;br /&gt;
This page shows move candidates and their status over time.&lt;br /&gt;
[[File:Screenshot from 2026-03-17 15-20-58.png|none|thumb|1400x1400px]]&lt;br /&gt;
Common statuses:&lt;br /&gt;
* &#039;&#039;&#039;Planned&#039;&#039;&#039;: under review&lt;br /&gt;
* &#039;&#039;&#039;Scheduled&#039;&#039;&#039;: move is planned for a specific date&lt;br /&gt;
* &#039;&#039;&#039;Executing / Tape staged / On tape&#039;&#039;&#039;: move is in progress or completed&lt;br /&gt;
* &#039;&#039;&#039;Error&#039;&#039;&#039;: move needs admin attention. You may be contacted, maybe we resolve it ourselves :)&lt;br /&gt;
&lt;br /&gt;
Once a move is already executing or completed, schedule-changing actions are locked.&lt;br /&gt;
&lt;br /&gt;
==== 4) Overrides ====&lt;br /&gt;
Overrides tell Tapeworm to ignore specific paths in future planning.&lt;br /&gt;
[[File:Screenshot from 2026-03-17 15-21-49.png|none|thumb|1400x1400px]]&lt;br /&gt;
Use overrides when:&lt;br /&gt;
* a project is still active and needs to remain on /archive&lt;br /&gt;
* policy suggestions are not appropriate for that location&lt;br /&gt;
&lt;br /&gt;
If you agree that the dataset can in principle be moved to tape, but you don&#039;t (yet) know when, you can choose to postpone/snooze the archival instead of overriding it.&lt;br /&gt;
&lt;br /&gt;
Overrides apply to the selected path and everything below it.&lt;br /&gt;
&lt;br /&gt;
==== 5) History ====&lt;br /&gt;
This page shows completed archival moves. When a dataset has been successfully archived and finalized, it is removed from active scheduling pages and moved into history.&lt;br /&gt;
[[File:Screenshot from 2026-03-17 15-24-40.png|none|thumb|1400x1400px]]&lt;br /&gt;
&lt;br /&gt;
=== Group pages ===&lt;br /&gt;
&lt;br /&gt;
Group admins have a separate set of pages for their group scope:&lt;br /&gt;
* &#039;&#039;&#039;Group overview&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Group datasets&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Group schedule&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Group overrides&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Group history&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
If you manage more than one group, you can switch group scope in the selector at the top of the group pages.&lt;br /&gt;
&lt;br /&gt;
=== Notifications (email) ===&lt;br /&gt;
&lt;br /&gt;
Tapeworm sends email updates when actions are pending, dates are approaching, or move state changes happen.&lt;br /&gt;
&lt;br /&gt;
Emails typically include:&lt;br /&gt;
* Dataset path&lt;br /&gt;
* Size&lt;br /&gt;
* Last activity&lt;br /&gt;
* Current status&lt;br /&gt;
* Review/scheduled date&lt;br /&gt;
&lt;br /&gt;
Notification types you may receive:&lt;br /&gt;
* &#039;&#039;&#039;Action required&#039;&#039;&#039;: please approve, snooze, or deny&lt;br /&gt;
* &#039;&#039;&#039;Reminder&#039;&#039;&#039;: review date is approaching&lt;br /&gt;
* &#039;&#039;&#039;Informational&#039;&#039;&#039;: move status changed (for example scheduled, staging, or completed)&lt;br /&gt;
* &#039;&#039;&#039;Escalation&#039;&#039;&#039;: sent to group contacts when no user response is received&lt;br /&gt;
&lt;br /&gt;
Please read these emails carefully — they are your chance to adjust decisions before execution.&lt;br /&gt;
&lt;br /&gt;
=== Best practices for users ===&lt;br /&gt;
&lt;br /&gt;
* Check your &#039;&#039;&#039;Overview&#039;&#039;&#039; page regularly&lt;br /&gt;
* Use &#039;&#039;&#039;Snooze&#039;&#039;&#039; if you need time to validate impact&lt;br /&gt;
* Add &#039;&#039;&#039;metadata&#039;&#039;&#039; when approving important datasets&lt;br /&gt;
* Use &#039;&#039;&#039;Overrides&#039;&#039;&#039; for known and persisting exceptions&lt;br /&gt;
* If unsure, contact HPC support before a scheduled move date&lt;br /&gt;
&lt;br /&gt;
=== Tapeworm FAQ ===&lt;br /&gt;
&lt;br /&gt;
==== What happens if I do nothing? ====&lt;br /&gt;
Planned items can move forward automatically after the review window (4 weeks).&lt;br /&gt;
&lt;br /&gt;
==== Can I undo after tape staging? ====&lt;br /&gt;
Not directly in Tapeworm. Retrieval is done via the tape/iRODS workflow. See: https://irods.wur.nl/userguide/tape_retrieval/&lt;br /&gt;
&lt;br /&gt;
==== What does &amp;quot;completed&amp;quot; mean? ====&lt;br /&gt;
Completed means Tapeworm saw the tape workflow finish and finalized the move. Before finalization, the system verifies the archive in iRODS and only then removes the staged source copy.&lt;br /&gt;
&lt;br /&gt;
==== Why is an action button disabled? ====&lt;br /&gt;
Usually because the move has already progressed (executing/staged/on tape/error), so schedule edits are no longer valid.&lt;br /&gt;
&lt;br /&gt;
==== Why do some paths on /archive/ not appear as datasets in Tapeworm? ====&lt;br /&gt;
Tapeworm only shows paths that are discovered as datasets and pass a minimum-size threshold. Very small paths, single text files, and other tiny items are intentionally filtered out.&lt;br /&gt;
&lt;br /&gt;
=== Need help? ===&lt;br /&gt;
If anything is unclear, or you think a move is incorrect but you cannot alter it in the provided GUI, please open an HPC support ticket.&lt;br /&gt;
&lt;br /&gt;
== Manual tape access with iRODS besides Tapeworm ==&lt;br /&gt;
&lt;br /&gt;
Anunna hosts its own iRODS instance, with which you can push data manually to the WUR tape storage for archiving. For general usage information, see https://irods.wur.nl/. The best course of action is to loosely follow the course using your own data, and use your personal space for data upload and transfer to tape.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Be sure to check whether the data is correctly stored on tape before you remove your data.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
On Anunna there are some differences and additions to the linked site:&lt;br /&gt;
&lt;br /&gt;
* The zone is &amp;lt;code&amp;gt;HPC&amp;lt;/code&amp;gt;.&lt;br /&gt;
* With &amp;lt;code&amp;gt;iinit&amp;lt;/code&amp;gt; you can initialise the iRODS environment. Use your account password.&lt;br /&gt;
* With &amp;lt;code&amp;gt;ils&amp;lt;/code&amp;gt; you can see your available iRODS collections. You need that as a destination location for &amp;lt;code&amp;gt;itape&amp;lt;/code&amp;gt;.&lt;br /&gt;
* We have a function to ease uploads (use &amp;lt;code&amp;gt;-h&amp;lt;/code&amp;gt; for help): &amp;lt;code&amp;gt;itape&amp;lt;/code&amp;gt;.&lt;br /&gt;
* We have aliases to ease checking the status of your archive process (it takes a while): &amp;lt;code&amp;gt;itapestat&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;itapestatnp&amp;lt;/code&amp;gt;. The first is for human use — it shows a paginated status of all your files. The latter dumps all the info, so you can e.g. use grep to filter.&lt;br /&gt;
* If you remove data with &amp;lt;code&amp;gt;irm&amp;lt;/code&amp;gt; within iRODS, the data isn&#039;t actually removed but moved to a trash bin. The advantage is that you can retrieve it if the removal was in error; the disadvantage is that the data will keep costing money. To empty it, see &amp;lt;code&amp;gt;irmtrash -h&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Because of hardware limitations on the backend tape storage, the size limit per file for our tape archive is 5 TB.&lt;br /&gt;
&lt;br /&gt;
== Retrieving data from tape ==&lt;br /&gt;
As the tape storage is maintained by a different team, it is best to follow their documentation on retrieval.&lt;br /&gt;
&lt;br /&gt;
For that, see here: https://irods.wur.nl/userguide/archiving_research_data_using_icommands/&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Storage Systems Overview]]&lt;br /&gt;
* [[Backup Policy]]&lt;br /&gt;
* [[Compute Storage]]&lt;br /&gt;
* [[Tariffs|Costs associated with resource usage]]&lt;br /&gt;
&lt;br /&gt;
== External links ==&lt;br /&gt;
* [http://wiki.lustre.org/index.php/Main_Page Lustre website]&lt;/div&gt;</summary>
		<author><name>Honfi001</name></author>
	</entry>
	<entry>
		<id>https://wiki.anunna.wur.nl/index.php?title=Archival_Storage&amp;diff=3078</id>
		<title>Archival Storage</title>
		<link rel="alternate" type="text/html" href="https://wiki.anunna.wur.nl/index.php?title=Archival_Storage&amp;diff=3078"/>
		<updated>2026-08-25T12:16:29Z</updated>

		<summary type="html">&lt;p&gt;Honfi001: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;code&amp;gt;/archive&amp;lt;/code&amp;gt; is Anunna&#039;s warm storage tier for data you want to keep but are not actively computing on. Storing data there costs less than on [[Compute Storage|Lustre]], and datasets that have not been used for a long time are moved on to long-term tape archive — automatically, through the [[#Tapeworm|Tapeworm]] service — to keep the warm tier free for active work.&lt;br /&gt;
&lt;br /&gt;
== The /archive filesystem ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/archive&amp;lt;/code&amp;gt; is a mount that is only accessible from the login nodes, it cannot be used for compute work, and it is only available to WUR users.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/archive&amp;lt;/code&amp;gt; is backed up periodically on the same schedule as your [[Home Directory|home directory]] — restorable from roughly a week of history (see [[Backup Policy]]). That backup is separate from the long-term tape archival described below: a backup is a short-term safety copy, while archival moves data off &amp;lt;code&amp;gt;/archive&amp;lt;/code&amp;gt; for long-term keeping.&lt;br /&gt;
&lt;br /&gt;
== Tapeworm ==&lt;br /&gt;
&lt;br /&gt;
Tapeworm (https://tapeworm.anunna.wur.nl/) helps you manage data on &amp;lt;code&amp;gt;/archive&amp;lt;/code&amp;gt; by identifying datasets that are no longer actively used and preparing them for tape archival. The goal is simple: keep our warm storage available for active work, while safely preserving older data on tape.&lt;br /&gt;
&lt;br /&gt;
With Tapeworm, you can:&lt;br /&gt;
* See which of your datasets are being considered for tape archival&lt;br /&gt;
* Review planned moves before they happen&lt;br /&gt;
* Approve, snooze, or block moves when needed&lt;br /&gt;
* Add metadata to help describe archived datasets. The metadata is included on tape and can be used to view/retrieve from tape, should you need to do so in the future&lt;br /&gt;
&lt;br /&gt;
If you do nothing, Tapeworm will continue with the planned move after the review period. That is why we recommend checking your pending actions regularly. You will also receive notification emails about pending actions.&lt;br /&gt;
&lt;br /&gt;
From time to time, the user pages may temporarily be unavailable during maintenance. In that case, Tapeworm will show a short maintenance page instead of the normal interface.&lt;br /&gt;
&lt;br /&gt;
=== How Tapeworm works ===&lt;br /&gt;
&lt;br /&gt;
# Tapeworm scans &amp;lt;code&amp;gt;/archive&amp;lt;/code&amp;gt; and builds an index of paths and filesystem metadata.&lt;br /&gt;
# At the dataset discovery step, it groups those paths into datasets, determines size, owner, and last active use, and makes them available in the GUI. Very small datasets are filtered out and will not be shown.&lt;br /&gt;
# A policy engine checks which discovered datasets look stale (for example: 60+ days old and larger than 1GB).&lt;br /&gt;
# Matching datasets are marked as &#039;&#039;&#039;planned&#039;&#039;&#039; and shown in your overview.&lt;br /&gt;
# You will be notified by email that Tapeworm plans to move data you own.&lt;br /&gt;
# You can review and change what should happen, or block the move(s) entirely.&lt;br /&gt;
# If no action is taken, after a wait period of 4 weeks, planned moves can become scheduled and then executed.&lt;br /&gt;
# Data is moved to tape, and removed from &amp;lt;code&amp;gt;/archive&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Who sees what? ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Regular users&#039;&#039;&#039; see only their own datasets and actions.&lt;br /&gt;
* &#039;&#039;&#039;Group admins/contacts&#039;&#039;&#039; see data for their configured group(s), in addition to their own data.&lt;br /&gt;
&lt;br /&gt;
=== User pages ===&lt;br /&gt;
&lt;br /&gt;
==== 1) Overview ====&lt;br /&gt;
This is your action page. It shows items that currently need your decision.&lt;br /&gt;
[[File:Screenshot from 2026-03-17 15-19-46.png|none|thumb|1400x1400px]]&lt;br /&gt;
For each candidate, you can:&lt;br /&gt;
* &#039;&#039;&#039;Approve&#039;&#039;&#039;: proceed with the tape move. It will schedule for the next day&lt;br /&gt;
* &#039;&#039;&#039;Deny&#039;&#039;&#039;: stop this move, configure an override for this path. Tapeworm will not try to move this dataset/path again, until you choose to remove the override&lt;br /&gt;
* &#039;&#039;&#039;Snooze&#039;&#039;&#039;: postpone the decision to a future date&lt;br /&gt;
* &#039;&#039;&#039;Edit metadata&#039;&#039;&#039;: add key/value notes for archived data. These values are included on tape and can be used to view/retrieve datasets on tape&lt;br /&gt;
&lt;br /&gt;
You can also select multiple rows and apply actions in bulk.&lt;br /&gt;
&lt;br /&gt;
==== 2) Datasets ====&lt;br /&gt;
This page shows your discovered datasets, their sizes, and last activity times. The application has no concept of what data belongs together and should be considered a &#039;dataset&#039;. If the selections on this page are wrong, you can change how Tapeworm should handle these datasets instead.&lt;br /&gt;
[[File:Screenshot from 2026-03-17 15-20-23.png|none|thumb|1400x1400px]]&lt;br /&gt;
Important:&lt;br /&gt;
* If a dataset already has an active move candidate, scheduling controls are disabled.&lt;br /&gt;
 The dataset list is informational; move decisions are handled through the Schedule page.&lt;br /&gt;
&lt;br /&gt;
==== 3) Schedule ====&lt;br /&gt;
This page shows move candidates and their status over time.&lt;br /&gt;
[[File:Screenshot from 2026-03-17 15-20-58.png|none|thumb|1400x1400px]]&lt;br /&gt;
Common statuses:&lt;br /&gt;
* &#039;&#039;&#039;Planned&#039;&#039;&#039;: under review&lt;br /&gt;
* &#039;&#039;&#039;Scheduled&#039;&#039;&#039;: move is planned for a specific date&lt;br /&gt;
* &#039;&#039;&#039;Executing / Tape staged / On tape&#039;&#039;&#039;: move is in progress or completed&lt;br /&gt;
* &#039;&#039;&#039;Error&#039;&#039;&#039;: move needs admin attention. You may be contacted, maybe we resolve it ourselves :)&lt;br /&gt;
&lt;br /&gt;
Once a move is already executing or completed, schedule-changing actions are locked.&lt;br /&gt;
&lt;br /&gt;
==== 4) Overrides ====&lt;br /&gt;
Overrides tell Tapeworm to ignore specific paths in future planning.&lt;br /&gt;
[[File:Screenshot from 2026-03-17 15-21-49.png|none|thumb|1400x1400px]]&lt;br /&gt;
Use overrides when:&lt;br /&gt;
* a project is still active and needs to remain on /archive&lt;br /&gt;
* policy suggestions are not appropriate for that location&lt;br /&gt;
&lt;br /&gt;
If you agree that the dataset can in principle be moved to tape, but you don&#039;t (yet) know when, you can choose to postpone/snooze the archival instead of overriding it.&lt;br /&gt;
&lt;br /&gt;
Overrides apply to the selected path and everything below it.&lt;br /&gt;
&lt;br /&gt;
==== 5) History ====&lt;br /&gt;
This page shows completed archival moves. When a dataset has been successfully archived and finalized, it is removed from active scheduling pages and moved into history.&lt;br /&gt;
[[File:Screenshot from 2026-03-17 15-24-40.png|none|thumb|1400x1400px]]&lt;br /&gt;
&lt;br /&gt;
=== Group pages ===&lt;br /&gt;
&lt;br /&gt;
Group admins have a separate set of pages for their group scope:&lt;br /&gt;
* &#039;&#039;&#039;Group overview&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Group datasets&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Group schedule&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Group overrides&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Group history&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
If you manage more than one group, you can switch group scope in the selector at the top of the group pages.&lt;br /&gt;
&lt;br /&gt;
=== Notifications (email) ===&lt;br /&gt;
&lt;br /&gt;
Tapeworm sends email updates when actions are pending, dates are approaching, or move state changes happen.&lt;br /&gt;
&lt;br /&gt;
Emails typically include:&lt;br /&gt;
* Dataset path&lt;br /&gt;
* Size&lt;br /&gt;
* Last activity&lt;br /&gt;
* Current status&lt;br /&gt;
* Review/scheduled date&lt;br /&gt;
&lt;br /&gt;
Notification types you may receive:&lt;br /&gt;
* &#039;&#039;&#039;Action required&#039;&#039;&#039;: please approve, snooze, or deny&lt;br /&gt;
* &#039;&#039;&#039;Reminder&#039;&#039;&#039;: review date is approaching&lt;br /&gt;
* &#039;&#039;&#039;Informational&#039;&#039;&#039;: move status changed (for example scheduled, staging, or completed)&lt;br /&gt;
* &#039;&#039;&#039;Escalation&#039;&#039;&#039;: sent to group contacts when no user response is received&lt;br /&gt;
&lt;br /&gt;
Please read these emails carefully — they are your chance to adjust decisions before execution.&lt;br /&gt;
&lt;br /&gt;
=== Best practices for users ===&lt;br /&gt;
&lt;br /&gt;
* Check your &#039;&#039;&#039;Overview&#039;&#039;&#039; page regularly&lt;br /&gt;
* Use &#039;&#039;&#039;Snooze&#039;&#039;&#039; if you need time to validate impact&lt;br /&gt;
* Add &#039;&#039;&#039;metadata&#039;&#039;&#039; when approving important datasets&lt;br /&gt;
* Use &#039;&#039;&#039;Overrides&#039;&#039;&#039; for known and persisting exceptions&lt;br /&gt;
* If unsure, contact HPC support before a scheduled move date&lt;br /&gt;
&lt;br /&gt;
=== Tapeworm FAQ ===&lt;br /&gt;
&lt;br /&gt;
==== What happens if I do nothing? ====&lt;br /&gt;
Planned items can move forward automatically after the review window (4 weeks).&lt;br /&gt;
&lt;br /&gt;
==== Can I undo after tape staging? ====&lt;br /&gt;
Not directly in Tapeworm. Retrieval is done via the tape/iRODS workflow. See: https://irods.wur.nl/userguide/tape_retrieval/&lt;br /&gt;
&lt;br /&gt;
==== What does &amp;quot;completed&amp;quot; mean? ====&lt;br /&gt;
Completed means Tapeworm saw the tape workflow finish and finalized the move. Before finalization, the system verifies the archive in iRODS and only then removes the staged source copy.&lt;br /&gt;
&lt;br /&gt;
==== Why is an action button disabled? ====&lt;br /&gt;
Usually because the move has already progressed (executing/staged/on tape/error), so schedule edits are no longer valid.&lt;br /&gt;
&lt;br /&gt;
==== Why do some paths on /archive/ not appear as datasets in Tapeworm? ====&lt;br /&gt;
Tapeworm only shows paths that are discovered as datasets and pass a minimum-size threshold. Very small paths, single text files, and other tiny items are intentionally filtered out.&lt;br /&gt;
&lt;br /&gt;
=== Need help? ===&lt;br /&gt;
If anything is unclear, or you think a move is incorrect but you cannot alter it in the provided GUI, please open an HPC support ticket.&lt;br /&gt;
&lt;br /&gt;
== Manual tape access with iRODS besides Tapeworm ==&lt;br /&gt;
&lt;br /&gt;
Anunna hosts its own iRODS instance, with which you can push data manually to the WUR tape storage for archiving. For general usage information, see https://irods.wur.nl/. The best course of action is to loosely follow the course using your own data, and use your personal space for data upload and transfer to tape.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Be sure to check whether the data is correctly stored on tape before you remove your data.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
On Anunna there are some differences and additions to the linked site:&lt;br /&gt;
&lt;br /&gt;
* The zone is &amp;lt;code&amp;gt;HPC&amp;lt;/code&amp;gt;.&lt;br /&gt;
* With &amp;lt;code&amp;gt;iinit&amp;lt;/code&amp;gt; you can initialise the iRODS environment. Use your account password.&lt;br /&gt;
* With &amp;lt;code&amp;gt;ils&amp;lt;/code&amp;gt; you can see your available iRODS collections. You need that as a destination location for &amp;lt;code&amp;gt;itape&amp;lt;/code&amp;gt;.&lt;br /&gt;
* We have a function to ease uploads (use &amp;lt;code&amp;gt;-h&amp;lt;/code&amp;gt; for help): &amp;lt;code&amp;gt;itape&amp;lt;/code&amp;gt;.&lt;br /&gt;
* We have aliases to ease checking the status of your archive process (it takes a while): &amp;lt;code&amp;gt;itapestat&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;itapestatnp&amp;lt;/code&amp;gt;. The first is for human use — it shows a paginated status of all your files. The latter dumps all the info, so you can e.g. use grep to filter.&lt;br /&gt;
* If you remove data with &amp;lt;code&amp;gt;irm&amp;lt;/code&amp;gt; within iRODS, the data isn&#039;t actually removed but moved to a trash bin. The advantage is that you can retrieve it if the removal was in error; the disadvantage is that the data will keep costing money. To empty it, see &amp;lt;code&amp;gt;irmtrash -h&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Because of hardware limitations on the backend tape storage, the size limit per file for our tape archive is 5 TB.&lt;br /&gt;
&lt;br /&gt;
== Retrieving data from tape ==&lt;br /&gt;
As the tape storage is maintained by a different team, it is best to follow their documentation on retrieval.&lt;br /&gt;
&lt;br /&gt;
For that, see here: https://irods.wur.nl/userguide/archiving_research_data_using_icommands/&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Storage Systems Overview]]&lt;br /&gt;
* [[Backup Policy]]&lt;br /&gt;
* [[Compute Storage]]&lt;br /&gt;
* [[Tariffs|Costs associated with resource usage]]&lt;br /&gt;
&lt;br /&gt;
== External links ==&lt;br /&gt;
* [http://wiki.lustre.org/index.php/Main_Page Lustre website]&lt;/div&gt;</summary>
		<author><name>Honfi001</name></author>
	</entry>
	<entry>
		<id>https://wiki.anunna.wur.nl/index.php?title=Archival_Storage&amp;diff=3077</id>
		<title>Archival Storage</title>
		<link rel="alternate" type="text/html" href="https://wiki.anunna.wur.nl/index.php?title=Archival_Storage&amp;diff=3077"/>
		<updated>2026-08-25T12:13:17Z</updated>

		<summary type="html">&lt;p&gt;Honfi001: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;code&amp;gt;/archive&amp;lt;/code&amp;gt; is Anunna&#039;s warm storage tier for data you want to keep but are not actively computing on. Storing data there costs less than on [[Compute Storage|Lustre]], and datasets that have not been used for a long time are moved on to long-term tape archive — automatically, through the [[#Tapeworm|Tapeworm]] service — to keep the warm tier free for active work.&lt;br /&gt;
&lt;br /&gt;
== The /archive filesystem ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/archive&amp;lt;/code&amp;gt; is a mount that is only accessible from the login nodes, it cannot be used for compute work, and it is only available to WUR users.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/archive&amp;lt;/code&amp;gt; is backed up periodically on the same schedule as your [[Home Directory|home directory]] — restorable from roughly a week of history (see [[Backup Policy]]). That backup is separate from the long-term tape archival described below: a backup is a short-term safety copy, while archival moves data off &amp;lt;code&amp;gt;/archive&amp;lt;/code&amp;gt; for long-term keeping.&lt;br /&gt;
&lt;br /&gt;
== Tapeworm ==&lt;br /&gt;
&lt;br /&gt;
Tapeworm (https://tapeworm.anunna.wur.nl/) helps you manage data on &amp;lt;code&amp;gt;/archive&amp;lt;/code&amp;gt; by identifying datasets that are no longer actively used and preparing them for tape archival. The goal is simple: keep our warm storage available for active work, while safely preserving older data on tape.&lt;br /&gt;
&lt;br /&gt;
With Tapeworm, you can:&lt;br /&gt;
* See which of your datasets are being considered for tape archival&lt;br /&gt;
* Review planned moves before they happen&lt;br /&gt;
* Approve, snooze, or block moves when needed&lt;br /&gt;
* Add metadata to help describe archived datasets. The metadata is included on tape and can be used to view/retrieve from tape, should you need to do so in the future&lt;br /&gt;
&lt;br /&gt;
If you do nothing, Tapeworm will continue with the planned move after the review period. That is why we recommend checking your pending actions regularly. You will also receive notification emails about pending actions.&lt;br /&gt;
&lt;br /&gt;
From time to time, the user pages may temporarily be unavailable during maintenance. In that case, Tapeworm will show a short maintenance page instead of the normal interface.&lt;br /&gt;
&lt;br /&gt;
=== How Tapeworm works ===&lt;br /&gt;
&lt;br /&gt;
# Tapeworm scans &amp;lt;code&amp;gt;/archive&amp;lt;/code&amp;gt; and builds an index of paths and filesystem metadata.&lt;br /&gt;
# A dataset discovery step groups those paths into datasets, determines size, owner, and last active use, and makes them available in the GUI. Very small datasets are filtered out and will not be shown.&lt;br /&gt;
# A policy engine checks which discovered datasets look stale (for example: 60+ days old and larger than 1GB).&lt;br /&gt;
# Matching datasets are marked as &#039;&#039;&#039;planned&#039;&#039;&#039; and shown in your overview.&lt;br /&gt;
# You will be notified by email that Tapeworm plans to move data you own.&lt;br /&gt;
# You can review and change what should happen, or block the move(s) entirely.&lt;br /&gt;
# If no action is taken, after a wait period of 4 weeks, planned moves can become scheduled and then executed.&lt;br /&gt;
# Data is moved to tape, and removed from &amp;lt;code&amp;gt;/archive&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Who sees what? ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Regular users&#039;&#039;&#039; see only their own datasets and actions.&lt;br /&gt;
* &#039;&#039;&#039;Group admins/contacts&#039;&#039;&#039; see data for their configured group(s), in addition to their own data.&lt;br /&gt;
&lt;br /&gt;
=== User pages ===&lt;br /&gt;
&lt;br /&gt;
==== 1) Overview ====&lt;br /&gt;
This is your action page. It shows items that currently need your decision.&lt;br /&gt;
[[File:Screenshot from 2026-03-17 15-19-46.png|none|thumb|1400x1400px]]&lt;br /&gt;
For each candidate, you can:&lt;br /&gt;
* &#039;&#039;&#039;Approve&#039;&#039;&#039;: proceed with the tape move. It will schedule for the next day&lt;br /&gt;
* &#039;&#039;&#039;Deny&#039;&#039;&#039;: stop this move, configure an override for this path. Tapeworm will not try to move this dataset/path again, until you choose to remove the override&lt;br /&gt;
* &#039;&#039;&#039;Snooze&#039;&#039;&#039;: postpone the decision to a future date&lt;br /&gt;
* &#039;&#039;&#039;Edit metadata&#039;&#039;&#039;: add key/value notes for archived data. These values are included on tape and can be used to view/retrieve datasets on tape&lt;br /&gt;
&lt;br /&gt;
You can also select multiple rows and apply actions in bulk.&lt;br /&gt;
&lt;br /&gt;
==== 2) Datasets ====&lt;br /&gt;
This page shows your discovered datasets, their sizes, and last activity times. The application has no concept of what data belongs together and should be considered a &#039;dataset&#039;. If the selections on this page are wrong, you can change how Tapeworm should handle these datasets instead.&lt;br /&gt;
[[File:Screenshot from 2026-03-17 15-20-23.png|none|thumb|1400x1400px]]&lt;br /&gt;
Important:&lt;br /&gt;
* If a dataset already has an active move candidate, scheduling controls are disabled.&lt;br /&gt;
 The dataset list is informational; move decisions are handled through the Schedule page.&lt;br /&gt;
&lt;br /&gt;
==== 3) Schedule ====&lt;br /&gt;
This page shows move candidates and their status over time.&lt;br /&gt;
[[File:Screenshot from 2026-03-17 15-20-58.png|none|thumb|1400x1400px]]&lt;br /&gt;
Common statuses:&lt;br /&gt;
* &#039;&#039;&#039;Planned&#039;&#039;&#039;: under review&lt;br /&gt;
* &#039;&#039;&#039;Scheduled&#039;&#039;&#039;: move is planned for a specific date&lt;br /&gt;
* &#039;&#039;&#039;Executing / Tape staged / On tape&#039;&#039;&#039;: move is in progress or completed&lt;br /&gt;
* &#039;&#039;&#039;Error&#039;&#039;&#039;: move needs admin attention. You may be contacted, maybe we resolve it ourselves :)&lt;br /&gt;
&lt;br /&gt;
Once a move is already executing or completed, schedule-changing actions are locked.&lt;br /&gt;
&lt;br /&gt;
==== 4) Overrides ====&lt;br /&gt;
Overrides tell Tapeworm to ignore specific paths in future planning.&lt;br /&gt;
[[File:Screenshot from 2026-03-17 15-21-49.png|none|thumb|1400x1400px]]&lt;br /&gt;
Use overrides when:&lt;br /&gt;
* a project is still active and needs to remain on /archive&lt;br /&gt;
* policy suggestions are not appropriate for that location&lt;br /&gt;
&lt;br /&gt;
If you agree that the dataset can in principle be moved to tape, but you don&#039;t (yet) know when, you can choose to postpone/snooze the archival instead of overriding it.&lt;br /&gt;
&lt;br /&gt;
Overrides apply to the selected path and everything below it.&lt;br /&gt;
&lt;br /&gt;
==== 5) History ====&lt;br /&gt;
This page shows completed archival moves. When a dataset has been successfully archived and finalized, it is removed from active scheduling pages and moved into history.&lt;br /&gt;
[[File:Screenshot from 2026-03-17 15-24-40.png|none|thumb|1400x1400px]]&lt;br /&gt;
&lt;br /&gt;
=== Group pages ===&lt;br /&gt;
&lt;br /&gt;
Group admins have a separate set of pages for their group scope:&lt;br /&gt;
* &#039;&#039;&#039;Group overview&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Group datasets&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Group schedule&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Group overrides&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Group history&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
If you manage more than one group, you can switch group scope in the selector at the top of the group pages.&lt;br /&gt;
&lt;br /&gt;
=== Notifications (email) ===&lt;br /&gt;
&lt;br /&gt;
Tapeworm sends email updates when actions are pending, dates are approaching, or move state changes happen.&lt;br /&gt;
&lt;br /&gt;
Emails typically include:&lt;br /&gt;
* Dataset path&lt;br /&gt;
* Size&lt;br /&gt;
* Last activity&lt;br /&gt;
* Current status&lt;br /&gt;
* Review/scheduled date&lt;br /&gt;
&lt;br /&gt;
Notification types you may receive:&lt;br /&gt;
* &#039;&#039;&#039;Action required&#039;&#039;&#039;: please approve, snooze, or deny&lt;br /&gt;
* &#039;&#039;&#039;Reminder&#039;&#039;&#039;: review date is approaching&lt;br /&gt;
* &#039;&#039;&#039;Informational&#039;&#039;&#039;: move status changed (for example scheduled, staging, or completed)&lt;br /&gt;
* &#039;&#039;&#039;Escalation&#039;&#039;&#039;: sent to group contacts when no user response is received&lt;br /&gt;
&lt;br /&gt;
Please read these emails carefully — they are your chance to adjust decisions before execution.&lt;br /&gt;
&lt;br /&gt;
=== Best practices for users ===&lt;br /&gt;
&lt;br /&gt;
* Check your &#039;&#039;&#039;Overview&#039;&#039;&#039; page regularly&lt;br /&gt;
* Use &#039;&#039;&#039;Snooze&#039;&#039;&#039; if you need time to validate impact&lt;br /&gt;
* Add &#039;&#039;&#039;metadata&#039;&#039;&#039; when approving important datasets&lt;br /&gt;
* Use &#039;&#039;&#039;Overrides&#039;&#039;&#039; for known and persisting exceptions&lt;br /&gt;
* If unsure, contact HPC support before a scheduled move date&lt;br /&gt;
&lt;br /&gt;
=== Tapeworm FAQ ===&lt;br /&gt;
&lt;br /&gt;
==== What happens if I do nothing? ====&lt;br /&gt;
Planned items can move forward automatically after the review window (4 weeks).&lt;br /&gt;
&lt;br /&gt;
==== Can I undo after tape staging? ====&lt;br /&gt;
Not directly in Tapeworm. Retrieval is done via the tape/iRODS workflow. See: https://irods.wur.nl/userguide/tape_retrieval/&lt;br /&gt;
&lt;br /&gt;
==== What does &amp;quot;completed&amp;quot; mean? ====&lt;br /&gt;
Completed means Tapeworm saw the tape workflow finish and finalized the move. Before finalization, the system verifies the archive in iRODS and only then removes the staged source copy.&lt;br /&gt;
&lt;br /&gt;
==== Why is an action button disabled? ====&lt;br /&gt;
Usually because the move has already progressed (executing/staged/on tape/error), so schedule edits are no longer valid.&lt;br /&gt;
&lt;br /&gt;
==== Why do some paths on /archive/ not appear as datasets in Tapeworm? ====&lt;br /&gt;
Tapeworm only shows paths that are discovered as datasets and pass a minimum-size threshold. Very small paths, single text files, and other tiny items are intentionally filtered out.&lt;br /&gt;
&lt;br /&gt;
=== Need help? ===&lt;br /&gt;
If anything is unclear, or you think a move is incorrect but you cannot alter it in the provided GUI, please open an HPC support ticket.&lt;br /&gt;
&lt;br /&gt;
== Manual tape access with iRODS besides Tapeworm ==&lt;br /&gt;
&lt;br /&gt;
Anunna hosts its own iRODS instance, with which you can push data manually to the WUR tape storage for archiving. For general usage information, see https://irods.wur.nl/. The best course of action is to loosely follow the course using your own data, and use your personal space for data upload and transfer to tape.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Be sure to check whether the data is correctly stored on tape before you remove your data.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
On Anunna there are some differences and additions to the linked site:&lt;br /&gt;
&lt;br /&gt;
* The zone is &amp;lt;code&amp;gt;HPC&amp;lt;/code&amp;gt;.&lt;br /&gt;
* With &amp;lt;code&amp;gt;iinit&amp;lt;/code&amp;gt; you can initialise the iRODS environment. Use your account password.&lt;br /&gt;
* With &amp;lt;code&amp;gt;ils&amp;lt;/code&amp;gt; you can see your available iRODS collections. You need that as a destination location for &amp;lt;code&amp;gt;itape&amp;lt;/code&amp;gt;.&lt;br /&gt;
* We have a function to ease uploads (use &amp;lt;code&amp;gt;-h&amp;lt;/code&amp;gt; for help): &amp;lt;code&amp;gt;itape&amp;lt;/code&amp;gt;.&lt;br /&gt;
* We have aliases to ease checking the status of your archive process (it takes a while): &amp;lt;code&amp;gt;itapestat&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;itapestatnp&amp;lt;/code&amp;gt;. The first is for human use — it shows a paginated status of all your files. The latter dumps all the info, so you can e.g. use grep to filter.&lt;br /&gt;
* If you remove data with &amp;lt;code&amp;gt;irm&amp;lt;/code&amp;gt; within iRODS, the data isn&#039;t actually removed but moved to a trash bin. The advantage is that you can retrieve it if the removal was in error; the disadvantage is that the data will keep costing money. To empty it, see &amp;lt;code&amp;gt;irmtrash -h&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Because of hardware limitations on the backend tape storage, the size limit per file for our tape archive is 5 TB.&lt;br /&gt;
&lt;br /&gt;
== Retrieving data from tape ==&lt;br /&gt;
As the tape storage is maintained by a different team, it is best to follow their documentation on retrieval.&lt;br /&gt;
&lt;br /&gt;
For that, see here: https://irods.wur.nl/userguide/archiving_research_data_using_icommands/&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Storage Systems Overview]]&lt;br /&gt;
* [[Backup Policy]]&lt;br /&gt;
* [[Compute Storage]]&lt;br /&gt;
* [[Tariffs|Costs associated with resource usage]]&lt;br /&gt;
&lt;br /&gt;
== External links ==&lt;br /&gt;
* [http://wiki.lustre.org/index.php/Main_Page Lustre website]&lt;/div&gt;</summary>
		<author><name>Honfi001</name></author>
	</entry>
	<entry>
		<id>https://wiki.anunna.wur.nl/index.php?title=Python&amp;diff=3076</id>
		<title>Python</title>
		<link rel="alternate" type="text/html" href="https://wiki.anunna.wur.nl/index.php?title=Python&amp;diff=3076"/>
		<updated>2026-08-24T14:24:06Z</updated>

		<summary type="html">&lt;p&gt;Honfi001: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Python is a high-level, interpreted programming language popular in scientific computing for its readability and its enormous ecosystem of third-party libraries — NumPy, Pandas, scikit-learn, PyTorch, TensorFlow, and many more. This page describes how to use Python on Anunna: the provided modules, how to manage your own packages with virtual environments or Miniforge, and how to expose an environment as a Jupyter kernel.&lt;br /&gt;
&lt;br /&gt;
* [[Python/Modules|Modules]] - Locally built and optimized python packages. Recommended for best performance&lt;br /&gt;
* [[uv]] - Rust based version and environment manager.&lt;br /&gt;
* [[Python/Conda|Anaconda]] - Popular version and environment manager. &lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[Environment Modules]]&lt;br /&gt;
* [[Installing Personal Software]]&lt;br /&gt;
* [[Jupyter]]&lt;br /&gt;
* [[R]]&lt;br /&gt;
* [[Apptainer]]&lt;br /&gt;
&lt;br /&gt;
== External links ==&lt;br /&gt;
&lt;br /&gt;
* [https://docs.python.org/3/library/venv.html Python venv documentation]&lt;br /&gt;
* [https://github.com/conda-forge/miniforge Miniforge]&lt;br /&gt;
* [https://conda-forge.org/ conda-forge]&lt;/div&gt;</summary>
		<author><name>Honfi001</name></author>
	</entry>
	<entry>
		<id>https://wiki.anunna.wur.nl/index.php?title=Python&amp;diff=3075</id>
		<title>Python</title>
		<link rel="alternate" type="text/html" href="https://wiki.anunna.wur.nl/index.php?title=Python&amp;diff=3075"/>
		<updated>2026-08-24T14:22:04Z</updated>

		<summary type="html">&lt;p&gt;Honfi001: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Python is a high-level, interpreted programming language popular in scientific computing for its readability and its enormous ecosystem of third-party libraries — NumPy, Pandas, scikit-learn, PyTorch, TensorFlow, and many more. This page describes how to use Python on Anunna: the provided modules, how to manage your own packages with virtual environments or Miniforge, and how to expose an environment as a Jupyter kernel.&lt;br /&gt;
&lt;br /&gt;
* [[Python/Modules|Modules]]&lt;br /&gt;
* [[uv]]&lt;br /&gt;
* [[Python/Conda|Anaconda]]&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[Environment Modules]]&lt;br /&gt;
* [[Installing Personal Software]]&lt;br /&gt;
* [[Jupyter]]&lt;br /&gt;
* [[R]]&lt;br /&gt;
* [[Apptainer]]&lt;br /&gt;
&lt;br /&gt;
== External links ==&lt;br /&gt;
&lt;br /&gt;
* [https://docs.python.org/3/library/venv.html Python venv documentation]&lt;br /&gt;
* [https://github.com/conda-forge/miniforge Miniforge]&lt;br /&gt;
* [https://conda-forge.org/ conda-forge]&lt;/div&gt;</summary>
		<author><name>Honfi001</name></author>
	</entry>
	<entry>
		<id>https://wiki.anunna.wur.nl/index.php?title=Uv&amp;diff=3074</id>
		<title>Uv</title>
		<link rel="alternate" type="text/html" href="https://wiki.anunna.wur.nl/index.php?title=Uv&amp;diff=3074"/>
		<updated>2026-08-24T14:19:50Z</updated>

		<summary type="html">&lt;p&gt;Honfi001: Created page with &amp;quot;{{DISPLAYTITLE:uv}}  uv is a tool for installing Python packages and for managing the environments they live in. It does the same work as &amp;lt;code&amp;gt;pip&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;venv&amp;lt;/code&amp;gt;, and it does it a great deal faster.  This page explains what uv is, how to load it on Anunna, where it keeps your files, and how to use it for everyday work. It also explains what uv is &amp;#039;&amp;#039;&amp;#039;not&amp;#039;&amp;#039;&amp;#039; the right tool for: the packages it installs are not built for our hardware, so when the speed of you...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:uv}}&lt;br /&gt;
&lt;br /&gt;
uv is a tool for installing Python packages and for managing the environments they live in. It does the same work as &amp;lt;code&amp;gt;pip&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;venv&amp;lt;/code&amp;gt;, and it does it a great deal faster.&lt;br /&gt;
&lt;br /&gt;
This page explains what uv is, how to load it on Anunna, where it keeps your files, and how to use it for everyday work. It also explains what uv is &#039;&#039;&#039;not&#039;&#039;&#039; the right tool for: the packages it installs are not built for our hardware, so when the speed of your calculation matters, the Python modules remain the better choice.&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
=== What uv is ===&lt;br /&gt;
&lt;br /&gt;
uv is a single program that covers work you would otherwise need several separate tools for. On Anunna it is available as a module, already set up for the cluster.&lt;br /&gt;
&lt;br /&gt;
=== What uv does ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! uv can !! Otherwise you would use&lt;br /&gt;
|-&lt;br /&gt;
| Install Python packages || &amp;lt;code&amp;gt;pip&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Create and manage environments || &amp;lt;code&amp;gt;venv&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Download other versions of Python || a Python module, if one exists&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== What it is faster at ===&lt;br /&gt;
&lt;br /&gt;
Installing packages, and building the environments that hold them. uv produces the same result as &amp;lt;code&amp;gt;pip&amp;lt;/code&amp;gt; — the very same packages, from the very same place — in a fraction of the time.&lt;br /&gt;
&lt;br /&gt;
That is worth more here than it would be on your own computer. Installing an environment means writing tens of thousands of small files onto a filesystem that everybody on the cluster shares, so finishing sooner is better for you and better for everyone else.&lt;br /&gt;
&lt;br /&gt;
=== What it is not faster at ===&lt;br /&gt;
&lt;br /&gt;
Running your code.&lt;br /&gt;
&lt;br /&gt;
The packages uv installs are general-purpose builds, made to work on any machine in the world. They are exactly what &amp;lt;code&amp;gt;pip&amp;lt;/code&amp;gt; would have given you. The software we provide as modules is compiled for the precise processors in each generation of Anunna&#039;s nodes, and that is where the speed of a calculation comes from. If your work is heavy, use the modules — see [[Python/Modules]].&lt;br /&gt;
&lt;br /&gt;
The same applies to Python itself. uv is able to download a Python for you, but it is a general-purpose build too. The module is set up to use the Python you have loaded rather than fetching one.&lt;br /&gt;
&lt;br /&gt;
=== What we have already set up ===&lt;br /&gt;
&lt;br /&gt;
Left alone, uv keeps its downloads and environments in your home directory, which is small, backed up, and slower than Lustre. The Anunna module points all of it at Lustre instead, and there is nothing you need to do to make that happen. The next two sections cover loading the module and where your files end up.&lt;br /&gt;
&lt;br /&gt;
== Loading uv ==&lt;br /&gt;
&lt;br /&gt;
uv lives in the &#039;&#039;&#039;2025&#039;&#039;&#039; bucket:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
module load 2025 uv&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Loading uv also loads Python 3.13.1, so you do not need to load a Python module first.&lt;br /&gt;
&lt;br /&gt;
Software from different buckets should not be mixed, so anything you use alongside uv should come from the 2025 bucket as well. See [[Environment Modules#Software buckets]].&lt;br /&gt;
&lt;br /&gt;
To check that it worked:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
uv --version&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A second command, &amp;lt;code&amp;gt;uvx&amp;lt;/code&amp;gt;, arrives together with &amp;lt;code&amp;gt;uv&amp;lt;/code&amp;gt;. It is described in [[#Other things uv can do]].&lt;br /&gt;
&lt;br /&gt;
== Where uv keeps your files ==&lt;br /&gt;
&lt;br /&gt;
uv accumulates three kinds of thing as you use it: the packages it has downloaded, any Python versions it has fetched, and the tools you have installed with it. On Anunna the module places all of them on Lustre, under a folder called &amp;lt;code&amp;gt;uv&amp;lt;/code&amp;gt; in your nobackup location — &amp;lt;code&amp;gt;$myNoBkp/uv&amp;lt;/code&amp;gt;. Nobackup is the right tier because everything in there can be downloaded again.&lt;br /&gt;
&lt;br /&gt;
The module does this by setting a handful of variables for you:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Variable !! What it points at&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;UV_DIR&amp;lt;/code&amp;gt; || The folder that holds all of the others. This is the only one you might want to change.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;UV_CACHE_DIR&amp;lt;/code&amp;gt; || Packages uv has downloaded. Normally the largest of them.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;UV_PYTHON_INSTALL_DIR&amp;lt;/code&amp;gt; || Python versions uv has downloaded.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;UV_TOOL_DIR&amp;lt;/code&amp;gt; || Environments for tools installed with &amp;lt;code&amp;gt;uv tool install&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;UV_TOOL_BIN_DIR&amp;lt;/code&amp;gt; || The programs those tools provide. The module has already added this to your &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;UV_PYTHON_BIN_DIR&amp;lt;/code&amp;gt; || Shortcuts to downloaded Python versions.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Putting them somewhere else ===&lt;br /&gt;
&lt;br /&gt;
Every folder in that table sits inside &amp;lt;code&amp;gt;UV_DIR&amp;lt;/code&amp;gt;, so setting that one variable moves all of them. Set it &#039;&#039;&#039;before&#039;&#039;&#039; loading the module:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
export UV_DIR=$myScratch/uv&lt;br /&gt;
module load 2025 uv&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To see where uv is actually working, ask:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
echo $UV_DIR&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Use that rather than &amp;lt;code&amp;gt;$myNoBkp&amp;lt;/code&amp;gt;, which is only set once you have added it to your shell yourself — see [[Installing Personal Software#Aliases and local variables]].&lt;br /&gt;
&lt;br /&gt;
=== Keeping it from growing ===&lt;br /&gt;
&lt;br /&gt;
The cache is meant to grow; that is part of what makes uv fast. It still counts against your Lustre quota, so clear it out from time to time:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
uv cache prune      # remove entries nothing is using&lt;br /&gt;
uv cache clean      # remove everything&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Creating an environment and installing packages ==&lt;br /&gt;
&lt;br /&gt;
=== Never build an environment on a login node ===&lt;br /&gt;
&lt;br /&gt;
Building an environment writes thousands of small files at once. A login node is shared by every user on the cluster, so that work is felt by all of them rather than only by you. Ask for an interactive session on a compute node and work there:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sinteractive -c 4 --mem 16G --time 120&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
See [[Interactive Jobs]] for the options &amp;lt;code&amp;gt;sinteractive&amp;lt;/code&amp;gt; accepts.&lt;br /&gt;
&lt;br /&gt;
=== Creating an environment ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
module load 2025 uv&lt;br /&gt;
uv venv $myNoBkp/PythonEnv/my_env&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Environments belong on Lustre rather than in your home directory, and nobackup is the right tier because an environment can always be built again from the list of packages in it.&lt;br /&gt;
&lt;br /&gt;
If you run &amp;lt;code&amp;gt;uv venv&amp;lt;/code&amp;gt; without giving a path, uv creates a folder named &amp;lt;code&amp;gt;.venv&amp;lt;/code&amp;gt; in whatever directory you happen to be in. Giving the path yourself is clearer, and it keeps your environments together in one place.&lt;br /&gt;
&lt;br /&gt;
=== Using it ===&lt;br /&gt;
&lt;br /&gt;
Activate the environment whenever you want it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
source $myNoBkp/PythonEnv/my_env/bin/activate&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Its name then appears at the front of your prompt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
(my_env) user001@login200:~$&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Install packages into it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
uv pip install numpy pandas&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Leave it again with &amp;lt;code&amp;gt;deactivate&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
What uv builds is an ordinary virtual environment. &amp;lt;code&amp;gt;pip&amp;lt;/code&amp;gt; still works inside it if you prefer, and it can be turned into a Jupyter kernel exactly as [[Python/Modules#Jupyter kernels]] describes.&lt;br /&gt;
&lt;br /&gt;
=== The commands you already know ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! If you know this !! Use this&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;python -m venv my_env&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;uv venv my_env&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;source my_env/bin/activate&amp;lt;/code&amp;gt; || unchanged&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;pip install numpy&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;uv pip install numpy&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;pip list&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;uv pip list&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Other things uv can do ==&lt;br /&gt;
&lt;br /&gt;
=== Running a tool without installing it ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;uvx&amp;lt;/code&amp;gt; fetches a command-line program, runs it, and does not leave an environment behind:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
uvx ruff check .&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Installing a tool you use often ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
uv tool install ruff&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The program lands in your uv folder, which the module has already added to your &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;, so you can run it straight away and in any later session.&lt;br /&gt;
&lt;br /&gt;
=== Using a different version of Python ===&lt;br /&gt;
&lt;br /&gt;
If you need a version of Python we do not provide as a module, uv can fetch one:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
uv python install 3.12&lt;br /&gt;
uv venv --python 3.12 $myNoBkp/PythonEnv/py312&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remember that these are general-purpose builds, like the packages. They are convenient, and they are the right choice when you need a specific version for compatibility — but if the speed of your calculation matters, a Python module is the better starting point.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Do not run &amp;lt;code&amp;gt;uv python update-shell&amp;lt;/code&amp;gt;.&#039;&#039;&#039; It writes a fixed path into your &amp;lt;code&amp;gt;~/.bashrc&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;~/.bash_profile&amp;lt;/code&amp;gt;. That applies in every shell you ever open, whether or not the module is loaded, and it stops being correct the moment your uv folder moves.&lt;br /&gt;
&lt;br /&gt;
== Using uv in a job script ==&lt;br /&gt;
&lt;br /&gt;
Build the environment &#039;&#039;&#039;before&#039;&#039;&#039; you submit the job, not inside it. Create it once in an interactive session, as above, and let the job simply use it. An environment built inside the job is rebuilt on every run, and when many jobs start at the same time they all write to the filesystem at once.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#SBATCH --job-name=myjob&lt;br /&gt;
#SBATCH --time=1:00:00&lt;br /&gt;
#SBATCH --cpus-per-task=4&lt;br /&gt;
#SBATCH --mem=16G&lt;br /&gt;
&lt;br /&gt;
module load 2025 uv&lt;br /&gt;
source $myNoBkp/PythonEnv/my_env/bin/activate&lt;br /&gt;
&lt;br /&gt;
python myscript.py&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Both the &amp;lt;code&amp;gt;module load&amp;lt;/code&amp;gt; and the &amp;lt;code&amp;gt;source&amp;lt;/code&amp;gt; have to be inside the script. A job does not inherit the shell you submitted it from, so anything you loaded by hand beforehand is not there when the job runs. This is the most common reason a script that worked interactively fails under &amp;lt;code&amp;gt;sbatch&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
See [[Batch Jobs]] for what else can go in the &amp;lt;code&amp;gt;#SBATCH&amp;lt;/code&amp;gt; lines.&lt;br /&gt;
&lt;br /&gt;
== FAQ ==&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;module load uv&amp;lt;/code&amp;gt; says there is no such module.&lt;br /&gt;
: The bucket has to be loaded first. Use &amp;lt;code&amp;gt;module load 2025 uv&amp;lt;/code&amp;gt;. See [[Environment Modules#Software buckets]].&lt;br /&gt;
&lt;br /&gt;
; Where did uv put my files?&lt;br /&gt;
: &amp;lt;code&amp;gt;echo $UV_DIR&amp;lt;/code&amp;gt; gives the folder they are all under. To hear it from uv itself, &amp;lt;code&amp;gt;uv cache dir&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;uv tool dir&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
; uv warned that it could not find a Lustre directory.&lt;br /&gt;
: The module could not work out where your Lustre folders are, so uv has fallen back to your home directory — which will eventually fill up. Choose a location yourself with &amp;lt;code&amp;gt;export UV_DIR=$myNoBkp/uv&amp;lt;/code&amp;gt; and then load the module again.&lt;br /&gt;
&lt;br /&gt;
; My home directory is still filling up, even though uv uses Lustre.&lt;br /&gt;
: If you used uv before this module existed, an old cache is probably still sitting in &amp;lt;code&amp;gt;~/.cache/uv&amp;lt;/code&amp;gt;. uv no longer looks there, so its own cleaning commands cannot reach it. Check its size with &amp;lt;code&amp;gt;du -sh ~/.cache/uv&amp;lt;/code&amp;gt; and delete it by hand if you no longer need it.&lt;br /&gt;
&lt;br /&gt;
; Can I still use &amp;lt;code&amp;gt;pip&amp;lt;/code&amp;gt; inside a uv environment?&lt;br /&gt;
: Yes. It is an ordinary virtual environment and &amp;lt;code&amp;gt;pip&amp;lt;/code&amp;gt; behaves normally in it.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[Python]]&lt;br /&gt;
* [[Python/Modules]]&lt;br /&gt;
* [[Python/Conda]]&lt;br /&gt;
* [[Environment Modules]]&lt;br /&gt;
* [[Installing Personal Software]]&lt;br /&gt;
* [[Interactive Jobs]]&lt;br /&gt;
* [[Batch Jobs]]&lt;br /&gt;
* [[Quotas]]&lt;br /&gt;
&lt;br /&gt;
== External links ==&lt;br /&gt;
&lt;br /&gt;
* [https://docs.astral.sh/uv/ uv documentation]&lt;br /&gt;
* [https://github.com/astral-sh/uv uv on GitHub]&lt;/div&gt;</summary>
		<author><name>Honfi001</name></author>
	</entry>
	<entry>
		<id>https://wiki.anunna.wur.nl/index.php?title=FrequentlyAskedQuestions&amp;diff=3073</id>
		<title>FrequentlyAskedQuestions</title>
		<link rel="alternate" type="text/html" href="https://wiki.anunna.wur.nl/index.php?title=FrequentlyAskedQuestions&amp;diff=3073"/>
		<updated>2026-08-24T10:25:12Z</updated>

		<summary type="html">&lt;p&gt;Honfi001: Created page with &amp;quot;{{DISPLAYTITLE:Frequently Asked Questions}}&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:Frequently Asked Questions}}&lt;/div&gt;</summary>
		<author><name>Honfi001</name></author>
	</entry>
	<entry>
		<id>https://wiki.anunna.wur.nl/index.php?title=External_Collaborator_Access&amp;diff=3072</id>
		<title>External Collaborator Access</title>
		<link rel="alternate" type="text/html" href="https://wiki.anunna.wur.nl/index.php?title=External_Collaborator_Access&amp;diff=3072"/>
		<updated>2026-08-24T10:18:33Z</updated>

		<summary type="html">&lt;p&gt;Honfi001: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Anunna is an open service available to users and groups outside of the WUR, hence access to external researchers and entities can be facilitated.&lt;br /&gt;
&lt;br /&gt;
== Giving a collaborator access ==&lt;br /&gt;
&lt;br /&gt;
Every Anunna user needs a valid user account associated with one of the groups registered at Anunna. Therefore external users need to be sponsored by an existing group, that means that the sponsoring group accepts to bear the costs accrued by the external user and the external user will gain access to the folders common to the group  — see [[Managing Group Members]] and [[Shared Storage]].&lt;br /&gt;
&lt;br /&gt;
Alternatively, external users, who want to be their own independent entity and want to pay for their own usage of the HPC, a contract must be signed.&lt;br /&gt;
&lt;br /&gt;
For instructions on how to get the process started — see [[Account Application Process]] (the external-user route). As the WUR contact, you will usually need to sponsor the request and name the project. &lt;br /&gt;
&lt;br /&gt;
=== Required Information ===&lt;br /&gt;
When requesting an account for an external user please include the following details&lt;br /&gt;
&lt;br /&gt;
* First name&lt;br /&gt;
* Last Name&lt;br /&gt;
* Valid e-mail address&lt;br /&gt;
* Sponsoring group&lt;br /&gt;
* Expiration date for the account&lt;br /&gt;
* Name or username of supervisor&lt;br /&gt;
&lt;br /&gt;
The supervisor will be responsible for the data of the external user once the account expires. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Account Application Process]]&lt;br /&gt;
* [[Who Can Access?]]&lt;br /&gt;
* [[Managing Group Members]]&lt;br /&gt;
* [[How to Get Help]]&lt;/div&gt;</summary>
		<author><name>Honfi001</name></author>
	</entry>
	<entry>
		<id>https://wiki.anunna.wur.nl/index.php?title=Network_%26_Security&amp;diff=3071</id>
		<title>Network &amp; Security</title>
		<link rel="alternate" type="text/html" href="https://wiki.anunna.wur.nl/index.php?title=Network_%26_Security&amp;diff=3071"/>
		<updated>2026-08-19T15:04:05Z</updated>

		<summary type="html">&lt;p&gt;Honfi001: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- TODO: this page is a skeleton. The security policy specifics (data classification, firewall rules, incident handling, audit) need authoritative input from FB-IT. The interconnect details depend on the same confirmation as Cluster Architecture Overview. Search for &amp;quot;TODO&amp;quot; below. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This page describes how Anunna is connected and how access to it is secured.&lt;br /&gt;
&lt;br /&gt;
== Network ==&lt;br /&gt;
&lt;br /&gt;
Internally inside the cluster, the compute nodes and the[[Filesystems | Lustre filesystem]] are linked by OmniPath, a high-speed, low-latency interconnect, which is what lets the parallel filesystem and multi-node jobs perform well. &lt;br /&gt;
&lt;br /&gt;
From outside, the cluster services are reached through two loadbalancers, which are connected to the internet over 100Gbit links.&lt;br /&gt;
&lt;br /&gt;
SSH to access &amp;lt;code&amp;gt;login.anunna.wur.nl&amp;lt;/code&amp;gt;, other services can be reached through their respective URLs. Access to some services are restricted to certain IP ranges, and are thus are only reachable over the WUR VPN or from within WURNET. See [[Log in to Anunna]] for how to connect.&lt;br /&gt;
&lt;br /&gt;
== Authentication ==&lt;br /&gt;
&lt;br /&gt;
Anunna is public facing, servicing organisation withing and outside of the WUR but access requires an account to be activated by the HPC admins. &lt;br /&gt;
&lt;br /&gt;
Users from the WUR can request an account and  once the account is activated, they can login with the same credentials as their WUR account. &lt;br /&gt;
&lt;br /&gt;
In a similar fashion, organisations outside of the WUR can request submit account requests to the admins. Once the account is created, the users receive an email with their login details, which they are advised to change when first logging in. &lt;br /&gt;
&lt;br /&gt;
For stronger protection you can add multi-factor authentication to your SSH access using a hardware security key — see [[Using a hardware key for better security]]. You can also configure key-based login so you are not prompted for a password each time; see [[Ssh without password]].&lt;br /&gt;
&lt;br /&gt;
If you use the wrong credentials, your access may be blocked, see [[Unblocking your IP]]&lt;br /&gt;
&lt;br /&gt;
== Data security ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For how file and folder permissions, work on the cluster, see [[Shared folders]]. For storing confidential data, contact the HPC team via [[Support]].&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[Cluster Architecture Overview]]&lt;br /&gt;
* [[Log in to Anunna]]&lt;br /&gt;
* [[Unblocking your IP]]&lt;br /&gt;
* [[Using a hardware key for better security]]&lt;br /&gt;
* [[Filesystems]]&lt;/div&gt;</summary>
		<author><name>Honfi001</name></author>
	</entry>
	<entry>
		<id>https://wiki.anunna.wur.nl/index.php?title=Best-Practices&amp;diff=3070</id>
		<title>Best-Practices</title>
		<link rel="alternate" type="text/html" href="https://wiki.anunna.wur.nl/index.php?title=Best-Practices&amp;diff=3070"/>
		<updated>2026-08-19T15:02:17Z</updated>

		<summary type="html">&lt;p&gt;Honfi001: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:Best Practices}}&lt;br /&gt;
&lt;br /&gt;
== Login Node ==&lt;br /&gt;
&lt;br /&gt;
* Do not run analyses or jobs in the login node. &lt;br /&gt;
&lt;br /&gt;
== Home folder  ($HOME, ~) ==&lt;br /&gt;
&lt;br /&gt;
* Do not store datasets or large files in your home directory. You have a quota of 200 GB.&lt;br /&gt;
* Do not install software that you intend to run in jobs in your $HOME . Install your software in lustre.&lt;br /&gt;
* Do not point the logs of your jobs into your $HOME, specially when running array jobs. If not defined slurm will point them to the location you run the sbatch command.&lt;br /&gt;
* Do not edit or left software edit your ~/.bashrc or ~/.bash_profile. If something goes wrong you will be locked out. &lt;br /&gt;
&lt;br /&gt;
== Jobs ==&lt;br /&gt;
&lt;br /&gt;
*&lt;/div&gt;</summary>
		<author><name>Honfi001</name></author>
	</entry>
	<entry>
		<id>https://wiki.anunna.wur.nl/index.php?title=Best-Practices&amp;diff=3069</id>
		<title>Best-Practices</title>
		<link rel="alternate" type="text/html" href="https://wiki.anunna.wur.nl/index.php?title=Best-Practices&amp;diff=3069"/>
		<updated>2026-08-19T14:52:15Z</updated>

		<summary type="html">&lt;p&gt;Honfi001: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:Best Practices}}&lt;/div&gt;</summary>
		<author><name>Honfi001</name></author>
	</entry>
	<entry>
		<id>https://wiki.anunna.wur.nl/index.php?title=Best-Practices&amp;diff=3068</id>
		<title>Best-Practices</title>
		<link rel="alternate" type="text/html" href="https://wiki.anunna.wur.nl/index.php?title=Best-Practices&amp;diff=3068"/>
		<updated>2026-08-19T14:51:11Z</updated>

		<summary type="html">&lt;p&gt;Honfi001: Created page with &amp;quot;==Best Practices==&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Best Practices==&lt;/div&gt;</summary>
		<author><name>Honfi001</name></author>
	</entry>
	<entry>
		<id>https://wiki.anunna.wur.nl/index.php?title=Workflows&amp;diff=3067</id>
		<title>Workflows</title>
		<link rel="alternate" type="text/html" href="https://wiki.anunna.wur.nl/index.php?title=Workflows&amp;diff=3067"/>
		<updated>2026-08-19T14:46:13Z</updated>

		<summary type="html">&lt;p&gt;Honfi001: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Guidelines and tools for building reproducible, efficient research workflows on Anunna.&lt;br /&gt;
&lt;br /&gt;
== In this section ==&lt;br /&gt;
&lt;br /&gt;
* [[Workflow Migration from Laptop to HPC]] — moving your work to the cluster&lt;br /&gt;
* [[Reproducibility Guidelines]] — keeping your work reproducible&lt;br /&gt;
* [[Workflow Engines (Snakemake, Nextflow)]] — managing multi-step pipelines&lt;br /&gt;
* [[Debugging Jobs]] — working out why a job failed&lt;br /&gt;
* [[Checkpointing]] — saving and restarting long jobs&lt;br /&gt;
* [[Scheduled tasks (cron)]] — running recurring tasks with scrontab&lt;br /&gt;
&lt;br /&gt;
=== Parallel Workflows ===&lt;br /&gt;
&lt;br /&gt;
* [[Workflows/Parallel-Computing|Parallel Computing]]&lt;br /&gt;
* [[Workflows/Serial|Serial]]&lt;br /&gt;
* [[Workflows/Embarassinly-Parallel|Embarrassingly Parallel]]&lt;br /&gt;
* [[Workflows/Multi-threaded|Multi-threaded]]&lt;br /&gt;
* [[Workflows/Multi-Process|Multi-Process]] &lt;br /&gt;
* Hybrid Workflows &lt;br /&gt;
* GPU workflows&lt;/div&gt;</summary>
		<author><name>Honfi001</name></author>
	</entry>
	<entry>
		<id>https://wiki.anunna.wur.nl/index.php?title=Python/uv&amp;diff=3066</id>
		<title>Python/uv</title>
		<link rel="alternate" type="text/html" href="https://wiki.anunna.wur.nl/index.php?title=Python/uv&amp;diff=3066"/>
		<updated>2026-08-18T14:27:13Z</updated>

		<summary type="html">&lt;p&gt;Honfi001: Created page with &amp;quot;{{DISPLAYTITLE:uv}}  uv is a tool for installing Python packages and for managing the environments they live in. It does the same work as &amp;lt;code&amp;gt;pip&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;venv&amp;lt;/code&amp;gt;, and it does it a great deal faster.  This page explains what uv is, how to load it on Anunna, where it keeps your files, and how to use it for everyday work. It also explains what uv is &amp;#039;&amp;#039;&amp;#039;not&amp;#039;&amp;#039;&amp;#039; the right tool for: the packages it installs are not built for our hardware, so when the speed of you...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:uv}}&lt;br /&gt;
&lt;br /&gt;
uv is a tool for installing Python packages and for managing the environments they live in. It does the same work as &amp;lt;code&amp;gt;pip&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;venv&amp;lt;/code&amp;gt;, and it does it a great deal faster.&lt;br /&gt;
&lt;br /&gt;
This page explains what uv is, how to load it on Anunna, where it keeps your files, and how to use it for everyday work. It also explains what uv is &#039;&#039;&#039;not&#039;&#039;&#039; the right tool for: the packages it installs are not built for our hardware, so when the speed of your calculation matters, the Python modules remain the better choice.&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
=== What uv is ===&lt;br /&gt;
&lt;br /&gt;
uv is a single program that covers work you would otherwise need several separate tools for. On Anunna it is available as a module, already set up for the cluster.&lt;br /&gt;
&lt;br /&gt;
=== What uv does ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! uv can !! Otherwise you would use&lt;br /&gt;
|-&lt;br /&gt;
| Install Python packages || &amp;lt;code&amp;gt;pip&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Create and manage environments || &amp;lt;code&amp;gt;venv&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Download other versions of Python || a Python module, if one exists&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== What it is faster at ===&lt;br /&gt;
&lt;br /&gt;
Installing packages, and building the environments that hold them. uv produces the same result as &amp;lt;code&amp;gt;pip&amp;lt;/code&amp;gt; — the very same packages, from the very same place — in a fraction of the time.&lt;br /&gt;
&lt;br /&gt;
That is worth more here than it would be on your own computer. Installing an environment means writing tens of thousands of small files onto a filesystem that everybody on the cluster shares, so finishing sooner is better for you and better for everyone else.&lt;br /&gt;
&lt;br /&gt;
=== What it is not faster at ===&lt;br /&gt;
&lt;br /&gt;
Running your code.&lt;br /&gt;
&lt;br /&gt;
The packages uv installs are general-purpose builds, made to work on any machine in the world. They are exactly what &amp;lt;code&amp;gt;pip&amp;lt;/code&amp;gt; would have given you. The software we provide as modules is compiled for the precise processors in each generation of Anunna&#039;s nodes, and that is where the speed of a calculation comes from. If your work is heavy, use the modules — see [[Python/Modules]].&lt;br /&gt;
&lt;br /&gt;
The same applies to Python itself. uv is able to download a Python for you, but it is a general-purpose build too. The module is set up to use the Python you have loaded rather than fetching one.&lt;br /&gt;
&lt;br /&gt;
=== What we have already set up ===&lt;br /&gt;
&lt;br /&gt;
Left alone, uv keeps its downloads and environments in your home directory, which is small, backed up, and slower than Lustre. The Anunna module points all of it at Lustre instead, and there is nothing you need to do to make that happen. The next two sections cover loading the module and where your files end up.&lt;br /&gt;
&lt;br /&gt;
== Loading uv ==&lt;br /&gt;
&lt;br /&gt;
uv lives in the &#039;&#039;&#039;2025&#039;&#039;&#039; bucket:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
module load 2025 uv&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Loading uv also loads Python 3.13.1, so you do not need to load a Python module first.&lt;br /&gt;
&lt;br /&gt;
Software from different buckets should not be mixed, so anything you use alongside uv should come from the 2025 bucket as well. See [[Environment Modules#Software buckets]].&lt;br /&gt;
&lt;br /&gt;
To check that it worked:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
uv --version&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A second command, &amp;lt;code&amp;gt;uvx&amp;lt;/code&amp;gt;, arrives together with &amp;lt;code&amp;gt;uv&amp;lt;/code&amp;gt;. It is described in [[#Other things uv can do]].&lt;br /&gt;
&lt;br /&gt;
== Where uv keeps your files ==&lt;br /&gt;
&lt;br /&gt;
uv accumulates three kinds of thing as you use it: the packages it has downloaded, any Python versions it has fetched, and the tools you have installed with it. On Anunna the module places all of them on Lustre, under a folder called &amp;lt;code&amp;gt;uv&amp;lt;/code&amp;gt; in your nobackup location — &amp;lt;code&amp;gt;$myNoBkp/uv&amp;lt;/code&amp;gt;. Nobackup is the right tier because everything in there can be downloaded again.&lt;br /&gt;
&lt;br /&gt;
The module does this by setting a handful of variables for you:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Variable !! What it points at&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;UV_DIR&amp;lt;/code&amp;gt; || The folder that holds all of the others. This is the only one you might want to change.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;UV_CACHE_DIR&amp;lt;/code&amp;gt; || Packages uv has downloaded. Normally the largest of them.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;UV_PYTHON_INSTALL_DIR&amp;lt;/code&amp;gt; || Python versions uv has downloaded.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;UV_TOOL_DIR&amp;lt;/code&amp;gt; || Environments for tools installed with &amp;lt;code&amp;gt;uv tool install&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;UV_TOOL_BIN_DIR&amp;lt;/code&amp;gt; || The programs those tools provide. The module has already added this to your &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;UV_PYTHON_BIN_DIR&amp;lt;/code&amp;gt; || Shortcuts to downloaded Python versions.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Putting them somewhere else ===&lt;br /&gt;
&lt;br /&gt;
Every folder in that table sits inside &amp;lt;code&amp;gt;UV_DIR&amp;lt;/code&amp;gt;, so setting that one variable moves all of them. Set it &#039;&#039;&#039;before&#039;&#039;&#039; loading the module:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
export UV_DIR=$myScratch/uv&lt;br /&gt;
module load 2025 uv&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To see where uv is actually working, ask:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
echo $UV_DIR&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Use that rather than &amp;lt;code&amp;gt;$myNoBkp&amp;lt;/code&amp;gt;, which is only set once you have added it to your shell yourself — see [[Installing Personal Software#Aliases and local variables]].&lt;br /&gt;
&lt;br /&gt;
=== Keeping it from growing ===&lt;br /&gt;
&lt;br /&gt;
The cache is meant to grow; that is part of what makes uv fast. It still counts against your Lustre quota, so clear it out from time to time:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
uv cache prune      # remove entries nothing is using&lt;br /&gt;
uv cache clean      # remove everything&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Creating an environment and installing packages ==&lt;br /&gt;
&lt;br /&gt;
=== Never build an environment on a login node ===&lt;br /&gt;
&lt;br /&gt;
Building an environment writes thousands of small files at once. A login node is shared by every user on the cluster, so that work is felt by all of them rather than only by you. Ask for an interactive session on a compute node and work there:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sinteractive -c 4 --mem 16G --time 120&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
See [[Interactive Jobs]] for the options &amp;lt;code&amp;gt;sinteractive&amp;lt;/code&amp;gt; accepts.&lt;br /&gt;
&lt;br /&gt;
=== Creating an environment ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
module load 2025 uv&lt;br /&gt;
uv venv $myNoBkp/PythonEnv/my_env&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Environments belong on Lustre rather than in your home directory, and nobackup is the right tier because an environment can always be built again from the list of packages in it.&lt;br /&gt;
&lt;br /&gt;
If you run &amp;lt;code&amp;gt;uv venv&amp;lt;/code&amp;gt; without giving a path, uv creates a folder named &amp;lt;code&amp;gt;.venv&amp;lt;/code&amp;gt; in whatever directory you happen to be in. Giving the path yourself is clearer, and it keeps your environments together in one place.&lt;br /&gt;
&lt;br /&gt;
=== Using it ===&lt;br /&gt;
&lt;br /&gt;
Activate the environment whenever you want it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
source $myNoBkp/PythonEnv/my_env/bin/activate&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Its name then appears at the front of your prompt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
(my_env) user001@login200:~$&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Install packages into it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
uv pip install numpy pandas&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Leave it again with &amp;lt;code&amp;gt;deactivate&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
What uv builds is an ordinary virtual environment. &amp;lt;code&amp;gt;pip&amp;lt;/code&amp;gt; still works inside it if you prefer, and it can be turned into a Jupyter kernel exactly as [[Python/Modules#Jupyter kernels]] describes.&lt;br /&gt;
&lt;br /&gt;
=== The commands you already know ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! If you know this !! Use this&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;python -m venv my_env&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;uv venv my_env&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;source my_env/bin/activate&amp;lt;/code&amp;gt; || unchanged&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;pip install numpy&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;uv pip install numpy&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;pip list&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;uv pip list&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Other things uv can do ==&lt;br /&gt;
&lt;br /&gt;
=== Running a tool without installing it ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;uvx&amp;lt;/code&amp;gt; fetches a command-line program, runs it, and does not leave an environment behind:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
uvx ruff check .&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Installing a tool you use often ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
uv tool install ruff&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The program lands in your uv folder, which the module has already added to your &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;, so you can run it straight away and in any later session.&lt;br /&gt;
&lt;br /&gt;
=== Using a different version of Python ===&lt;br /&gt;
&lt;br /&gt;
If you need a version of Python we do not provide as a module, uv can fetch one:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
uv python install 3.12&lt;br /&gt;
uv venv --python 3.12 $myNoBkp/PythonEnv/py312&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remember that these are general-purpose builds, like the packages. They are convenient, and they are the right choice when you need a specific version for compatibility — but if the speed of your calculation matters, a Python module is the better starting point.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Do not run &amp;lt;code&amp;gt;uv python update-shell&amp;lt;/code&amp;gt;.&#039;&#039;&#039; It writes a fixed path into your &amp;lt;code&amp;gt;~/.bashrc&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;~/.bash_profile&amp;lt;/code&amp;gt;. That applies in every shell you ever open, whether or not the module is loaded, and it stops being correct the moment your uv folder moves.&lt;br /&gt;
&lt;br /&gt;
== Using uv in a job script ==&lt;br /&gt;
&lt;br /&gt;
Build the environment &#039;&#039;&#039;before&#039;&#039;&#039; you submit the job, not inside it. Create it once in an interactive session, as above, and let the job simply use it. An environment built inside the job is rebuilt on every run, and when many jobs start at the same time they all write to the filesystem at once.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#SBATCH --job-name=myjob&lt;br /&gt;
#SBATCH --time=1:00:00&lt;br /&gt;
#SBATCH --cpus-per-task=4&lt;br /&gt;
#SBATCH --mem=16G&lt;br /&gt;
&lt;br /&gt;
module load 2025 uv&lt;br /&gt;
source $myNoBkp/PythonEnv/my_env/bin/activate&lt;br /&gt;
&lt;br /&gt;
python myscript.py&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Both the &amp;lt;code&amp;gt;module load&amp;lt;/code&amp;gt; and the &amp;lt;code&amp;gt;source&amp;lt;/code&amp;gt; have to be inside the script. A job does not inherit the shell you submitted it from, so anything you loaded by hand beforehand is not there when the job runs. This is the most common reason a script that worked interactively fails under &amp;lt;code&amp;gt;sbatch&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
See [[Batch Jobs]] for what else can go in the &amp;lt;code&amp;gt;#SBATCH&amp;lt;/code&amp;gt; lines.&lt;br /&gt;
&lt;br /&gt;
== FAQ ==&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;module load uv&amp;lt;/code&amp;gt; says there is no such module.&lt;br /&gt;
: The bucket has to be loaded first. Use &amp;lt;code&amp;gt;module load 2025 uv&amp;lt;/code&amp;gt;. See [[Environment Modules#Software buckets]].&lt;br /&gt;
&lt;br /&gt;
; Where did uv put my files?&lt;br /&gt;
: &amp;lt;code&amp;gt;echo $UV_DIR&amp;lt;/code&amp;gt; gives the folder they are all under. To hear it from uv itself, &amp;lt;code&amp;gt;uv cache dir&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;uv tool dir&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
; uv warned that it could not find a Lustre directory.&lt;br /&gt;
: The module could not work out where your Lustre folders are, so uv has fallen back to your home directory — which will eventually fill up. Choose a location yourself with &amp;lt;code&amp;gt;export UV_DIR=$myNoBkp/uv&amp;lt;/code&amp;gt; and then load the module again.&lt;br /&gt;
&lt;br /&gt;
; My home directory is still filling up, even though uv uses Lustre.&lt;br /&gt;
: If you used uv before this module existed, an old cache is probably still sitting in &amp;lt;code&amp;gt;~/.cache/uv&amp;lt;/code&amp;gt;. uv no longer looks there, so its own cleaning commands cannot reach it. Check its size with &amp;lt;code&amp;gt;du -sh ~/.cache/uv&amp;lt;/code&amp;gt; and delete it by hand if you no longer need it.&lt;br /&gt;
&lt;br /&gt;
; Can I still use &amp;lt;code&amp;gt;pip&amp;lt;/code&amp;gt; inside a uv environment?&lt;br /&gt;
: Yes. It is an ordinary virtual environment and &amp;lt;code&amp;gt;pip&amp;lt;/code&amp;gt; behaves normally in it.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[Python]]&lt;br /&gt;
* [[Python/Modules]]&lt;br /&gt;
* [[Python/Conda]]&lt;br /&gt;
* [[Environment Modules]]&lt;br /&gt;
* [[Installing Personal Software]]&lt;br /&gt;
* [[Interactive Jobs]]&lt;br /&gt;
* [[Batch Jobs]]&lt;br /&gt;
* [[Quotas]]&lt;br /&gt;
&lt;br /&gt;
== External links ==&lt;br /&gt;
&lt;br /&gt;
* [https://docs.astral.sh/uv/ uv documentation]&lt;br /&gt;
* [https://github.com/astral-sh/uv uv on GitHub]&lt;/div&gt;</summary>
		<author><name>Honfi001</name></author>
	</entry>
	<entry>
		<id>https://wiki.anunna.wur.nl/index.php?title=Environment_Modules&amp;diff=3065</id>
		<title>Environment Modules</title>
		<link rel="alternate" type="text/html" href="https://wiki.anunna.wur.nl/index.php?title=Environment_Modules&amp;diff=3065"/>
		<updated>2026-08-18T12:46:02Z</updated>

		<summary type="html">&lt;p&gt;Honfi001: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Anunna provides software through &#039;&#039;&#039;environment modules&#039;&#039;&#039;, managed with [https://lmod.readthedocs.io/ Lmod]. A module configures your shell — and the environment of your jobs — so that a chosen application and the right version of its dependencies are available. Because each module lives in its own self-contained tree, modules let several otherwise-conflicting programs and several versions of the same program coexist on the cluster without clashing.&lt;br /&gt;
&lt;br /&gt;
== Software buckets ==&lt;br /&gt;
&lt;br /&gt;
Modules on Anunna are organised into &#039;&#039;&#039;buckets&#039;&#039;&#039;. Each bucket is a snapshot of a particular compiler-and-toolchain generation; all the software in a bucket is built with the same compiler. This matters because mixing software built with different compilers in one job can cause conflicts, errors, or silently wrong results — so keeping a job&#039;s software within a single bucket keeps it consistent.&lt;br /&gt;
&lt;br /&gt;
The buckets currently available are:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;legacy&#039;&#039;&#039; — old software that is no longer maintained or updated but is still used in active research.&lt;br /&gt;
* &#039;&#039;&#039;2023&#039;&#039;&#039; — software built with the 2023 compilers and toolchain. &lt;br /&gt;
* &#039;&#039;&#039;2024&#039;&#039;&#039; — software built with the 2024 compilers and toolchain. &lt;br /&gt;
* &#039;&#039;&#039;2024&#039;&#039;&#039; — software built with the 2024 compilers and toolchain.&lt;br /&gt;
* &#039;&#039;&#039;utilities&#039;&#039;&#039; — software that does not depend on a specific compiler or toolchain (for example [[Apptainer]]).&lt;br /&gt;
* &#039;&#039;&#039;groups&#039;&#039;&#039; — module files contributed by groups inside and outside WUR.&lt;br /&gt;
* &#039;&#039;&#039;GPU&#039;&#039;&#039; — CUDA, cuDNN, and related packages that are independent of toolchains.&lt;br /&gt;
&lt;br /&gt;
A bucket has to be loaded before its modules become visible. To use the 2025 bucket:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
module load 2025&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After this, &amp;lt;code&amp;gt;module avail&amp;lt;/code&amp;gt; shows the expanded list of modules from that bucket.&lt;br /&gt;
&lt;br /&gt;
The modules are built with [https://easybuild.io/ EasyBuild], which uses publicly shared recipes called easyconfigs. Their [https://github.com/easybuilders/easybuild-easyconfigs/tree/develop/easybuild/easyconfigs repository] is a good place to check what software is available upstream.&lt;br /&gt;
&lt;br /&gt;
== Requesting modules ==&lt;br /&gt;
&lt;br /&gt;
If a module you need is not available, submit a software request at [https://ideas.anunna.wur.nl https://ideas.anunna.wur.nl]. There you can follow the progress of your request and upvote requests from other users — the more upvotes, the sooner it is prioritised.&lt;br /&gt;
&lt;br /&gt;
== Listing modules ==&lt;br /&gt;
&lt;br /&gt;
Three commands list the available modules in increasing detail. &amp;lt;code&amp;gt;overview&amp;lt;/code&amp;gt; gives a top-level view — just the software names and how many versions exist. &amp;lt;code&amp;gt;avail&amp;lt;/code&amp;gt; lists the individual versions. &amp;lt;code&amp;gt;spider&amp;lt;/code&amp;gt; gives a verbose list with a description of each.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
module overview&lt;br /&gt;
module avail&lt;br /&gt;
module spider&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Searching for modules ==&lt;br /&gt;
&lt;br /&gt;
The same three commands search when you pass a module name as an argument, again at increasing levels of detail:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
module overview &amp;lt;nameOfModule&amp;gt;&lt;br /&gt;
module avail &amp;lt;nameOfModule&amp;gt;&lt;br /&gt;
module spider &amp;lt;nameOfModule&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Searching by keyword ===&lt;br /&gt;
&lt;br /&gt;
You can also search for a keyword inside modules with &amp;lt;code&amp;gt;module key&amp;lt;/code&amp;gt;. This is useful for finding which module contains a specific Python or R extension — there are bundle modules for both languages that list their extensions, and Lmod searches the module descriptions too.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
module key &amp;lt;keyword&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For example, to find which module provides the R package &amp;lt;code&amp;gt;terra&amp;lt;/code&amp;gt;, first load a bucket, then search:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
module load 2023&lt;br /&gt;
module key terra&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
which yields:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
The following modules match your search criteria: &amp;quot;terra&amp;quot;&lt;br /&gt;
--------------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
  R-bundle-CRAN: R-bundle-CRAN/2023.12-foss-2023a&lt;br /&gt;
    Bundle of R packages from CRAN&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------------------------------&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So you would load &amp;lt;code&amp;gt;R-bundle-CRAN/2023.12-foss-2023a&amp;lt;/code&amp;gt; to get the &amp;lt;code&amp;gt;terra&amp;lt;/code&amp;gt; package.&lt;br /&gt;
&lt;br /&gt;
== Loading modules ==&lt;br /&gt;
&lt;br /&gt;
Load a module by name:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
module load &amp;lt;moduleName&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For example, to load Python from the 2023 bucket:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
module load 2023&lt;br /&gt;
module load Python/3.11.3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Specify the version&#039;&#039;&#039; you load, as in the example. It is good practice for consistency and reproducibility — if you omit the version, Lmod picks whatever the current default is, and that default can change over time. Naming the exact version in a submit script also turns the script into documentation of the environment it ran in. When you load a module, its dependencies are loaded automatically.&lt;br /&gt;
&lt;br /&gt;
=== Listing loaded modules ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
module list&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Following the example above, after loading the 2023 bucket and &amp;lt;code&amp;gt;Python/3.11.3&amp;lt;/code&amp;gt;, the list shows the module plus the dependencies pulled in with it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
user001@login201:~$ module list&lt;br /&gt;
&lt;br /&gt;
Currently Loaded Modules:&lt;br /&gt;
  1) slurm/24.05.1              (S)   5) binutils/2.40-GCCcore-12.3.0     9) Tcl/8.6.13-GCCcore-12.3.0     13) OpenSSL/1.1&lt;br /&gt;
  2) 2023                             6) bzip2/1.0.8-GCCcore-12.3.0      10) SQLite/3.42.0-GCCcore-12.3.0  14) Python/3.11.3-GCCcore-12.3.0&lt;br /&gt;
  3) GCCcore/12.3.0                   7) ncurses/6.4-GCCcore-12.3.0      11) XZ/5.4.2-GCCcore-12.3.0&lt;br /&gt;
  4) zlib/1.2.13-GCCcore-12.3.0       8) libreadline/8.2-GCCcore-12.3.0  12) libffi/3.4.4-GCCcore-12.3.0&lt;br /&gt;
&lt;br /&gt;
  Where:&lt;br /&gt;
   S:  Module is Sticky, requires --force to unload or purge&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;slurm&amp;lt;/code&amp;gt; module is loaded by default and marked &#039;&#039;&#039;Sticky&#039;&#039;&#039; (&amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt;) — it survives a normal unload or purge.&lt;br /&gt;
&lt;br /&gt;
== Removing and switching modules ==&lt;br /&gt;
&lt;br /&gt;
Unload a single module:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
module unload Python/3.11.3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This unloads only the named module, not its dependencies. To swap one module for another in a single step:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
module switch &amp;lt;oldModule&amp;gt; &amp;lt;newModule&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Some modules refuse to load alongside others — for example, two Java modules cannot be loaded at once. Attempting it produces a conflict message:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Module &#039;foo/2&#039; conflicts with the currently loaded module(s) &#039;foo/1&#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When you see this, unload or switch rather than trying to stack the two modules.&lt;br /&gt;
&lt;br /&gt;
To clear the whole environment, use &amp;lt;code&amp;gt;purge&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
module purge&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sticky modules such as &amp;lt;code&amp;gt;slurm&amp;lt;/code&amp;gt; survive a plain purge:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
user001@login201:~$ module purge&lt;br /&gt;
The following modules were not unloaded:&lt;br /&gt;
  (Use &amp;quot;module --force purge&amp;quot; to unload all):&lt;br /&gt;
&lt;br /&gt;
  1) slurm/24.05.1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Putting &amp;lt;code&amp;gt;module purge&amp;lt;/code&amp;gt; (or &amp;lt;code&amp;gt;module reset&amp;lt;/code&amp;gt;) near the top of a job script is good practice: it clears anything that might have been loaded by mistake, so the job starts from a known-clean environment.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[Installing Personal Software]]&lt;br /&gt;
* [[Batch Jobs]]&lt;br /&gt;
* [[Python]]&lt;br /&gt;
* [[R]]&lt;br /&gt;
* [[Apptainer]]&lt;br /&gt;
* [[ABGC/Modules]] — group-specific modules for ABGC&lt;br /&gt;
&lt;br /&gt;
== External links ==&lt;br /&gt;
&lt;br /&gt;
* [https://lmod.readthedocs.io/ Lmod documentation]&lt;br /&gt;
* [https://easybuild.io/ EasyBuild]&lt;br /&gt;
* [https://github.com/easybuilders/easybuild-easyconfigs/tree/develop/easybuild/easyconfigs EasyBuild easyconfigs repository]&lt;/div&gt;</summary>
		<author><name>Honfi001</name></author>
	</entry>
	<entry>
		<id>https://wiki.anunna.wur.nl/index.php?title=Tutorials&amp;diff=3064</id>
		<title>Tutorials</title>
		<link rel="alternate" type="text/html" href="https://wiki.anunna.wur.nl/index.php?title=Tutorials&amp;diff=3064"/>
		<updated>2026-08-17T15:13:52Z</updated>

		<summary type="html">&lt;p&gt;Honfi001: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hands-on tutorials for working on Anunna. For instructor-led courses see [[Workshops]], and for course slides and self-study material see [[Training Materials]].&lt;br /&gt;
&lt;br /&gt;
== Apptainer (containers) ==&lt;br /&gt;
&lt;br /&gt;
* [[Tutorials/Apptainer-Introduction|Introduction]]&lt;br /&gt;
* [[Tutorials/Apptainer-PullingImages|Pulling images]]&lt;br /&gt;
* [[Tutorials/Apptainer-FakerootAndOverlays|Fakeroot and overlays]]&lt;br /&gt;
* [[Tutorials/Apptainer-FakerootAndSandbox|Fakeroot and sandbox]]&lt;br /&gt;
* [[Tutorials/Apptainer-DefinitionFiles|Definition files]]&lt;br /&gt;
* [[Tutorials/Apptainer-GPUs|GPUs]]&lt;br /&gt;
* [[Tutorials/Apptainer-Conda|Conda in a Container]]&lt;br /&gt;
&lt;br /&gt;
== Linux ==&lt;br /&gt;
&lt;br /&gt;
* [[Linux Basic/Linux Self Assessment]] — check whether your command-line skills are ready for the HPC and container courses.&lt;br /&gt;
&lt;br /&gt;
== Parallelism ==&lt;br /&gt;
&lt;br /&gt;
* [[Tutorials/Parallelism-Estimating-Pi|Estimating Pi]]&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Workshops]]&lt;br /&gt;
* [[Training Materials]]&lt;br /&gt;
* [[Apptainer]]&lt;/div&gt;</summary>
		<author><name>Honfi001</name></author>
	</entry>
	<entry>
		<id>https://wiki.anunna.wur.nl/index.php?title=Tutorials/Apptainer-Conda&amp;diff=3063</id>
		<title>Tutorials/Apptainer-Conda</title>
		<link rel="alternate" type="text/html" href="https://wiki.anunna.wur.nl/index.php?title=Tutorials/Apptainer-Conda&amp;diff=3063"/>
		<updated>2026-08-17T15:10:11Z</updated>

		<summary type="html">&lt;p&gt;Honfi001: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:Tutorial: Conda in an Apptainer Container}}&lt;br /&gt;
= Running a Conda Environment in a Container =&lt;br /&gt;
&lt;br /&gt;
Sometimes a piece of software is published only as a conda package, with no module, no Python-only equivalent and no ready-made image. Building it into a container is the cleanest way to run it on Anunna: the environment is created once, on a compute node, and afterwards it is a single file that behaves the same way every time you use it.&lt;br /&gt;
&lt;br /&gt;
Read [[Python/Conda]] first if you have not already. This tutorial is the last resort described at the end of that page, not the recommended route.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important:&#039;&#039;&#039; Before you begin, make sure the following are in place:&lt;br /&gt;
&lt;br /&gt;
* You are running on a &#039;&#039;&#039;compute node&#039;&#039;&#039;, not a login node. Request an interactive session first — see [[Interactive Jobs]].&lt;br /&gt;
* Your &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt; image files should be stored on &#039;&#039;&#039;Lustre&#039;&#039;&#039;, not in your home directory. SIF files can be large and will eat through your home quota fast.&lt;br /&gt;
* Set your Apptainer cache to Lustre as well. Add this to your session (or your &amp;lt;code&amp;gt;.bashrc&amp;lt;/code&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
export APPTAINER_CACHEDIR=$myScratch/apptainer_cache&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Getting Started ==&lt;br /&gt;
&lt;br /&gt;
Load the required modules:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
module reset&lt;br /&gt;
module load utilities Apptainer&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Three things to know first ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;A container should not be your first move.&#039;&#039;&#039; Always prefer software we already provide as [[Environment Modules|modules]], or a [[Python/Modules#Virtual environments|virtual environment]] built on one of our Python modules. Those are compiled for this machine and we are far better placed to help you when something goes wrong. [[Support|Ask us]] if what you need is missing.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;This tutorial uses micromamba, not conda.&#039;&#039;&#039; Micromamba is a single small program that installs conda packages, and it takes them from conda-forge and bioconda rather than from Anaconda&#039;s own repository. That keeps you clear of the licensing conditions described in [[Python/Conda#How they differ]].&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;The image we build is read-only.&#039;&#039;&#039; Everything the environment needs is decided up front and baked in. Do not try to install software interactively inside a running container: the changes will not survive, and you lose the one real advantage of doing this, which is that the result is reproducible.&lt;br /&gt;
&lt;br /&gt;
== Step 1: Describe the environment ==&lt;br /&gt;
&lt;br /&gt;
Create a file called &amp;lt;code&amp;gt;environment.yml&amp;lt;/code&amp;gt;. This is where you name the environment, list the packages you want, and say which repositories to take them from.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
name: base&lt;br /&gt;
channels:&lt;br /&gt;
  - conda-forge&lt;br /&gt;
  - bioconda&lt;br /&gt;
dependencies:&lt;br /&gt;
  - python&lt;br /&gt;
  - pip&lt;br /&gt;
  - star&lt;br /&gt;
  - bwa&lt;br /&gt;
  - multiqc&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Two notes on this file. Keep the name as &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt;, because that is the environment micromamba&#039;s image already has and installing into it saves a step. And for real work, pin your versions — &amp;lt;code&amp;gt;multiqc=1.29&amp;lt;/code&amp;gt; rather than &amp;lt;code&amp;gt;multiqc&amp;lt;/code&amp;gt; — otherwise rebuilding the image in six months will quietly give you different software.&lt;br /&gt;
&lt;br /&gt;
== Step 2: Write the definition file ==&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;definition file&#039;&#039;&#039; describes how the container is built, step by step. Create &amp;lt;code&amp;gt;image.def&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
Bootstrap: docker&lt;br /&gt;
From: mambaorg/micromamba:latest&lt;br /&gt;
&lt;br /&gt;
%files&lt;br /&gt;
    environment.yml /environment.yml&lt;br /&gt;
&lt;br /&gt;
%post&lt;br /&gt;
    micromamba install -n base --file /environment.yml &amp;amp;&amp;amp; \&lt;br /&gt;
        micromamba clean --all --yes&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each part in turn:&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;Bootstrap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;From&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
Start from a Docker image that already has micromamba installed, so we do not have to install it ourselves.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;%files&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
Copy &amp;lt;code&amp;gt;environment.yml&amp;lt;/code&amp;gt; from your directory on Anunna into the container, so the next step can read it.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;%post&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
Run micromamba inside the container to install everything listed in the file, then delete its download cache. That last part matters: without &amp;lt;code&amp;gt;clean&amp;lt;/code&amp;gt;, the cache is baked into the image and can easily double its size.&lt;br /&gt;
&lt;br /&gt;
== Step 3: Build the image ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
apptainer build image.sif image.def&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This takes a few minutes and produces a single file, &amp;lt;code&amp;gt;image.sif&amp;lt;/code&amp;gt;, containing the whole environment.&lt;br /&gt;
&lt;br /&gt;
If the build fails complaining about directories from the host, clear Apptainer&#039;s bind list for the duration of the build:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
APPTAINER_BIND=&#039; &#039; apptainer build image.sif image.def&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Testing the image ==&lt;br /&gt;
&lt;br /&gt;
Check that the software is really there:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
apptainer run image.sif multiqc --help&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You should see MultiQC&#039;s own help text, beginning with its version number and a usage line. If instead you get an error saying the command was not found, read the note below.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Use &amp;lt;code&amp;gt;run&amp;lt;/code&amp;gt;, not &amp;lt;code&amp;gt;exec&amp;lt;/code&amp;gt;.&#039;&#039;&#039; The micromamba image activates the environment as it starts up, and &amp;lt;code&amp;gt;apptainer run&amp;lt;/code&amp;gt; goes through that startup step while &amp;lt;code&amp;gt;apptainer exec&amp;lt;/code&amp;gt; skips it. With &amp;lt;code&amp;gt;exec&amp;lt;/code&amp;gt; you will most likely be told the command cannot be found, even though it is installed.&lt;br /&gt;
&lt;br /&gt;
== Using it in a job ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#SBATCH --job-name=multiqc&lt;br /&gt;
#SBATCH --time=1:00:00&lt;br /&gt;
#SBATCH --cpus-per-task=4&lt;br /&gt;
#SBATCH --mem=16G&lt;br /&gt;
&lt;br /&gt;
module load utilities Apptainer&lt;br /&gt;
&lt;br /&gt;
apptainer run --bind /lustre $myNobackup/images/image.sif multiqc /path/to/results&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Apptainer does not automatically make every filesystem visible inside the container, so &amp;lt;code&amp;gt;--bind /lustre&amp;lt;/code&amp;gt; ensures your data can be read.&lt;br /&gt;
&lt;br /&gt;
== Where to keep your images ==&lt;br /&gt;
&lt;br /&gt;
Image files are large. Keep them on Lustre, under &amp;lt;code&amp;gt;$myNobackup&amp;lt;/code&amp;gt;, and not in your home directory.&lt;br /&gt;
&lt;br /&gt;
If several people in your group use the same software, put one copy somewhere shared instead of each keeping their own — see [[Shared Storage]]. A container is a single file and is identical for everyone who runs it, which is precisely what makes sharing it worthwhile.&lt;br /&gt;
&lt;br /&gt;
One habit worth forming: identify an image by what is inside it, using &amp;lt;code&amp;gt;apptainer inspect&amp;lt;/code&amp;gt;, rather than by trusting its file name.&lt;br /&gt;
&lt;br /&gt;
== Summary ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Step !! Command&lt;br /&gt;
|-&lt;br /&gt;
| Load Apptainer || &amp;lt;code&amp;gt;module reset &amp;amp;&amp;amp; module load utilities Apptainer&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Describe the environment || Write &amp;lt;code&amp;gt;environment.yml&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Describe the container || Write &amp;lt;code&amp;gt;image.def&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Build the image || &amp;lt;code&amp;gt;apptainer build image.sif image.def&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Run something in it || &amp;lt;code&amp;gt;apptainer run image.sif &amp;amp;lt;command&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Inspect it || &amp;lt;code&amp;gt;apptainer inspect image.sif&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[Python/Conda]]&lt;br /&gt;
* [[Apptainer]]&lt;br /&gt;
* [[Tutorials/Apptainer-Introduction]]&lt;br /&gt;
* [[Tutorials/Apptainer-DefinitionFiles]]&lt;br /&gt;
* [[Interactive Jobs]]&lt;br /&gt;
* [[Batch Jobs]]&lt;br /&gt;
* [[Shared Storage]]&lt;br /&gt;
&lt;br /&gt;
== External links ==&lt;br /&gt;
&lt;br /&gt;
* [https://mamba.readthedocs.io/en/latest/user_guide/micromamba.html micromamba documentation]&lt;br /&gt;
* [https://docs.conda.io/projects/conda/en/latest/user-guide/tasks/manage-environments.html#create-env-file-manually Writing an environment.yml file]&lt;br /&gt;
* [https://apptainer.org/docs/user/main/definition_files.html Apptainer definition files]&lt;br /&gt;
* [https://depot.galaxyproject.org/singularity/ Prebuilt bioconda container images]&lt;/div&gt;</summary>
		<author><name>Honfi001</name></author>
	</entry>
	<entry>
		<id>https://wiki.anunna.wur.nl/index.php?title=Tutorials/Apptainer-Conda&amp;diff=3062</id>
		<title>Tutorials/Apptainer-Conda</title>
		<link rel="alternate" type="text/html" href="https://wiki.anunna.wur.nl/index.php?title=Tutorials/Apptainer-Conda&amp;diff=3062"/>
		<updated>2026-08-17T15:09:47Z</updated>

		<summary type="html">&lt;p&gt;Honfi001: Created page with &amp;quot;{{DISPLAYTITLE:Totorial: Conda in an Apptainer Container}} = Running a Conda Environment in a Container =  Sometimes a piece of software is published only as a conda package, with no module, no Python-only equivalent and no ready-made image. Building it into a container is the cleanest way to run it on Anunna: the environment is created once, on a compute node, and afterwards it is a single file that behaves the same way every time you use it.  Read Python/Conda firs...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:Totorial: Conda in an Apptainer Container}}&lt;br /&gt;
= Running a Conda Environment in a Container =&lt;br /&gt;
&lt;br /&gt;
Sometimes a piece of software is published only as a conda package, with no module, no Python-only equivalent and no ready-made image. Building it into a container is the cleanest way to run it on Anunna: the environment is created once, on a compute node, and afterwards it is a single file that behaves the same way every time you use it.&lt;br /&gt;
&lt;br /&gt;
Read [[Python/Conda]] first if you have not already. This tutorial is the last resort described at the end of that page, not the recommended route.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important:&#039;&#039;&#039; Before you begin, make sure the following are in place:&lt;br /&gt;
&lt;br /&gt;
* You are running on a &#039;&#039;&#039;compute node&#039;&#039;&#039;, not a login node. Request an interactive session first — see [[Interactive Jobs]].&lt;br /&gt;
* Your &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt; image files should be stored on &#039;&#039;&#039;Lustre&#039;&#039;&#039;, not in your home directory. SIF files can be large and will eat through your home quota fast.&lt;br /&gt;
* Set your Apptainer cache to Lustre as well. Add this to your session (or your &amp;lt;code&amp;gt;.bashrc&amp;lt;/code&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
export APPTAINER_CACHEDIR=$myScratch/apptainer_cache&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Getting Started ==&lt;br /&gt;
&lt;br /&gt;
Load the required modules:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
module reset&lt;br /&gt;
module load utilities Apptainer&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Three things to know first ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;A container should not be your first move.&#039;&#039;&#039; Always prefer software we already provide as [[Environment Modules|modules]], or a [[Python/Modules#Virtual environments|virtual environment]] built on one of our Python modules. Those are compiled for this machine and we are far better placed to help you when something goes wrong. [[Support|Ask us]] if what you need is missing.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;This tutorial uses micromamba, not conda.&#039;&#039;&#039; Micromamba is a single small program that installs conda packages, and it takes them from conda-forge and bioconda rather than from Anaconda&#039;s own repository. That keeps you clear of the licensing conditions described in [[Python/Conda#How they differ]].&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;The image we build is read-only.&#039;&#039;&#039; Everything the environment needs is decided up front and baked in. Do not try to install software interactively inside a running container: the changes will not survive, and you lose the one real advantage of doing this, which is that the result is reproducible.&lt;br /&gt;
&lt;br /&gt;
== Step 1: Describe the environment ==&lt;br /&gt;
&lt;br /&gt;
Create a file called &amp;lt;code&amp;gt;environment.yml&amp;lt;/code&amp;gt;. This is where you name the environment, list the packages you want, and say which repositories to take them from.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
name: base&lt;br /&gt;
channels:&lt;br /&gt;
  - conda-forge&lt;br /&gt;
  - bioconda&lt;br /&gt;
dependencies:&lt;br /&gt;
  - python&lt;br /&gt;
  - pip&lt;br /&gt;
  - star&lt;br /&gt;
  - bwa&lt;br /&gt;
  - multiqc&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Two notes on this file. Keep the name as &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt;, because that is the environment micromamba&#039;s image already has and installing into it saves a step. And for real work, pin your versions — &amp;lt;code&amp;gt;multiqc=1.29&amp;lt;/code&amp;gt; rather than &amp;lt;code&amp;gt;multiqc&amp;lt;/code&amp;gt; — otherwise rebuilding the image in six months will quietly give you different software.&lt;br /&gt;
&lt;br /&gt;
== Step 2: Write the definition file ==&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;definition file&#039;&#039;&#039; describes how the container is built, step by step. Create &amp;lt;code&amp;gt;image.def&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
Bootstrap: docker&lt;br /&gt;
From: mambaorg/micromamba:latest&lt;br /&gt;
&lt;br /&gt;
%files&lt;br /&gt;
    environment.yml /environment.yml&lt;br /&gt;
&lt;br /&gt;
%post&lt;br /&gt;
    micromamba install -n base --file /environment.yml &amp;amp;&amp;amp; \&lt;br /&gt;
        micromamba clean --all --yes&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each part in turn:&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;Bootstrap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;From&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
Start from a Docker image that already has micromamba installed, so we do not have to install it ourselves.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;%files&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
Copy &amp;lt;code&amp;gt;environment.yml&amp;lt;/code&amp;gt; from your directory on Anunna into the container, so the next step can read it.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;%post&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
Run micromamba inside the container to install everything listed in the file, then delete its download cache. That last part matters: without &amp;lt;code&amp;gt;clean&amp;lt;/code&amp;gt;, the cache is baked into the image and can easily double its size.&lt;br /&gt;
&lt;br /&gt;
== Step 3: Build the image ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
apptainer build image.sif image.def&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This takes a few minutes and produces a single file, &amp;lt;code&amp;gt;image.sif&amp;lt;/code&amp;gt;, containing the whole environment.&lt;br /&gt;
&lt;br /&gt;
If the build fails complaining about directories from the host, clear Apptainer&#039;s bind list for the duration of the build:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
APPTAINER_BIND=&#039; &#039; apptainer build image.sif image.def&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Testing the image ==&lt;br /&gt;
&lt;br /&gt;
Check that the software is really there:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
apptainer run image.sif multiqc --help&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You should see MultiQC&#039;s own help text, beginning with its version number and a usage line. If instead you get an error saying the command was not found, read the note below.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Use &amp;lt;code&amp;gt;run&amp;lt;/code&amp;gt;, not &amp;lt;code&amp;gt;exec&amp;lt;/code&amp;gt;.&#039;&#039;&#039; The micromamba image activates the environment as it starts up, and &amp;lt;code&amp;gt;apptainer run&amp;lt;/code&amp;gt; goes through that startup step while &amp;lt;code&amp;gt;apptainer exec&amp;lt;/code&amp;gt; skips it. With &amp;lt;code&amp;gt;exec&amp;lt;/code&amp;gt; you will most likely be told the command cannot be found, even though it is installed.&lt;br /&gt;
&lt;br /&gt;
== Using it in a job ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#SBATCH --job-name=multiqc&lt;br /&gt;
#SBATCH --time=1:00:00&lt;br /&gt;
#SBATCH --cpus-per-task=4&lt;br /&gt;
#SBATCH --mem=16G&lt;br /&gt;
&lt;br /&gt;
module load utilities Apptainer&lt;br /&gt;
&lt;br /&gt;
apptainer run --bind /lustre $myNobackup/images/image.sif multiqc /path/to/results&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Apptainer does not automatically make every filesystem visible inside the container, so &amp;lt;code&amp;gt;--bind /lustre&amp;lt;/code&amp;gt; ensures your data can be read.&lt;br /&gt;
&lt;br /&gt;
== Where to keep your images ==&lt;br /&gt;
&lt;br /&gt;
Image files are large. Keep them on Lustre, under &amp;lt;code&amp;gt;$myNobackup&amp;lt;/code&amp;gt;, and not in your home directory.&lt;br /&gt;
&lt;br /&gt;
If several people in your group use the same software, put one copy somewhere shared instead of each keeping their own — see [[Shared Storage]]. A container is a single file and is identical for everyone who runs it, which is precisely what makes sharing it worthwhile.&lt;br /&gt;
&lt;br /&gt;
One habit worth forming: identify an image by what is inside it, using &amp;lt;code&amp;gt;apptainer inspect&amp;lt;/code&amp;gt;, rather than by trusting its file name.&lt;br /&gt;
&lt;br /&gt;
== Summary ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Step !! Command&lt;br /&gt;
|-&lt;br /&gt;
| Load Apptainer || &amp;lt;code&amp;gt;module reset &amp;amp;&amp;amp; module load utilities Apptainer&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Describe the environment || Write &amp;lt;code&amp;gt;environment.yml&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Describe the container || Write &amp;lt;code&amp;gt;image.def&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Build the image || &amp;lt;code&amp;gt;apptainer build image.sif image.def&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Run something in it || &amp;lt;code&amp;gt;apptainer run image.sif &amp;amp;lt;command&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Inspect it || &amp;lt;code&amp;gt;apptainer inspect image.sif&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[Python/Conda]]&lt;br /&gt;
* [[Apptainer]]&lt;br /&gt;
* [[Tutorials/Apptainer-Introduction]]&lt;br /&gt;
* [[Tutorials/Apptainer-DefinitionFiles]]&lt;br /&gt;
* [[Interactive Jobs]]&lt;br /&gt;
* [[Batch Jobs]]&lt;br /&gt;
* [[Shared Storage]]&lt;br /&gt;
&lt;br /&gt;
== External links ==&lt;br /&gt;
&lt;br /&gt;
* [https://mamba.readthedocs.io/en/latest/user_guide/micromamba.html micromamba documentation]&lt;br /&gt;
* [https://docs.conda.io/projects/conda/en/latest/user-guide/tasks/manage-environments.html#create-env-file-manually Writing an environment.yml file]&lt;br /&gt;
* [https://apptainer.org/docs/user/main/definition_files.html Apptainer definition files]&lt;br /&gt;
* [https://depot.galaxyproject.org/singularity/ Prebuilt bioconda container images]&lt;/div&gt;</summary>
		<author><name>Honfi001</name></author>
	</entry>
	<entry>
		<id>https://wiki.anunna.wur.nl/index.php?title=Apptainer&amp;diff=3061</id>
		<title>Apptainer</title>
		<link rel="alternate" type="text/html" href="https://wiki.anunna.wur.nl/index.php?title=Apptainer&amp;diff=3061"/>
		<updated>2026-08-17T15:06:22Z</updated>

		<summary type="html">&lt;p&gt;Honfi001: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Apptainer is a container platform. It allows you to create and run containers that package up pieces of software in a way that is portable and reproducible. You can build a container using Apptainer on your laptop, and then run it on many of the largest HPC clusters in the world, local university or company clusters, a single server, in the cloud, or on a workstation down the hall. Your container is a single file, and you don’t have to worry about how to install all the software you need on each different operating system.&lt;br /&gt;
&lt;br /&gt;
Apptainer is a fork of singularity and, thus, also supports singularity commands and workflows.&lt;br /&gt;
&lt;br /&gt;
==Apptainer on Anunna==&lt;br /&gt;
&lt;br /&gt;
Since Apptainer is not dependent on specific compilers and toolchains, it is now place inside the &#039;&#039;&#039;utilities&#039;&#039;&#039; bucket.  The  &#039;&#039;&#039;Apptainer&#039;&#039;&#039; module the version compiled in Anunna. &lt;br /&gt;
&lt;br /&gt;
One can load apptainer by running the following commands&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;module load utilities&lt;br /&gt;
module load Apptainer&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Initial Setup ====&lt;br /&gt;
Apptainer will cache SIF container images generated from remote sources, and any OCI/docker layers used to create them. The cache is created at &amp;lt;code&amp;gt;$HOME/.apptainer/cache&amp;lt;/code&amp;gt; by default. The location of the cache can be changed by setting the &amp;lt;code&amp;gt;APPTAINER_CACHEDIR&amp;lt;/code&amp;gt; environment variable.&lt;br /&gt;
&lt;br /&gt;
Since there is a limited amount of space available at &amp;lt;code&amp;gt;$HOME&amp;lt;/code&amp;gt;, the Apptainer cache can quickly fill your quota. So it is recommended that you set the variable &amp;lt;code&amp;gt;APPTAINER_CACHEDIR&amp;lt;/code&amp;gt; to a location in lustre by defined in your &amp;lt;code&amp;gt;$HOME/.bash_aliases&amp;lt;/code&amp;gt; file. An example is provided at [[Aliases and local variables]]&lt;/div&gt;</summary>
		<author><name>Honfi001</name></author>
	</entry>
	<entry>
		<id>https://wiki.anunna.wur.nl/index.php?title=Python/Modules&amp;diff=3060</id>
		<title>Python/Modules</title>
		<link rel="alternate" type="text/html" href="https://wiki.anunna.wur.nl/index.php?title=Python/Modules&amp;diff=3060"/>
		<updated>2026-08-17T14:59:54Z</updated>

		<summary type="html">&lt;p&gt;Honfi001: /* See also */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:Python Modules}}&lt;br /&gt;
= Modules =&lt;br /&gt;
The Python Environment Modules are the only officially supported Python distributions in the HPC. These are compiled for each specific architecture of the HPC and hence are likely going to be more performant than the versions obtained via Mamba or UV. &lt;br /&gt;
&lt;br /&gt;
Anunna provides one Python version per [[Environment Modules | module bucket]], plus bundle modules that carry a curated set of common extensions. Load a bucket, then the Python module:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;2023&#039;&#039;&#039;: &amp;lt;code&amp;gt;Python/3.11.3&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;2024&#039;&#039;&#039;: &amp;lt;code&amp;gt;Python/3.12.3&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;2024&#039;&#039;&#039;: &amp;lt;code&amp;gt;Python/3.13.1&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So, for instance, loading Python 3.12.3&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
module load 2024&lt;br /&gt;
module load Python/3.12.3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The bundle module &amp;lt;code&amp;gt;Python-bundle-PyPI&amp;lt;/code&amp;gt; adds many frequently-used packages on top of the base interpreter. Use &amp;lt;code&amp;gt;module key &amp;lt;package&amp;gt;&amp;lt;/code&amp;gt; to find which bundle contains a package you need (see [[Environment Modules#Searching by keyword | searching modules by keyword]]).&lt;br /&gt;
&lt;br /&gt;
For packages not in a module, the two recommended routes are a &#039;&#039;&#039;virtual environment&#039;&#039;&#039; built on a Python module (below), or &#039;&#039;&#039;Miniforge&#039;&#039;&#039; for a self-contained conda/mamba setup. The use of Anaconda is discouraged on Anunna — its default channels carry licensing restrictions and the full distribution is heavy; Miniforge is the lighter, unrestricted alternative.&lt;br /&gt;
&lt;br /&gt;
== Virtual environments ==&lt;br /&gt;
&lt;br /&gt;
A virtual environment is a self-contained directory holding a specific Python and its packages, so one project&#039;s dependencies cannot clash with another&#039;s. Python&#039;s built-in &amp;lt;code&amp;gt;venv&amp;lt;/code&amp;gt; module is the simplest way to make one on top of a Python module.&lt;br /&gt;
&lt;br /&gt;
First load the Python version you want:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
module load 2024&lt;br /&gt;
module load Python/3.12.3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then create the environment in a location of your choosing. The example uses &amp;lt;code&amp;gt;$myNobackup/PythonEnv&amp;lt;/code&amp;gt; — &amp;lt;code&amp;gt;$myNobackup&amp;lt;/code&amp;gt; is your Lustre nobackup location, set in your &amp;lt;code&amp;gt;~/.bash_aliases&amp;lt;/code&amp;gt; (see [[Installing Personal Software#Aliases and local variables | Aliases and local variables]]). Keeping environments on Lustre rather than your home directory avoids filling your home quota, and the nobackup tier is the right choice because an environment can always be recreated from scratch and so does not need backing up.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python -m venv $myNobackup/PythonEnv/my_env&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Activate it whenever you want to use it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
source $myNobackup/PythonEnv/my_env/bin/activate&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once active, the environment name appears as a prefix in your prompt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
(my_env) user001@login200:~$&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Install packages with &amp;lt;code&amp;gt;pip&amp;lt;/code&amp;gt; while the environment is active; they go into the environment, not your home directory:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
pip install -U numpy pandas matplotlib&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Leave the environment with &amp;lt;code&amp;gt;deactivate&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Jupyter kernels ==&lt;br /&gt;
&lt;br /&gt;
Once your virtual environment has been setup, you can can access it in jupyter, either via the apps or the notebooks page by setting up a kernel. A kernel is nothing more than a json file with details for jupyter on where to find your Python environment. First things first,  with your Python modules loaded activate your virtual environment from the example before. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;source $myNobackup/PythonEnv/my_env/bin/activate&amp;lt;/syntaxhighlight&amp;gt;The install [https://pypi.org/project/ipykernel/ ipyKernel]&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;(my_env) user001@login200:~$ pip install -U ipykernel&amp;lt;/syntaxhighlight&amp;gt;This is the only dependency that Python needs for creating kernels, you can then run &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;(my_env) user001@login200:~$ python -m ipykernel install --user --name=myenv --display-name=&amp;quot;Python (myenv)&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;This command will create a folder labelled &amp;lt;code&amp;gt;myenv&amp;lt;/code&amp;gt;  containing a &amp;lt;code&amp;gt;kernel.json&amp;lt;/code&amp;gt; file inside of  &amp;lt;code&amp;gt;$HOME/.local/share/jupyter/kernels/&amp;lt;/code&amp;gt; , which jupyter watches. If your goal is just to create a kernel for yourself, then you are done. The kernel should be visible to you both inside of the jupyter instances, either the ones accessed via the [https://apps.anunna.wur.nl anuna apps portal] or the [https://notebook.anunna.wur.nl notebooks page].  Thus, the kernel will not be visible or accessible to other users. &lt;br /&gt;
&lt;br /&gt;
The --name=myenv flag is entirely optional, it is the directory in which the &amp;lt;code&amp;gt;kernel.json&amp;lt;/code&amp;gt; file is generated. If not used, python will simply label it &amp;lt;code&amp;gt;python3&amp;lt;/code&amp;gt; . The use of this flag is recommended, specially when working with multiple kernels to avoid overwriting previously created kernels. &lt;br /&gt;
&lt;br /&gt;
=== Shared Kernels ===&lt;br /&gt;
Whether for a course or collaboration, sometimes it is convenient to share a kernel with other users. This is possible and the procedure is a variation of the previous one, with just some additional requirements&lt;br /&gt;
&lt;br /&gt;
* The virtual environment you create needs to be in a shared location , e.g. /lutre/shared&lt;br /&gt;
* The virtual environment folder needs to be visiible and accessible to other users i.e. it must have read and execute permissions, 755 is recommended&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Like before load the  bucket and its corresponding Python version and create your project folder and go there&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;module load 2025&lt;br /&gt;
module load Python/3.13.1&lt;br /&gt;
mkdir /lustre/shared/MyProject&lt;br /&gt;
cd /lustre/shared/MyProject&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Then create your virtual environemnt, activate it and install [https://pypi.org/project/ipykernel/ ipyKernel]&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;python -m venv ./project_env&lt;br /&gt;
source /lustre/shared/MyProject/project_env/bin/activate&lt;br /&gt;
pip install -U ipykernel&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here is where things differ, inside the activate kernel run the command&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python -m ipykernel install --sys-prefix --name=myproject --display-name=&amp;quot;Python (project_env)&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Note that now the command uses the flag  --sys-prefix . This flag sets the installation path of the kernel &#039;&#039;&#039;inside&#039;&#039;&#039; the virtual environment&#039;s directory, in this case, the kernel.json file will be generate in  &amp;lt;code&amp;gt;/lustre/shared/MyProject/project_env/share/jupyter/kernels/myproject&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
While the kernel has been created, jupyter still will not be able to see it. In order to be able to see and access the kernel you would need to either copy it to your  folder&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
MYPROJ=/lustre/shared/MyProject&lt;br /&gt;
cp -r $MYPROJ/project_env/share/jupyter/kernels/myproject $HOME/.local/share/jupyter/kernels/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;or link it&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
MYPROJ=/lustre/shared/MyProject&lt;br /&gt;
ln -s $MYPROJ/project_env/share/jupyter/kernels/myproject $HOME/.local/share/jupyter/kernels/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Any users that run this last step should gain access to the kernel from jupyter. Though note, that only users that have write permissions to virtual environment will be able to install and remove modules from it.   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color: #e7f3fe; border-left: 6px solid #2196F3; padding: 10px; margin-bottom: 15px;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; When using custom kernels do not run &amp;lt;code&amp;gt;!pip&amp;lt;/code&amp;gt;, just run &amp;lt;code&amp;gt;pip&amp;lt;/code&amp;gt; without the &amp;lt;code&amp;gt;!&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[Environment Modules]]&lt;br /&gt;
* [[Installing Personal Software]]&lt;br /&gt;
* [[Jupyter]]&lt;br /&gt;
* [[Python]]&lt;br /&gt;
* [[R]]&lt;br /&gt;
* [[Apptainer]]&lt;br /&gt;
&lt;br /&gt;
== External links ==&lt;br /&gt;
&lt;br /&gt;
* [https://docs.python.org/3/library/venv.html Python venv documentation]&lt;br /&gt;
* [https://github.com/conda-forge/miniforge Miniforge]&lt;br /&gt;
* [https://conda-forge.org/ conda-forge]&lt;/div&gt;</summary>
		<author><name>Honfi001</name></author>
	</entry>
	<entry>
		<id>https://wiki.anunna.wur.nl/index.php?title=Python/Modules&amp;diff=3059</id>
		<title>Python/Modules</title>
		<link rel="alternate" type="text/html" href="https://wiki.anunna.wur.nl/index.php?title=Python/Modules&amp;diff=3059"/>
		<updated>2026-08-17T14:49:19Z</updated>

		<summary type="html">&lt;p&gt;Honfi001: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:Python Modules}}&lt;br /&gt;
= Modules =&lt;br /&gt;
The Python Environment Modules are the only officially supported Python distributions in the HPC. These are compiled for each specific architecture of the HPC and hence are likely going to be more performant than the versions obtained via Mamba or UV. &lt;br /&gt;
&lt;br /&gt;
Anunna provides one Python version per [[Environment Modules | module bucket]], plus bundle modules that carry a curated set of common extensions. Load a bucket, then the Python module:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;2023&#039;&#039;&#039;: &amp;lt;code&amp;gt;Python/3.11.3&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;2024&#039;&#039;&#039;: &amp;lt;code&amp;gt;Python/3.12.3&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;2024&#039;&#039;&#039;: &amp;lt;code&amp;gt;Python/3.13.1&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So, for instance, loading Python 3.12.3&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
module load 2024&lt;br /&gt;
module load Python/3.12.3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The bundle module &amp;lt;code&amp;gt;Python-bundle-PyPI&amp;lt;/code&amp;gt; adds many frequently-used packages on top of the base interpreter. Use &amp;lt;code&amp;gt;module key &amp;lt;package&amp;gt;&amp;lt;/code&amp;gt; to find which bundle contains a package you need (see [[Environment Modules#Searching by keyword | searching modules by keyword]]).&lt;br /&gt;
&lt;br /&gt;
For packages not in a module, the two recommended routes are a &#039;&#039;&#039;virtual environment&#039;&#039;&#039; built on a Python module (below), or &#039;&#039;&#039;Miniforge&#039;&#039;&#039; for a self-contained conda/mamba setup. The use of Anaconda is discouraged on Anunna — its default channels carry licensing restrictions and the full distribution is heavy; Miniforge is the lighter, unrestricted alternative.&lt;br /&gt;
&lt;br /&gt;
== Virtual environments ==&lt;br /&gt;
&lt;br /&gt;
A virtual environment is a self-contained directory holding a specific Python and its packages, so one project&#039;s dependencies cannot clash with another&#039;s. Python&#039;s built-in &amp;lt;code&amp;gt;venv&amp;lt;/code&amp;gt; module is the simplest way to make one on top of a Python module.&lt;br /&gt;
&lt;br /&gt;
First load the Python version you want:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
module load 2024&lt;br /&gt;
module load Python/3.12.3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then create the environment in a location of your choosing. The example uses &amp;lt;code&amp;gt;$myNobackup/PythonEnv&amp;lt;/code&amp;gt; — &amp;lt;code&amp;gt;$myNobackup&amp;lt;/code&amp;gt; is your Lustre nobackup location, set in your &amp;lt;code&amp;gt;~/.bash_aliases&amp;lt;/code&amp;gt; (see [[Installing Personal Software#Aliases and local variables | Aliases and local variables]]). Keeping environments on Lustre rather than your home directory avoids filling your home quota, and the nobackup tier is the right choice because an environment can always be recreated from scratch and so does not need backing up.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python -m venv $myNobackup/PythonEnv/my_env&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Activate it whenever you want to use it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
source $myNobackup/PythonEnv/my_env/bin/activate&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once active, the environment name appears as a prefix in your prompt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
(my_env) user001@login200:~$&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Install packages with &amp;lt;code&amp;gt;pip&amp;lt;/code&amp;gt; while the environment is active; they go into the environment, not your home directory:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
pip install -U numpy pandas matplotlib&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Leave the environment with &amp;lt;code&amp;gt;deactivate&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Jupyter kernels ==&lt;br /&gt;
&lt;br /&gt;
Once your virtual environment has been setup, you can can access it in jupyter, either via the apps or the notebooks page by setting up a kernel. A kernel is nothing more than a json file with details for jupyter on where to find your Python environment. First things first,  with your Python modules loaded activate your virtual environment from the example before. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;source $myNobackup/PythonEnv/my_env/bin/activate&amp;lt;/syntaxhighlight&amp;gt;The install [https://pypi.org/project/ipykernel/ ipyKernel]&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;(my_env) user001@login200:~$ pip install -U ipykernel&amp;lt;/syntaxhighlight&amp;gt;This is the only dependency that Python needs for creating kernels, you can then run &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;(my_env) user001@login200:~$ python -m ipykernel install --user --name=myenv --display-name=&amp;quot;Python (myenv)&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;This command will create a folder labelled &amp;lt;code&amp;gt;myenv&amp;lt;/code&amp;gt;  containing a &amp;lt;code&amp;gt;kernel.json&amp;lt;/code&amp;gt; file inside of  &amp;lt;code&amp;gt;$HOME/.local/share/jupyter/kernels/&amp;lt;/code&amp;gt; , which jupyter watches. If your goal is just to create a kernel for yourself, then you are done. The kernel should be visible to you both inside of the jupyter instances, either the ones accessed via the [https://apps.anunna.wur.nl anuna apps portal] or the [https://notebook.anunna.wur.nl notebooks page].  Thus, the kernel will not be visible or accessible to other users. &lt;br /&gt;
&lt;br /&gt;
The --name=myenv flag is entirely optional, it is the directory in which the &amp;lt;code&amp;gt;kernel.json&amp;lt;/code&amp;gt; file is generated. If not used, python will simply label it &amp;lt;code&amp;gt;python3&amp;lt;/code&amp;gt; . The use of this flag is recommended, specially when working with multiple kernels to avoid overwriting previously created kernels. &lt;br /&gt;
&lt;br /&gt;
=== Shared Kernels ===&lt;br /&gt;
Whether for a course or collaboration, sometimes it is convenient to share a kernel with other users. This is possible and the procedure is a variation of the previous one, with just some additional requirements&lt;br /&gt;
&lt;br /&gt;
* The virtual environment you create needs to be in a shared location , e.g. /lutre/shared&lt;br /&gt;
* The virtual environment folder needs to be visiible and accessible to other users i.e. it must have read and execute permissions, 755 is recommended&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Like before load the  bucket and its corresponding Python version and create your project folder and go there&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;module load 2025&lt;br /&gt;
module load Python/3.13.1&lt;br /&gt;
mkdir /lustre/shared/MyProject&lt;br /&gt;
cd /lustre/shared/MyProject&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Then create your virtual environemnt, activate it and install [https://pypi.org/project/ipykernel/ ipyKernel]&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;python -m venv ./project_env&lt;br /&gt;
source /lustre/shared/MyProject/project_env/bin/activate&lt;br /&gt;
pip install -U ipykernel&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here is where things differ, inside the activate kernel run the command&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python -m ipykernel install --sys-prefix --name=myproject --display-name=&amp;quot;Python (project_env)&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Note that now the command uses the flag  --sys-prefix . This flag sets the installation path of the kernel &#039;&#039;&#039;inside&#039;&#039;&#039; the virtual environment&#039;s directory, in this case, the kernel.json file will be generate in  &amp;lt;code&amp;gt;/lustre/shared/MyProject/project_env/share/jupyter/kernels/myproject&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
While the kernel has been created, jupyter still will not be able to see it. In order to be able to see and access the kernel you would need to either copy it to your  folder&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
MYPROJ=/lustre/shared/MyProject&lt;br /&gt;
cp -r $MYPROJ/project_env/share/jupyter/kernels/myproject $HOME/.local/share/jupyter/kernels/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;or link it&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
MYPROJ=/lustre/shared/MyProject&lt;br /&gt;
ln -s $MYPROJ/project_env/share/jupyter/kernels/myproject $HOME/.local/share/jupyter/kernels/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Any users that run this last step should gain access to the kernel from jupyter. Though note, that only users that have write permissions to virtual environment will be able to install and remove modules from it.   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color: #e7f3fe; border-left: 6px solid #2196F3; padding: 10px; margin-bottom: 15px;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; When using custom kernels do not run &amp;lt;code&amp;gt;!pip&amp;lt;/code&amp;gt;, just run &amp;lt;code&amp;gt;pip&amp;lt;/code&amp;gt; without the &amp;lt;code&amp;gt;!&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[Environment Modules]]&lt;br /&gt;
* [[Installing Personal Software]]&lt;br /&gt;
* [[Jupyter]]&lt;br /&gt;
* [[R]]&lt;br /&gt;
* [[Apptainer]]&lt;br /&gt;
&lt;br /&gt;
== External links ==&lt;br /&gt;
&lt;br /&gt;
* [https://docs.python.org/3/library/venv.html Python venv documentation]&lt;br /&gt;
* [https://github.com/conda-forge/miniforge Miniforge]&lt;br /&gt;
* [https://conda-forge.org/ conda-forge]&lt;/div&gt;</summary>
		<author><name>Honfi001</name></author>
	</entry>
	<entry>
		<id>https://wiki.anunna.wur.nl/index.php?title=Python&amp;diff=3058</id>
		<title>Python</title>
		<link rel="alternate" type="text/html" href="https://wiki.anunna.wur.nl/index.php?title=Python&amp;diff=3058"/>
		<updated>2026-08-17T14:47:34Z</updated>

		<summary type="html">&lt;p&gt;Honfi001: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Python is a high-level, interpreted programming language popular in scientific computing for its readability and its enormous ecosystem of third-party libraries — NumPy, Pandas, scikit-learn, PyTorch, TensorFlow, and many more. This page describes how to use Python on Anunna: the provided modules, how to manage your own packages with virtual environments or Miniforge, and how to expose an environment as a Jupyter kernel.&lt;br /&gt;
&lt;br /&gt;
* [[Python/Modules|Modules]]&lt;br /&gt;
* uv (soon)&lt;br /&gt;
* [[Python/Conda|Anaconda]]&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[Environment Modules]]&lt;br /&gt;
* [[Installing Personal Software]]&lt;br /&gt;
* [[Jupyter]]&lt;br /&gt;
* [[R]]&lt;br /&gt;
* [[Apptainer]]&lt;br /&gt;
&lt;br /&gt;
== External links ==&lt;br /&gt;
&lt;br /&gt;
* [https://docs.python.org/3/library/venv.html Python venv documentation]&lt;br /&gt;
* [https://github.com/conda-forge/miniforge Miniforge]&lt;br /&gt;
* [https://conda-forge.org/ conda-forge]&lt;/div&gt;</summary>
		<author><name>Honfi001</name></author>
	</entry>
	<entry>
		<id>https://wiki.anunna.wur.nl/index.php?title=Python/Conda&amp;diff=3057</id>
		<title>Python/Conda</title>
		<link rel="alternate" type="text/html" href="https://wiki.anunna.wur.nl/index.php?title=Python/Conda&amp;diff=3057"/>
		<updated>2026-08-17T14:33:16Z</updated>

		<summary type="html">&lt;p&gt;Honfi001: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:Anaconda}}&lt;br /&gt;
&lt;br /&gt;
Conda is a tool for installing scientific software and keeping it in self-contained folders called environments. You will meet it most often in bioinformatics, data science and machine learning, where a great deal of software is published this way.&lt;br /&gt;
&lt;br /&gt;
This page explains what Anaconda and Mamba are, why we do not recommend them on Anunna, what to use instead, and — if you have no alternative — how to use conda here with the least trouble.&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
=== What is Anaconda ===&lt;br /&gt;
&lt;br /&gt;
Anaconda is a Python distribution made by a company, Anaconda Inc. It arrives as one large download containing Python, the &amp;lt;code&amp;gt;conda&amp;lt;/code&amp;gt; command and several hundred scientific packages, already installed and ready to use. It is several gigabytes in size.&lt;br /&gt;
&lt;br /&gt;
It was designed for a personal computer: you install it once and nearly everything you might need is already there. That convenience is why it became so popular.&lt;br /&gt;
&lt;br /&gt;
=== What is Mamba ===&lt;br /&gt;
&lt;br /&gt;
Mamba is a free, open-source tool that does the same job as Anaconda&#039;s &amp;lt;code&amp;gt;conda&amp;lt;/code&amp;gt; command. It is not a bundle — it installs only the packages you ask for, and nothing else.&lt;br /&gt;
&lt;br /&gt;
Mamba comes from the [https://conda-forge.org/ conda-forge] community. You normally get it by installing [https://github.com/conda-forge/miniforge Miniforge], which provides both &amp;lt;code&amp;gt;conda&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;mamba&amp;lt;/code&amp;gt;. It gives you access to conda-forge and to [https://bioconda.github.io/ bioconda], the repository where most bioinformatics software is published.&lt;br /&gt;
&lt;br /&gt;
=== What they have in common ===&lt;br /&gt;
&lt;br /&gt;
Both build &#039;&#039;&#039;environments&#039;&#039;&#039; — a self-contained folder with its own Python and its own libraries. You can keep several side by side, each holding different versions of the same software, without them interfering with one another.&lt;br /&gt;
&lt;br /&gt;
Both also install much more than Python packages. &amp;lt;code&amp;gt;pip&amp;lt;/code&amp;gt; installs Python code and nothing else, whereas conda and mamba can install the things that code depends on as well: R, compilers, C libraries and command-line programs. That is the main reason people choose them.&lt;br /&gt;
&lt;br /&gt;
Underneath, they are the same system. They use the same package format and the same repositories, so an environment built by one can be used by the other, and the commands are identical — &amp;lt;code&amp;gt;create&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;install&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;activate&amp;lt;/code&amp;gt;. Moving from one to the other is not a migration; nothing needs converting.&lt;br /&gt;
&lt;br /&gt;
=== How they differ ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! !! Anaconda !! Mamba&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;What you get&#039;&#039;&#039; || Python and several hundred packages, whether you wanted them or not. Several gigabytes. || Only the packages you ask for.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Where packages come from&#039;&#039;&#039; || Anaconda&#039;s own repository. || conda-forge and bioconda.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Cost&#039;&#039;&#039; || A paid licence is required for large organisations. || Free and open source.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Speed used to be a clear difference too, as mamba worked out dependencies far faster than conda did. Since conda version 23.10 the two share the same machinery for this, so the gap is much smaller than it once was.&lt;br /&gt;
&lt;br /&gt;
On licensing, Anaconda changed its terms in 2024 and they may not permit research use at an institution the size of WUR — see [https://www.anaconda.com/blog/update-on-anacondas-terms-of-service-for-academia-and-research Anaconda&#039;s own statement on academia and research].&lt;br /&gt;
&lt;br /&gt;
== Why they are not recommended in the cluster ==&lt;br /&gt;
&lt;br /&gt;
Both tools do run on Anunna. Neither is a good fit for it. The reasons below apply to Anaconda and Mamba alike, except the last one.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Neither is built for our hardware.&#039;&#039;&#039; Conda packages — from Anaconda and from conda-forge equally — are general-purpose builds that have to work on any machine in the world. The software we provide as modules is compiled for the exact processors in each generation of Anunna&#039;s nodes. If you care about speed and efficiency, use the modules in the buckets: see [[Python/Modules]].&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;They bring their own copies of software the cluster already provides.&#039;&#039;&#039; Ask for one package and you may also receive compilers, maths libraries, CUDA and MPI as dependencies. These sit alongside Anunna&#039;s own versions and can be picked up instead of them, which produces results that are hard to explain.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Their MPI is unlikely to use Anunna&#039;s fast network.&#039;&#039;&#039; A program that spreads work across several nodes needs MPI built against the cluster&#039;s high-speed interconnect. The MPI that comes out of a conda environment is a generic build, so a multi-node job may fall back to ordinary networking and run far slower, or fail to start at all. If your work runs on more than one node, use the MPI modules.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;They assume system libraries live where they do on a laptop.&#039;&#039;&#039; Those assumptions often do not hold here, and the result is a job that fails part-way through with an error that points nowhere useful.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;They fill your home directory.&#039;&#039;&#039; A single environment is tens of thousands of small files. Your home directory is small, it is backed up, and it sits on a filesystem measured at roughly ninety times slower than Lustre for large reads and writes. See [[Quotas]] and [[Storage Systems Overview]].&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Installing them slows the cluster down for everybody.&#039;&#039;&#039; Working out and unpacking an environment writes thousands of small files at once. On a login node, which is shared by every user, that is felt by everyone rather than only by you.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;They change your shell without asking.&#039;&#039;&#039; The &amp;lt;code&amp;gt;conda init&amp;lt;/code&amp;gt; command writes a block into your &amp;lt;code&amp;gt;~/.bashrc&amp;lt;/code&amp;gt;. That block is then read again by job scripts and by interactive sessions, and it can leak into containers, causing failures that look nothing like a conda problem.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Anaconda additionally has a licensing problem.&#039;&#039;&#039; Its 2024 terms require a paid licence for organisations of 200 or more people, and the free exemption covers teaching rather than research. Other HPC centres have already stopped providing it.&lt;br /&gt;
&lt;br /&gt;
== What to use instead ==&lt;br /&gt;
&lt;br /&gt;
In order — try the first before the second, and so on.&lt;br /&gt;
&lt;br /&gt;
=== Check whether it is already a module ===&lt;br /&gt;
&lt;br /&gt;
Most widely used scientific software is already installed on Anunna and compiled for our hardware. Search for it by name before installing anything yourself:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
module key blast&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;module key&amp;lt;/code&amp;gt; searches every bucket at once, so you do not need to load one first. See [[Environment Modules]].&lt;br /&gt;
&lt;br /&gt;
=== A virtual environment on a Python module ===&lt;br /&gt;
&lt;br /&gt;
If you only need Python packages, a virtual environment built on one of our Python modules is the right tool. It is smaller, faster and simpler than a conda environment, and it uses the Python we compiled for this machine.&lt;br /&gt;
&lt;br /&gt;
[[Python/Modules#Virtual environments]] covers this in full. The one thing to remember here is that the environment belongs on Lustre — under &amp;lt;code&amp;gt;$myNobackup&amp;lt;/code&amp;gt; — and not in your home directory.&lt;br /&gt;
&lt;br /&gt;
For a faster alternative to &amp;lt;code&amp;gt;pip&amp;lt;/code&amp;gt; when installing into such an environment, the &amp;lt;code&amp;gt;uv&amp;lt;/code&amp;gt; module is available in the 2025 bucket.&lt;br /&gt;
&lt;br /&gt;
=== A ready-made container ===&lt;br /&gt;
&lt;br /&gt;
Almost every package on bioconda is also published as a prebuilt container image, so you can run the software without building an environment at all. This is often the quickest route for bioinformatics software.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
module load utilities Apptainer&lt;br /&gt;
apptainer pull https://depot.galaxyproject.org/singularity/multiqc:1.29--pyhdfd78af_0&lt;br /&gt;
apptainer run multiqc_1.29--pyhdfd78af_0.sif multiqc --help&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Browse [https://depot.galaxyproject.org/singularity/ the image list] for the tool and version you want. See [[Apptainer]], and set &amp;lt;code&amp;gt;APPTAINER_CACHEDIR&amp;lt;/code&amp;gt; to a location on Lustre first, as that page describes.&lt;br /&gt;
&lt;br /&gt;
=== When none of these work ===&lt;br /&gt;
&lt;br /&gt;
Some software is published only as a conda package and has no module, no Python-only equivalent and no container. That is a real situation, and the rest of this page is for it.&lt;br /&gt;
&lt;br /&gt;
== If you still need conda ==&lt;br /&gt;
&lt;br /&gt;
Everything below is aimed at avoiding the problems described above. The two that matter most are keeping conda out of your &amp;lt;code&amp;gt;~/.bashrc&amp;lt;/code&amp;gt; and never building an environment on a login node.&lt;br /&gt;
&lt;br /&gt;
=== Use Miniforge, not Anaconda ===&lt;br /&gt;
&lt;br /&gt;
[https://github.com/conda-forge/miniforge Miniforge] is a small installer from the conda-forge community. It gives you both &amp;lt;code&amp;gt;conda&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;mamba&amp;lt;/code&amp;gt;, it uses conda-forge instead of Anaconda&#039;s repository, and it carries no licence conditions.&lt;br /&gt;
&lt;br /&gt;
=== Install it on Lustre, not in your home directory ===&lt;br /&gt;
&lt;br /&gt;
Start an interactive session first — see below — then:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd $myNobackup&lt;br /&gt;
curl -L -O https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-Linux-x86_64.sh&lt;br /&gt;
bash Miniforge3-Linux-x86_64.sh -b -p $myNobackup/miniforge3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;-p&amp;lt;/code&amp;gt; chooses where it goes. &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt; installs without asking questions &#039;&#039;&#039;and without touching your shell configuration&#039;&#039;&#039;, which is what you want.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$myNobackup&amp;lt;/code&amp;gt; is your Lustre location without backup, which is the right tier here: an environment can always be rebuilt from its list of packages, so it does not need backing up. If you have not set that variable yet, see [[Installing Personal Software#Aliases and local variables]].&lt;br /&gt;
&lt;br /&gt;
=== Do not let it change your shell ===&lt;br /&gt;
&lt;br /&gt;
Never run &amp;lt;code&amp;gt;conda init&amp;lt;/code&amp;gt;. Load conda explicitly instead, whenever you need it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
source $myNoBkp/miniforge3/etc/profile.d/conda.sh&lt;br /&gt;
conda activate myenv&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you have run &amp;lt;code&amp;gt;conda init&amp;lt;/code&amp;gt; in the past, open &amp;lt;code&amp;gt;~/.bashrc&amp;lt;/code&amp;gt; and delete everything between the lines &amp;lt;code&amp;gt;# &amp;gt;&amp;gt;&amp;gt; conda initialize &amp;gt;&amp;gt;&amp;gt;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;# &amp;lt;&amp;lt;&amp;lt; conda initialize &amp;lt;&amp;lt;&amp;lt;&amp;lt;/code&amp;gt;, including those two lines.&lt;br /&gt;
&lt;br /&gt;
=== Keep the package cache off your home directory ===&lt;br /&gt;
&lt;br /&gt;
Conda keeps a cache of downloaded packages and a record of your environments. Point both at Lustre by adding these lines to your &amp;lt;code&amp;gt;~/.bash_aliases&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
export CONDA_PKGS_DIRS=$myNoBkp/conda/pkgs&lt;br /&gt;
export CONDA_ENVS_DIRS=$myNoBkp/conda/envs&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Never build an environment on a login node ===&lt;br /&gt;
&lt;br /&gt;
Creating an environment is exactly the kind of work that disturbs the shared filesystem for other users. Ask for an interactive session on a compute node and do it there:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sinteractive -c 4 --mem 16G --time 120&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then create the environment. Listing the packages in a file makes it repeatable:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
source $myNoBkp/miniforge3/etc/profile.d/conda.sh&lt;br /&gt;
mamba create -n myenv python=3.12 numpy pandas&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
See [[Interactive Jobs]] for the options &amp;lt;code&amp;gt;sinteractive&amp;lt;/code&amp;gt; accepts.&lt;br /&gt;
&lt;br /&gt;
=== Using an environment in a job script ===&lt;br /&gt;
&lt;br /&gt;
Load conda and activate the environment inside the script itself. Note the first line: use plain &amp;lt;code&amp;gt;#!/bin/bash&amp;lt;/code&amp;gt;, not &amp;lt;code&amp;gt;#!/bin/bash -i&amp;lt;/code&amp;gt;, so the script does not read your shell configuration.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#SBATCH --job-name=myjob&lt;br /&gt;
#SBATCH --time=1:00:00&lt;br /&gt;
#SBATCH --cpus-per-task=4&lt;br /&gt;
#SBATCH --mem=16G&lt;br /&gt;
&lt;br /&gt;
source $myNobackup/miniforge3/etc/profile.d/conda.sh&lt;br /&gt;
conda activate myenv&lt;br /&gt;
&lt;br /&gt;
python myscript.py&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
See [[Batch Jobs]].&lt;br /&gt;
&lt;br /&gt;
=== Cleaning up ===&lt;br /&gt;
&lt;br /&gt;
Environments are large and easy to forget. Check what you have from time to time, remove what you no longer use, and empty the download cache:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
conda env list&lt;br /&gt;
conda env remove -n myenv&lt;br /&gt;
conda clean --all&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[Python]]&lt;br /&gt;
* [[Python/Modules]]&lt;br /&gt;
* [[Environment Modules]]&lt;br /&gt;
* [[Apptainer]]&lt;br /&gt;
* [[Interactive Jobs]]&lt;br /&gt;
* [[Batch Jobs]]&lt;br /&gt;
* [[Installing Personal Software]]&lt;br /&gt;
* [[Quotas]]&lt;br /&gt;
&lt;br /&gt;
== External links ==&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/conda-forge/miniforge Miniforge]&lt;br /&gt;
* [https://conda-forge.org/ conda-forge]&lt;br /&gt;
* [https://bioconda.github.io/ bioconda]&lt;br /&gt;
* [https://depot.galaxyproject.org/singularity/ Prebuilt bioconda container images]&lt;br /&gt;
* [https://www.anaconda.com/blog/update-on-anacondas-terms-of-service-for-academia-and-research Anaconda&#039;s terms of service for academia and research]&lt;/div&gt;</summary>
		<author><name>Honfi001</name></author>
	</entry>
	<entry>
		<id>https://wiki.anunna.wur.nl/index.php?title=Python/Conda&amp;diff=3056</id>
		<title>Python/Conda</title>
		<link rel="alternate" type="text/html" href="https://wiki.anunna.wur.nl/index.php?title=Python/Conda&amp;diff=3056"/>
		<updated>2026-08-17T14:32:37Z</updated>

		<summary type="html">&lt;p&gt;Honfi001: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:Anaconda}}&lt;br /&gt;
&lt;br /&gt;
Conda is a tool for installing scientific software and keeping it in self-contained folders called environments. You will meet it most often in bioinformatics, data science and machine learning, where a great deal of software is published this way.&lt;br /&gt;
&lt;br /&gt;
This page explains what Anaconda and Mamba are, why we do not recommend them on Anunna, what to use instead, and — if you have no alternative — how to use conda here with the least trouble.&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
=== What is Anaconda ===&lt;br /&gt;
&lt;br /&gt;
Anaconda is a Python distribution made by a company, Anaconda Inc. It arrives as one large download containing Python, the &amp;lt;code&amp;gt;conda&amp;lt;/code&amp;gt; command and several hundred scientific packages, already installed and ready to use. It is several gigabytes in size.&lt;br /&gt;
&lt;br /&gt;
It was designed for a personal computer: you install it once and nearly everything you might need is already there. That convenience is why it became so popular.&lt;br /&gt;
&lt;br /&gt;
=== What is Mamba ===&lt;br /&gt;
&lt;br /&gt;
Mamba is a free, open-source tool that does the same job as Anaconda&#039;s &amp;lt;code&amp;gt;conda&amp;lt;/code&amp;gt; command. It is not a bundle — it installs only the packages you ask for, and nothing else.&lt;br /&gt;
&lt;br /&gt;
Mamba comes from the [https://conda-forge.org/ conda-forge] community. You normally get it by installing [https://github.com/conda-forge/miniforge Miniforge], which provides both &amp;lt;code&amp;gt;conda&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;mamba&amp;lt;/code&amp;gt;. It gives you access to conda-forge and to [https://bioconda.github.io/ bioconda], the repository where most bioinformatics software is published.&lt;br /&gt;
&lt;br /&gt;
=== What they have in common ===&lt;br /&gt;
&lt;br /&gt;
Both build &#039;&#039;&#039;environments&#039;&#039;&#039; — a self-contained folder with its own Python and its own libraries. You can keep several side by side, each holding different versions of the same software, without them interfering with one another.&lt;br /&gt;
&lt;br /&gt;
Both also install much more than Python packages. &amp;lt;code&amp;gt;pip&amp;lt;/code&amp;gt; installs Python code and nothing else, whereas conda and mamba can install the things that code depends on as well: R, compilers, C libraries and command-line programs. That is the main reason people choose them.&lt;br /&gt;
&lt;br /&gt;
Underneath, they are the same system. They use the same package format and the same repositories, so an environment built by one can be used by the other, and the commands are identical — &amp;lt;code&amp;gt;create&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;install&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;activate&amp;lt;/code&amp;gt;. Moving from one to the other is not a migration; nothing needs converting.&lt;br /&gt;
&lt;br /&gt;
=== How they differ ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! !! Anaconda !! Mamba&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;What you get&#039;&#039;&#039; || Python and several hundred packages, whether you wanted them or not. Several gigabytes. || Only the packages you ask for.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Where packages come from&#039;&#039;&#039; || Anaconda&#039;s own repository. || conda-forge and bioconda.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Cost&#039;&#039;&#039; || A paid licence is required for large organisations. || Free and open source.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Speed used to be a clear difference too, as mamba worked out dependencies far faster than conda did. Since conda version 23.10 the two share the same machinery for this, so the gap is much smaller than it once was.&lt;br /&gt;
&lt;br /&gt;
On licensing, Anaconda changed its terms in 2024 and they may not permit research use at an institution the size of WUR — see [https://www.anaconda.com/blog/update-on-anacondas-terms-of-service-for-academia-and-research Anaconda&#039;s own statement on academia and research].&lt;br /&gt;
&lt;br /&gt;
== Why they are not recommended in the cluster ==&lt;br /&gt;
&lt;br /&gt;
Both tools do run on Anunna. Neither is a good fit for it. The reasons below apply to Anaconda and Mamba alike, except the last one.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Neither is built for our hardware.&#039;&#039;&#039; Conda packages — from Anaconda and from conda-forge equally — are general-purpose builds that have to work on any machine in the world. The software we provide as modules is compiled for the exact processors in each generation of Anunna&#039;s nodes. If you care about speed and efficiency, use the modules in the buckets: see [[Python/Modules]].&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;They bring their own copies of software the cluster already provides.&#039;&#039;&#039; Ask for one package and you may also receive compilers, maths libraries, CUDA and MPI as dependencies. These sit alongside Anunna&#039;s own versions and can be picked up instead of them, which produces results that are hard to explain.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Their MPI is unlikely to use Anunna&#039;s fast network.&#039;&#039;&#039; A program that spreads work across several nodes needs MPI built against the cluster&#039;s high-speed interconnect. The MPI that comes out of a conda environment is a generic build, so a multi-node job may fall back to ordinary networking and run far slower, or fail to start at all. If your work runs on more than one node, use the MPI modules.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;They assume system libraries live where they do on a laptop.&#039;&#039;&#039; Those assumptions often do not hold here, and the result is a job that fails part-way through with an error that points nowhere useful.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;They fill your home directory.&#039;&#039;&#039; A single environment is tens of thousands of small files. Your home directory is small, it is backed up, and it sits on a filesystem measured at roughly ninety times slower than Lustre for large reads and writes. See [[Quotas]] and [[Storage Systems Overview]].&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Installing them slows the cluster down for everybody.&#039;&#039;&#039; Working out and unpacking an environment writes thousands of small files at once. On a login node, which is shared by every user, that is felt by everyone rather than only by you.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;They change your shell without asking.&#039;&#039;&#039; The &amp;lt;code&amp;gt;conda init&amp;lt;/code&amp;gt; command writes a block into your &amp;lt;code&amp;gt;~/.bashrc&amp;lt;/code&amp;gt;. That block is then read again by job scripts and by interactive sessions, and it can leak into containers, causing failures that look nothing like a conda problem.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Anaconda additionally has a licensing problem.&#039;&#039;&#039; Its 2024 terms require a paid licence for organisations of 200 or more people, and the free exemption covers teaching rather than research. Other HPC centres have already stopped providing it.&lt;br /&gt;
&lt;br /&gt;
== What to use instead ==&lt;br /&gt;
&lt;br /&gt;
In order — try the first before the second, and so on.&lt;br /&gt;
&lt;br /&gt;
=== Check whether it is already a module ===&lt;br /&gt;
&lt;br /&gt;
Most widely used scientific software is already installed on Anunna and compiled for our hardware. Search for it by name before installing anything yourself:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
module key blast &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;module key&amp;lt;/code&amp;gt; searches every bucket at once, so you do not need to load one first. See [[Environment Modules]].&lt;br /&gt;
&lt;br /&gt;
=== A virtual environment on a Python module ===&lt;br /&gt;
&lt;br /&gt;
If you only need Python packages, a virtual environment built on one of our Python modules is the right tool. It is smaller, faster and simpler than a conda environment, and it uses the Python we compiled for this machine.&lt;br /&gt;
&lt;br /&gt;
[[Python/Modules#Virtual environments]] covers this in full. The one thing to remember here is that the environment belongs on Lustre — under &amp;lt;code&amp;gt;$myNobackup&amp;lt;/code&amp;gt; — and not in your home directory.&lt;br /&gt;
&lt;br /&gt;
For a faster alternative to &amp;lt;code&amp;gt;pip&amp;lt;/code&amp;gt; when installing into such an environment, the &amp;lt;code&amp;gt;uv&amp;lt;/code&amp;gt; module is available in the 2025 bucket.&lt;br /&gt;
&lt;br /&gt;
=== A ready-made container ===&lt;br /&gt;
&lt;br /&gt;
Almost every package on bioconda is also published as a prebuilt container image, so you can run the software without building an environment at all. This is often the quickest route for bioinformatics software.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
module load utilities Apptainer&lt;br /&gt;
apptainer pull https://depot.galaxyproject.org/singularity/multiqc:1.29--pyhdfd78af_0&lt;br /&gt;
apptainer run multiqc_1.29--pyhdfd78af_0.sif multiqc --help&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Browse [https://depot.galaxyproject.org/singularity/ the image list] for the tool and version you want. See [[Apptainer]], and set &amp;lt;code&amp;gt;APPTAINER_CACHEDIR&amp;lt;/code&amp;gt; to a location on Lustre first, as that page describes.&lt;br /&gt;
&lt;br /&gt;
=== When none of these work ===&lt;br /&gt;
&lt;br /&gt;
Some software is published only as a conda package and has no module, no Python-only equivalent and no container. That is a real situation, and the rest of this page is for it.&lt;br /&gt;
&lt;br /&gt;
== If you still need conda ==&lt;br /&gt;
&lt;br /&gt;
Everything below is aimed at avoiding the problems described above. The two that matter most are keeping conda out of your &amp;lt;code&amp;gt;~/.bashrc&amp;lt;/code&amp;gt; and never building an environment on a login node.&lt;br /&gt;
&lt;br /&gt;
=== Use Miniforge, not Anaconda ===&lt;br /&gt;
&lt;br /&gt;
[https://github.com/conda-forge/miniforge Miniforge] is a small installer from the conda-forge community. It gives you both &amp;lt;code&amp;gt;conda&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;mamba&amp;lt;/code&amp;gt;, it uses conda-forge instead of Anaconda&#039;s repository, and it carries no licence conditions.&lt;br /&gt;
&lt;br /&gt;
=== Install it on Lustre, not in your home directory ===&lt;br /&gt;
&lt;br /&gt;
Start an interactive session first — see below — then:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd $myNobackup&lt;br /&gt;
curl -L -O https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-Linux-x86_64.sh&lt;br /&gt;
bash Miniforge3-Linux-x86_64.sh -b -p $myNobackup/miniforge3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;-p&amp;lt;/code&amp;gt; chooses where it goes. &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt; installs without asking questions &#039;&#039;&#039;and without touching your shell configuration&#039;&#039;&#039;, which is what you want.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$myNobackup&amp;lt;/code&amp;gt; is your Lustre location without backup, which is the right tier here: an environment can always be rebuilt from its list of packages, so it does not need backing up. If you have not set that variable yet, see [[Installing Personal Software#Aliases and local variables]].&lt;br /&gt;
&lt;br /&gt;
=== Do not let it change your shell ===&lt;br /&gt;
&lt;br /&gt;
Never run &amp;lt;code&amp;gt;conda init&amp;lt;/code&amp;gt;. Load conda explicitly instead, whenever you need it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
source $myNoBkp/miniforge3/etc/profile.d/conda.sh&lt;br /&gt;
conda activate myenv&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you have run &amp;lt;code&amp;gt;conda init&amp;lt;/code&amp;gt; in the past, open &amp;lt;code&amp;gt;~/.bashrc&amp;lt;/code&amp;gt; and delete everything between the lines &amp;lt;code&amp;gt;# &amp;gt;&amp;gt;&amp;gt; conda initialize &amp;gt;&amp;gt;&amp;gt;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;# &amp;lt;&amp;lt;&amp;lt; conda initialize &amp;lt;&amp;lt;&amp;lt;&amp;lt;/code&amp;gt;, including those two lines.&lt;br /&gt;
&lt;br /&gt;
=== Keep the package cache off your home directory ===&lt;br /&gt;
&lt;br /&gt;
Conda keeps a cache of downloaded packages and a record of your environments. Point both at Lustre by adding these lines to your &amp;lt;code&amp;gt;~/.bash_aliases&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
export CONDA_PKGS_DIRS=$myNoBkp/conda/pkgs&lt;br /&gt;
export CONDA_ENVS_DIRS=$myNoBkp/conda/envs&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Never build an environment on a login node ===&lt;br /&gt;
&lt;br /&gt;
Creating an environment is exactly the kind of work that disturbs the shared filesystem for other users. Ask for an interactive session on a compute node and do it there:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sinteractive -c 4 --mem 16G --time 120&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then create the environment. Listing the packages in a file makes it repeatable:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
source $myNoBkp/miniforge3/etc/profile.d/conda.sh&lt;br /&gt;
mamba create -n myenv python=3.12 numpy pandas&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
See [[Interactive Jobs]] for the options &amp;lt;code&amp;gt;sinteractive&amp;lt;/code&amp;gt; accepts.&lt;br /&gt;
&lt;br /&gt;
=== Using an environment in a job script ===&lt;br /&gt;
&lt;br /&gt;
Load conda and activate the environment inside the script itself. Note the first line: use plain &amp;lt;code&amp;gt;#!/bin/bash&amp;lt;/code&amp;gt;, not &amp;lt;code&amp;gt;#!/bin/bash -i&amp;lt;/code&amp;gt;, so the script does not read your shell configuration.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#SBATCH --job-name=myjob&lt;br /&gt;
#SBATCH --time=1:00:00&lt;br /&gt;
#SBATCH --cpus-per-task=4&lt;br /&gt;
#SBATCH --mem=16G&lt;br /&gt;
&lt;br /&gt;
source $myNobackup/miniforge3/etc/profile.d/conda.sh&lt;br /&gt;
conda activate myenv&lt;br /&gt;
&lt;br /&gt;
python myscript.py&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
See [[Batch Jobs]].&lt;br /&gt;
&lt;br /&gt;
=== Cleaning up ===&lt;br /&gt;
&lt;br /&gt;
Environments are large and easy to forget. Check what you have from time to time, remove what you no longer use, and empty the download cache:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
conda env list&lt;br /&gt;
conda env remove -n myenv&lt;br /&gt;
conda clean --all&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[Python]]&lt;br /&gt;
* [[Python/Modules]]&lt;br /&gt;
* [[Environment Modules]]&lt;br /&gt;
* [[Apptainer]]&lt;br /&gt;
* [[Interactive Jobs]]&lt;br /&gt;
* [[Batch Jobs]]&lt;br /&gt;
* [[Installing Personal Software]]&lt;br /&gt;
* [[Quotas]]&lt;br /&gt;
&lt;br /&gt;
== External links ==&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/conda-forge/miniforge Miniforge]&lt;br /&gt;
* [https://conda-forge.org/ conda-forge]&lt;br /&gt;
* [https://bioconda.github.io/ bioconda]&lt;br /&gt;
* [https://depot.galaxyproject.org/singularity/ Prebuilt bioconda container images]&lt;br /&gt;
* [https://www.anaconda.com/blog/update-on-anacondas-terms-of-service-for-academia-and-research Anaconda&#039;s terms of service for academia and research]&lt;/div&gt;</summary>
		<author><name>Honfi001</name></author>
	</entry>
	<entry>
		<id>https://wiki.anunna.wur.nl/index.php?title=Python/Conda&amp;diff=3055</id>
		<title>Python/Conda</title>
		<link rel="alternate" type="text/html" href="https://wiki.anunna.wur.nl/index.php?title=Python/Conda&amp;diff=3055"/>
		<updated>2026-08-17T14:25:48Z</updated>

		<summary type="html">&lt;p&gt;Honfi001: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:Anaconda}}&lt;br /&gt;
&lt;br /&gt;
Conda is a tool for installing scientific software and keeping it in self-contained folders called environments. You will meet it most often in bioinformatics, data science and machine learning, where a great deal of software is published this way.&lt;br /&gt;
&lt;br /&gt;
This page explains what Anaconda and Mamba are, why we do not recommend them on Anunna, what to use instead, and — if you have no alternative — how to use conda here with the least trouble.&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
=== What is Anaconda ===&lt;br /&gt;
&lt;br /&gt;
Anaconda is a Python distribution made by a company, Anaconda Inc. It arrives as one large download containing Python, the &amp;lt;code&amp;gt;conda&amp;lt;/code&amp;gt; command and several hundred scientific packages, already installed and ready to use. It is several gigabytes in size.&lt;br /&gt;
&lt;br /&gt;
It was designed for a personal computer: you install it once and nearly everything you might need is already there. That convenience is why it became so popular.&lt;br /&gt;
&lt;br /&gt;
=== What is Mamba ===&lt;br /&gt;
&lt;br /&gt;
Mamba is a free, open-source tool that does the same job as Anaconda&#039;s &amp;lt;code&amp;gt;conda&amp;lt;/code&amp;gt; command. It is not a bundle — it installs only the packages you ask for, and nothing else.&lt;br /&gt;
&lt;br /&gt;
Mamba comes from the [https://conda-forge.org/ conda-forge] community. You normally get it by installing [https://github.com/conda-forge/miniforge Miniforge], which provides both &amp;lt;code&amp;gt;conda&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;mamba&amp;lt;/code&amp;gt;. It gives you access to conda-forge and to [https://bioconda.github.io/ bioconda], the repository where most bioinformatics software is published.&lt;br /&gt;
&lt;br /&gt;
=== What they have in common ===&lt;br /&gt;
&lt;br /&gt;
Both build &#039;&#039;&#039;environments&#039;&#039;&#039; — a self-contained folder with its own Python and its own libraries. You can keep several side by side, each holding different versions of the same software, without them interfering with one another.&lt;br /&gt;
&lt;br /&gt;
Both also install much more than Python packages. &amp;lt;code&amp;gt;pip&amp;lt;/code&amp;gt; installs Python code and nothing else, whereas conda and mamba can install the things that code depends on as well: R, compilers, C libraries and command-line programs. That is the main reason people choose them.&lt;br /&gt;
&lt;br /&gt;
Underneath, they are the same system. They use the same package format and the same repositories, so an environment built by one can be used by the other, and the commands are identical — &amp;lt;code&amp;gt;create&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;install&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;activate&amp;lt;/code&amp;gt;. Moving from one to the other is not a migration; nothing needs converting.&lt;br /&gt;
&lt;br /&gt;
=== How they differ ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! !! Anaconda !! Mamba&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;What you get&#039;&#039;&#039; || Python and several hundred packages, whether you wanted them or not. Several gigabytes. || Only the packages you ask for.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Where packages come from&#039;&#039;&#039; || Anaconda&#039;s own repository. || conda-forge and bioconda.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Cost&#039;&#039;&#039; || A paid licence is required for large organisations. || Free and open source.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Speed used to be a clear difference too, as mamba worked out dependencies far faster than conda did. Since conda version 23.10 the two share the same machinery for this, so the gap is much smaller than it once was.&lt;br /&gt;
&lt;br /&gt;
On licensing, Anaconda changed its terms in 2024 and they may not permit research use at an institution the size of WUR — see [https://www.anaconda.com/blog/update-on-anacondas-terms-of-service-for-academia-and-research Anaconda&#039;s own statement on academia and research].&lt;br /&gt;
&lt;br /&gt;
== Why they are not recommended in the cluster ==&lt;br /&gt;
&lt;br /&gt;
Both tools do run on Anunna. Neither is a good fit for it. The reasons below apply to Anaconda and Mamba alike, except the last one.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Neither is built for our hardware.&#039;&#039;&#039; Conda packages — from Anaconda and from conda-forge equally — are general-purpose builds that have to work on any machine in the world. The software we provide as modules is compiled for the exact processors in each generation of Anunna&#039;s nodes. If you care about speed and efficiency, use the modules in the buckets: see [[Python/Modules]].&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;They bring their own copies of software the cluster already provides.&#039;&#039;&#039; Ask for one package and you may also receive compilers, maths libraries, CUDA and MPI as dependencies. These sit alongside Anunna&#039;s own versions and can be picked up instead of them, which produces results that are hard to explain.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Their MPI is unlikely to use Anunna&#039;s fast network.&#039;&#039;&#039; A program that spreads work across several nodes needs MPI built against the cluster&#039;s high-speed interconnect. The MPI that comes out of a conda environment is a generic build, so a multi-node job may fall back to ordinary networking and run far slower, or fail to start at all. If your work runs on more than one node, use the MPI modules.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;They assume system libraries live where they do on a laptop.&#039;&#039;&#039; Those assumptions often do not hold here, and the result is a job that fails part-way through with an error that points nowhere useful.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;They fill your home directory.&#039;&#039;&#039; A single environment is tens of thousands of small files. Your home directory is small, it is backed up, and it sits on a filesystem measured at roughly ninety times slower than Lustre for large reads and writes. See [[Quotas]] and [[Storage Systems Overview]].&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Installing them slows the cluster down for everybody.&#039;&#039;&#039; Working out and unpacking an environment writes thousands of small files at once. On a login node, which is shared by every user, that is felt by everyone rather than only by you.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;They change your shell without asking.&#039;&#039;&#039; The &amp;lt;code&amp;gt;conda init&amp;lt;/code&amp;gt; command writes a block into your &amp;lt;code&amp;gt;~/.bashrc&amp;lt;/code&amp;gt;. That block is then read again by job scripts and by interactive sessions, and it can leak into containers, causing failures that look nothing like a conda problem.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Anaconda additionally has a licensing problem.&#039;&#039;&#039; Its 2024 terms require a paid licence for organisations of 200 or more people, and the free exemption covers teaching rather than research. Other HPC centres have already stopped providing it.&lt;br /&gt;
&lt;br /&gt;
== What to use instead ==&lt;br /&gt;
&lt;br /&gt;
In order — try the first before the second, and so on.&lt;br /&gt;
&lt;br /&gt;
=== Check whether it is already a module ===&lt;br /&gt;
&lt;br /&gt;
Most widely used scientific software is already installed on Anunna and compiled for our hardware. Search for it by name before installing anything yourself:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
module key blast&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;module key&amp;lt;/code&amp;gt; searches every bucket at once, so you do not need to load one first. See [[Environment Modules]].&lt;br /&gt;
&lt;br /&gt;
=== A virtual environment on a Python module ===&lt;br /&gt;
&lt;br /&gt;
If you only need Python packages, a virtual environment built on one of our Python modules is the right tool. It is smaller, faster and simpler than a conda environment, and it uses the Python we compiled for this machine.&lt;br /&gt;
&lt;br /&gt;
[[Python/Modules#Virtual environments]] covers this in full. The one thing to remember here is that the environment belongs on Lustre — under &amp;lt;code&amp;gt;$myNobackup&amp;lt;/code&amp;gt; — and not in your home directory.&lt;br /&gt;
&lt;br /&gt;
For a faster alternative to &amp;lt;code&amp;gt;pip&amp;lt;/code&amp;gt; when installing into such an environment, the &amp;lt;code&amp;gt;uv&amp;lt;/code&amp;gt; module is available in the 2025 bucket.&lt;br /&gt;
&lt;br /&gt;
=== A ready-made container ===&lt;br /&gt;
&lt;br /&gt;
Almost every package on bioconda is also published as a prebuilt container image, so you can run the software without building an environment at all. This is often the quickest route for bioinformatics software.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
module load utilities Apptainer&lt;br /&gt;
apptainer pull https://depot.galaxyproject.org/singularity/multiqc:1.29--pyhdfd78af_0&lt;br /&gt;
apptainer run multiqc_1.29--pyhdfd78af_0.sif multiqc --help&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Browse [https://depot.galaxyproject.org/singularity/ the image list] for the tool and version you want. See [[Apptainer]], and set &amp;lt;code&amp;gt;APPTAINER_CACHEDIR&amp;lt;/code&amp;gt; to a location on Lustre first, as that page describes.&lt;br /&gt;
&lt;br /&gt;
=== When none of these work ===&lt;br /&gt;
&lt;br /&gt;
Some software is published only as a conda package and has no module, no Python-only equivalent and no container. That is a real situation, and the rest of this page is for it.&lt;br /&gt;
&lt;br /&gt;
== If you still need conda ==&lt;br /&gt;
&lt;br /&gt;
Everything below is aimed at avoiding the problems described above. The two that matter most are keeping conda out of your &amp;lt;code&amp;gt;~/.bashrc&amp;lt;/code&amp;gt; and never building an environment on a login node.&lt;br /&gt;
&lt;br /&gt;
=== Use Miniforge, not Anaconda ===&lt;br /&gt;
&lt;br /&gt;
[https://github.com/conda-forge/miniforge Miniforge] is a small installer from the conda-forge community. It gives you both &amp;lt;code&amp;gt;conda&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;mamba&amp;lt;/code&amp;gt;, it uses conda-forge instead of Anaconda&#039;s repository, and it carries no licence conditions.&lt;br /&gt;
&lt;br /&gt;
=== Install it on Lustre, not in your home directory ===&lt;br /&gt;
&lt;br /&gt;
Start an interactive session first — see below — then:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd $myNobackup&lt;br /&gt;
curl -L -O https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-Linux-x86_64.sh&lt;br /&gt;
bash Miniforge3-Linux-x86_64.sh -b -p $myNobackup/miniforge3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;-p&amp;lt;/code&amp;gt; chooses where it goes. &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt; installs without asking questions &#039;&#039;&#039;and without touching your shell configuration&#039;&#039;&#039;, which is what you want.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$myNobackup&amp;lt;/code&amp;gt; is your Lustre location without backup, which is the right tier here: an environment can always be rebuilt from its list of packages, so it does not need backing up. If you have not set that variable yet, see [[Installing Personal Software#Aliases and local variables]].&lt;br /&gt;
&lt;br /&gt;
=== Do not let it change your shell ===&lt;br /&gt;
&lt;br /&gt;
Never run &amp;lt;code&amp;gt;conda init&amp;lt;/code&amp;gt;. Load conda explicitly instead, whenever you need it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
source $myNoBkp/miniforge3/etc/profile.d/conda.sh&lt;br /&gt;
conda activate myenv&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you have run &amp;lt;code&amp;gt;conda init&amp;lt;/code&amp;gt; in the past, open &amp;lt;code&amp;gt;~/.bashrc&amp;lt;/code&amp;gt; and delete everything between the lines &amp;lt;code&amp;gt;# &amp;gt;&amp;gt;&amp;gt; conda initialize &amp;gt;&amp;gt;&amp;gt;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;# &amp;lt;&amp;lt;&amp;lt; conda initialize &amp;lt;&amp;lt;&amp;lt;&amp;lt;/code&amp;gt;, including those two lines.&lt;br /&gt;
&lt;br /&gt;
=== Keep the package cache off your home directory ===&lt;br /&gt;
&lt;br /&gt;
Conda keeps a cache of downloaded packages and a record of your environments. Point both at Lustre by adding these lines to your &amp;lt;code&amp;gt;~/.bash_aliases&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
export CONDA_PKGS_DIRS=$myNoBkp/conda/pkgs&lt;br /&gt;
export CONDA_ENVS_DIRS=$myNoBkp/conda/envs&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Never build an environment on a login node ===&lt;br /&gt;
&lt;br /&gt;
Creating an environment is exactly the kind of work that disturbs the shared filesystem for other users. Ask for an interactive session on a compute node and do it there:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sinteractive -c 4 --mem 16G --time 120&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then create the environment. Listing the packages in a file makes it repeatable:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
source $myNoBkp/miniforge3/etc/profile.d/conda.sh&lt;br /&gt;
mamba create -n myenv python=3.12 numpy pandas&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
See [[Interactive Jobs]] for the options &amp;lt;code&amp;gt;sinteractive&amp;lt;/code&amp;gt; accepts.&lt;br /&gt;
&lt;br /&gt;
=== Using an environment in a job script ===&lt;br /&gt;
&lt;br /&gt;
Load conda and activate the environment inside the script itself. Note the first line: use plain &amp;lt;code&amp;gt;#!/bin/bash&amp;lt;/code&amp;gt;, not &amp;lt;code&amp;gt;#!/bin/bash -i&amp;lt;/code&amp;gt;, so the script does not read your shell configuration.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#SBATCH --job-name=myjob&lt;br /&gt;
#SBATCH --time=1:00:00&lt;br /&gt;
#SBATCH --cpus-per-task=4&lt;br /&gt;
#SBATCH --mem=16G&lt;br /&gt;
&lt;br /&gt;
source $myNobackup/miniforge3/etc/profile.d/conda.sh&lt;br /&gt;
conda activate myenv&lt;br /&gt;
&lt;br /&gt;
python myscript.py&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
See [[Batch Jobs]].&lt;br /&gt;
&lt;br /&gt;
=== Cleaning up ===&lt;br /&gt;
&lt;br /&gt;
Environments are large and easy to forget. Check what you have from time to time, remove what you no longer use, and empty the download cache:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
conda env list&lt;br /&gt;
conda env remove -n myenv&lt;br /&gt;
conda clean --all&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[Python]]&lt;br /&gt;
* [[Python/Modules]]&lt;br /&gt;
* [[Environment Modules]]&lt;br /&gt;
* [[Apptainer]]&lt;br /&gt;
* [[Interactive Jobs]]&lt;br /&gt;
* [[Batch Jobs]]&lt;br /&gt;
* [[Installing Personal Software]]&lt;br /&gt;
* [[Quotas]]&lt;br /&gt;
&lt;br /&gt;
== External links ==&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/conda-forge/miniforge Miniforge]&lt;br /&gt;
* [https://conda-forge.org/ conda-forge]&lt;br /&gt;
* [https://bioconda.github.io/ bioconda]&lt;br /&gt;
* [https://depot.galaxyproject.org/singularity/ Prebuilt bioconda container images]&lt;br /&gt;
* [https://www.anaconda.com/blog/update-on-anacondas-terms-of-service-for-academia-and-research Anaconda&#039;s terms of service for academia and research]&lt;/div&gt;</summary>
		<author><name>Honfi001</name></author>
	</entry>
	<entry>
		<id>https://wiki.anunna.wur.nl/index.php?title=Python&amp;diff=3054</id>
		<title>Python</title>
		<link rel="alternate" type="text/html" href="https://wiki.anunna.wur.nl/index.php?title=Python&amp;diff=3054"/>
		<updated>2026-08-17T14:06:11Z</updated>

		<summary type="html">&lt;p&gt;Honfi001: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Python is a high-level, interpreted programming language popular in scientific computing for its readability and its enormous ecosystem of third-party libraries — NumPy, Pandas, scikit-learn, PyTorch, TensorFlow, and many more. This page describes how to use Python on Anunna: the provided modules, how to manage your own packages with virtual environments or Miniforge, and how to expose an environment as a Jupyter kernel.&lt;br /&gt;
&lt;br /&gt;
* [[Python/Modules|Modules]]&lt;br /&gt;
* uv (soon)&lt;br /&gt;
* [[Python/Conda|Conda]]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[Environment Modules]]&lt;br /&gt;
* [[Installing Personal Software]]&lt;br /&gt;
* [[Jupyter]]&lt;br /&gt;
* [[R]]&lt;br /&gt;
* [[Apptainer]]&lt;br /&gt;
&lt;br /&gt;
== External links ==&lt;br /&gt;
&lt;br /&gt;
* [https://docs.python.org/3/library/venv.html Python venv documentation]&lt;br /&gt;
* [https://github.com/conda-forge/miniforge Miniforge]&lt;br /&gt;
* [https://conda-forge.org/ conda-forge]&lt;/div&gt;</summary>
		<author><name>Honfi001</name></author>
	</entry>
	<entry>
		<id>https://wiki.anunna.wur.nl/index.php?title=Python/Conda&amp;diff=3053</id>
		<title>Python/Conda</title>
		<link rel="alternate" type="text/html" href="https://wiki.anunna.wur.nl/index.php?title=Python/Conda&amp;diff=3053"/>
		<updated>2026-08-17T14:00:05Z</updated>

		<summary type="html">&lt;p&gt;Honfi001: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:Anaconda}}&lt;br /&gt;
Conda is a tool for installing scientific software and keeping it in self-contained folders called environments. You will meet it most often in bioinformatics, data science and machine learning, where a great deal of software is published this way.&lt;br /&gt;
&lt;br /&gt;
This page explains what Anaconda and Mamba are, why we do not recommend them on Anunna, what to use instead, and — if you have no alternative — how to use conda here with the least trouble.&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
=== What is Anaconda ===&lt;br /&gt;
&lt;br /&gt;
Anaconda is a Python distribution made by a company, Anaconda Inc. It arrives as one large download containing Python, the &amp;lt;code&amp;gt;conda&amp;lt;/code&amp;gt; command and several hundred scientific packages, already installed and ready to use. It is several gigabytes in size.&lt;br /&gt;
&lt;br /&gt;
It was designed for a personal computer: you install it once and nearly everything you might need is already there. That convenience is why it became so popular.&lt;br /&gt;
&lt;br /&gt;
=== What is Mamba ===&lt;br /&gt;
&lt;br /&gt;
Mamba is a free, open-source tool that does the same job as Anaconda&#039;s &amp;lt;code&amp;gt;conda&amp;lt;/code&amp;gt; command. It is not a bundle — it installs only the packages you ask for, and nothing else.&lt;br /&gt;
&lt;br /&gt;
Mamba comes from the [https://conda-forge.org/ conda-forge] community. You normally get it by installing [https://github.com/conda-forge/miniforge Miniforge], which provides both &amp;lt;code&amp;gt;conda&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;mamba&amp;lt;/code&amp;gt;. It gives you access to conda-forge and to [https://bioconda.github.io/ bioconda], the repository where most bioinformatics software is published.&lt;br /&gt;
&lt;br /&gt;
=== What they have in common ===&lt;br /&gt;
&lt;br /&gt;
Both build &#039;&#039;&#039;environments&#039;&#039;&#039; — a self-contained folder with its own Python and its own libraries. You can keep several side by side, each holding different versions of the same software, without them interfering with one another.&lt;br /&gt;
&lt;br /&gt;
Both also install much more than Python packages. &amp;lt;code&amp;gt;pip&amp;lt;/code&amp;gt; installs Python code and nothing else, whereas conda and mamba can install the things that code depends on as well: R, compilers, C libraries and command-line programs. That is the main reason people choose them.&lt;br /&gt;
&lt;br /&gt;
Underneath, they are the same system. They use the same package format and the same repositories, so an environment built by one can be used by the other, and the commands are identical — &amp;lt;code&amp;gt;create&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;install&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;activate&amp;lt;/code&amp;gt;. Moving from one to the other is not a migration; nothing needs converting.&lt;br /&gt;
&lt;br /&gt;
=== How they differ ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! !! Anaconda !! Mamba&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;What you get&#039;&#039;&#039; || Python and several hundred packages, whether you wanted them or not. Several gigabytes. || Only the packages you ask for.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Where packages come from&#039;&#039;&#039; || Anaconda&#039;s own repository. || conda-forge and bioconda.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Cost&#039;&#039;&#039; || A paid licence is required for large organisations. || Free and open source.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Speed used to be a clear difference too, as mamba worked out dependencies far faster than conda did. Since conda version 23.10 the two share the same machinery for this, so the gap is much smaller than it once was.&lt;br /&gt;
&lt;br /&gt;
On licensing, Anaconda changed its terms in 2024 and they may not permit research use at an institution the size of WUR — see [https://www.anaconda.com/blog/update-on-anacondas-terms-of-service-for-academia-and-research Anaconda&#039;s own statement on academia and research].&lt;br /&gt;
&lt;br /&gt;
== Why they are not recommended in the cluster ==&lt;br /&gt;
&lt;br /&gt;
Both tools do run on Anunna. Neither is a good fit for it. The reasons below apply to Anaconda and Mamba alike, except the last one.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Neither is built for our hardware.&#039;&#039;&#039; Conda packages — from Anaconda and from conda-forge equally — are general-purpose builds that have to work on any machine in the world. The software we provide as modules is compiled for the exact processors in each generation of Anunna&#039;s nodes. If you care about speed and efficiency, use the modules in the buckets: see [[Python/Modules]].&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;They bring their own copies of software the cluster already provides.&#039;&#039;&#039; Ask for one package and you may also receive compilers, maths libraries, CUDA and MPI as dependencies. These sit alongside Anunna&#039;s own versions and can be picked up instead of them, which produces results that are hard to explain.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Their MPI is unlikely to use Anunna&#039;s fast network.&#039;&#039;&#039; A program that spreads work across several nodes needs MPI built against the cluster&#039;s high-speed interconnect. The MPI that comes out of a conda environment is a generic build, so a multi-node job may fall back to ordinary networking and run far slower, or fail to start at all. If your work runs on more than one node, use the MPI modules.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;They assume system libraries live where they do on a laptop.&#039;&#039;&#039; Those assumptions often do not hold here, and the result is a job that fails part-way through with an error that points nowhere useful.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;They fill your home directory.&#039;&#039;&#039; A single environment is tens of thousands of small files. Your home directory is small, it is backed up, and it sits on a filesystem measured at roughly ninety times slower than Lustre for large reads and writes. See [[Quotas]] and [[Storage Systems Overview]].&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Installing them slows the cluster down for everybody.&#039;&#039;&#039; Working out and unpacking an environment writes thousands of small files at once. On a login node, which is shared by every user, that is felt by everyone rather than only by you.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;They change your shell without asking.&#039;&#039;&#039; The &amp;lt;code&amp;gt;conda init&amp;lt;/code&amp;gt; command writes a block into your &amp;lt;code&amp;gt;~/.bashrc&amp;lt;/code&amp;gt;. That block is then read again by job scripts and by interactive sessions, and it can leak into containers, causing failures that look nothing like a conda problem.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Anaconda additionally has a licensing problem.&#039;&#039;&#039; Its 2024 terms require a paid licence for organisations of 200 or more people, and the free exemption covers teaching rather than research. Other HPC centres have already stopped providing it.&lt;br /&gt;
&lt;br /&gt;
== What to use instead ==&lt;br /&gt;
&lt;br /&gt;
In order — try the first before the second, and so on.&lt;br /&gt;
&lt;br /&gt;
=== Check whether it is already a module ===&lt;br /&gt;
&lt;br /&gt;
Most widely used scientific software is already installed on Anunna and compiled for our hardware. Search for it by name before installing anything yourself:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
module key blast&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;module key&amp;lt;/code&amp;gt; searches every bucket at once, so you do not need to load one first. See [[Environment Modules]].&lt;br /&gt;
&lt;br /&gt;
=== A virtual environment on a Python module ===&lt;br /&gt;
&lt;br /&gt;
If you only need Python packages, a virtual environment built on one of our Python modules is the right tool. It is smaller, faster and simpler than a conda environment, and it uses the Python we compiled for this machine.&lt;br /&gt;
&lt;br /&gt;
[[Python/Modules#Virtual environments]] covers this in full. The one thing to remember here is that the environment belongs on Lustre — under &amp;lt;code&amp;gt;$myNobackup&amp;lt;/code&amp;gt; — and not in your home directory.&lt;br /&gt;
&lt;br /&gt;
For a faster alternative to &amp;lt;code&amp;gt;pip&amp;lt;/code&amp;gt; when installing into such an environment, the &amp;lt;code&amp;gt;uv&amp;lt;/code&amp;gt; module is available in the 2025 bucket.&lt;br /&gt;
&lt;br /&gt;
=== A ready-made container ===&lt;br /&gt;
&lt;br /&gt;
Almost every package on bioconda is also published as a prebuilt container image, so you can run the software without building an environment at all. This is often the quickest route for bioinformatics software.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
module load utilities Apptainer&lt;br /&gt;
apptainer pull https://depot.galaxyproject.org/singularity/multiqc:1.29--pyhdfd78af_0&lt;br /&gt;
apptainer run multiqc_1.29--pyhdfd78af_0.sif multiqc --help&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Browse [https://depot.galaxyproject.org/singularity/ the image list] for the tool and version you want. See [[Apptainer]], and set &amp;lt;code&amp;gt;APPTAINER_CACHEDIR&amp;lt;/code&amp;gt; to a location on Lustre first, as that page describes.&lt;br /&gt;
&lt;br /&gt;
=== When none of these work ===&lt;br /&gt;
&lt;br /&gt;
Some software is published only as a conda package and has no module, no Python-only equivalent and no container. That is a real situation, and the rest of this page is for it.&lt;br /&gt;
&lt;br /&gt;
== If you still need conda ==&lt;br /&gt;
&lt;br /&gt;
Everything below is aimed at avoiding the problems described above. The two that matter most are keeping conda out of your &amp;lt;code&amp;gt;~/.bashrc&amp;lt;/code&amp;gt; and never building an environment on a login node.&lt;br /&gt;
&lt;br /&gt;
=== Use Miniforge, not Anaconda ===&lt;br /&gt;
&lt;br /&gt;
[https://github.com/conda-forge/miniforge Miniforge] is a small installer from the conda-forge community. It gives you both &amp;lt;code&amp;gt;conda&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;mamba&amp;lt;/code&amp;gt;, it uses conda-forge instead of Anaconda&#039;s repository, and it carries no licence conditions.&lt;br /&gt;
&lt;br /&gt;
=== Install it on Lustre, not in your home directory ===&lt;br /&gt;
&lt;br /&gt;
Start an interactive session first — see below — then:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd $myNobackup&lt;br /&gt;
curl -L -O https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-Linux-x86_64.sh&lt;br /&gt;
bash Miniforge3-Linux-x86_64.sh -b -p $myNobackup/miniforge3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;-p&amp;lt;/code&amp;gt; chooses where it goes. &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt; installs without asking questions &#039;&#039;&#039;and without touching your shell configuration&#039;&#039;&#039;, which is what you want.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$myNobackup&amp;lt;/code&amp;gt; is your Lustre location without backup, which is the right tier here: an environment can always be rebuilt from its list of packages, so it does not need backing up. If you have not set that variable yet, see [[Installing Personal Software#Aliases and local variables]].&lt;br /&gt;
&lt;br /&gt;
=== Do not let it change your shell ===&lt;br /&gt;
&lt;br /&gt;
Never run &amp;lt;code&amp;gt;conda init&amp;lt;/code&amp;gt;. Load conda explicitly instead, whenever you need it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
source $myNoBkp/miniforge3/etc/profile.d/conda.sh&lt;br /&gt;
conda activate myenv&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you have run &amp;lt;code&amp;gt;conda init&amp;lt;/code&amp;gt; in the past, open &amp;lt;code&amp;gt;~/.bashrc&amp;lt;/code&amp;gt; and delete everything between the lines &amp;lt;code&amp;gt;# &amp;gt;&amp;gt;&amp;gt; conda initialize &amp;gt;&amp;gt;&amp;gt;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;# &amp;lt;&amp;lt;&amp;lt; conda initialize &amp;lt;&amp;lt;&amp;lt;&amp;lt;/code&amp;gt;, including those two lines.&lt;br /&gt;
&lt;br /&gt;
=== Keep the package cache off your home directory ===&lt;br /&gt;
&lt;br /&gt;
Conda keeps a cache of downloaded packages and a record of your environments. Point both at Lustre by adding these lines to your &amp;lt;code&amp;gt;~/.bash_aliases&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
export CONDA_PKGS_DIRS=$myNoBkp/conda/pkgs&lt;br /&gt;
export CONDA_ENVS_DIRS=$myNoBkp/conda/envs&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Never build an environment on a login node ===&lt;br /&gt;
&lt;br /&gt;
Creating an environment is exactly the kind of work that disturbs the shared filesystem for other users. Ask for an interactive session on a compute node and do it there:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sinteractive -c 4 --mem 16G --time 120&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then create the environment. Listing the packages in a file makes it repeatable:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
source $myNoBkp/miniforge3/etc/profile.d/conda.sh&lt;br /&gt;
mamba create -n myenv python=3.12 numpy pandas&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
See [[Interactive Jobs]] for the options &amp;lt;code&amp;gt;sinteractive&amp;lt;/code&amp;gt; accepts.&lt;br /&gt;
&lt;br /&gt;
=== Using an environment in a job script ===&lt;br /&gt;
&lt;br /&gt;
Load conda and activate the environment inside the script itself. Note the first line: use plain &amp;lt;code&amp;gt;#!/bin/bash&amp;lt;/code&amp;gt;, not &amp;lt;code&amp;gt;#!/bin/bash -i&amp;lt;/code&amp;gt;, so the script does not read your shell configuration.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#SBATCH --job-name=myjob&lt;br /&gt;
#SBATCH --time=1:00:00&lt;br /&gt;
#SBATCH --cpus-per-task=4&lt;br /&gt;
#SBATCH --mem=16G&lt;br /&gt;
&lt;br /&gt;
source $myNobackup/miniforge3/etc/profile.d/conda.sh&lt;br /&gt;
conda activate myenv&lt;br /&gt;
&lt;br /&gt;
python myscript.py&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
See [[Batch Jobs]].&lt;br /&gt;
&lt;br /&gt;
=== Cleaning up ===&lt;br /&gt;
&lt;br /&gt;
Environments are large and easy to forget. Check what you have from time to time, remove what you no longer use, and empty the download cache:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
conda env list&lt;br /&gt;
conda env remove -n myenv&lt;br /&gt;
conda clean --all&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[Python]]&lt;br /&gt;
* [[Python/Modules]]&lt;br /&gt;
* [[Environment Modules]]&lt;br /&gt;
* [[Apptainer]]&lt;br /&gt;
* [[Interactive Jobs]]&lt;br /&gt;
* [[Batch Jobs]]&lt;br /&gt;
* [[Installing Personal Software]]&lt;br /&gt;
* [[Quotas]]&lt;br /&gt;
&lt;br /&gt;
== External links ==&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/conda-forge/miniforge Miniforge]&lt;br /&gt;
* [https://conda-forge.org/ conda-forge]&lt;br /&gt;
* [https://bioconda.github.io/ bioconda]&lt;br /&gt;
* [https://depot.galaxyproject.org/singularity/ Prebuilt bioconda container images]&lt;br /&gt;
* [https://www.anaconda.com/blog/update-on-anacondas-terms-of-service-for-academia-and-research Anaconda&#039;s terms of service for academia and research]&lt;/div&gt;</summary>
		<author><name>Honfi001</name></author>
	</entry>
	<entry>
		<id>https://wiki.anunna.wur.nl/index.php?title=Python/Conda&amp;diff=3052</id>
		<title>Python/Conda</title>
		<link rel="alternate" type="text/html" href="https://wiki.anunna.wur.nl/index.php?title=Python/Conda&amp;diff=3052"/>
		<updated>2026-08-17T13:55:35Z</updated>

		<summary type="html">&lt;p&gt;Honfi001: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Conda is a tool for installing scientific software and keeping it in self-contained folders called environments. You will meet it most often in bioinformatics, data science and machine learning, where a great deal of software is published this way.&lt;br /&gt;
&lt;br /&gt;
This page explains what Anaconda and Mamba are, why we do not recommend them on Anunna, what to use instead, and — if you have no alternative — how to use conda here with the least trouble.&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
=== What is Anaconda ===&lt;br /&gt;
&lt;br /&gt;
Anaconda is a Python distribution made by a company, Anaconda Inc. It arrives as one large download containing Python, the &amp;lt;code&amp;gt;conda&amp;lt;/code&amp;gt; command and several hundred scientific packages, already installed and ready to use. It is several gigabytes in size.&lt;br /&gt;
&lt;br /&gt;
It was designed for a personal computer: you install it once and nearly everything you might need is already there. That convenience is why it became so popular.&lt;br /&gt;
&lt;br /&gt;
=== What is Mamba ===&lt;br /&gt;
&lt;br /&gt;
Mamba is a free, open-source tool that does the same job as Anaconda&#039;s &amp;lt;code&amp;gt;conda&amp;lt;/code&amp;gt; command. It is not a bundle — it installs only the packages you ask for, and nothing else.&lt;br /&gt;
&lt;br /&gt;
Mamba comes from the [https://conda-forge.org/ conda-forge] community. You normally get it by installing [https://github.com/conda-forge/miniforge Miniforge], which provides both &amp;lt;code&amp;gt;conda&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;mamba&amp;lt;/code&amp;gt;. It gives you access to conda-forge and to [https://bioconda.github.io/ bioconda], the repository where most bioinformatics software is published.&lt;br /&gt;
&lt;br /&gt;
=== What they have in common ===&lt;br /&gt;
&lt;br /&gt;
Both build &#039;&#039;&#039;environments&#039;&#039;&#039; — a self-contained folder with its own Python and its own libraries. You can keep several side by side, each holding different versions of the same software, without them interfering with one another.&lt;br /&gt;
&lt;br /&gt;
Both also install much more than Python packages. &amp;lt;code&amp;gt;pip&amp;lt;/code&amp;gt; installs Python code and nothing else, whereas conda and mamba can install the things that code depends on as well: R, compilers, C libraries and command-line programs. That is the main reason people choose them.&lt;br /&gt;
&lt;br /&gt;
Underneath, they are the same system. They use the same package format and the same repositories, so an environment built by one can be used by the other, and the commands are identical — &amp;lt;code&amp;gt;create&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;install&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;activate&amp;lt;/code&amp;gt;. Moving from one to the other is not a migration; nothing needs converting.&lt;br /&gt;
&lt;br /&gt;
=== How they differ ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! !! Anaconda !! Mamba&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;What you get&#039;&#039;&#039; || Python and several hundred packages, whether you wanted them or not. Several gigabytes. || Only the packages you ask for.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Where packages come from&#039;&#039;&#039; || Anaconda&#039;s own repository. || conda-forge and bioconda.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Cost&#039;&#039;&#039; || A paid licence is required for large organisations. || Free and open source.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Speed used to be a clear difference too, as mamba worked out dependencies far faster than conda did. Since conda version 23.10 the two share the same machinery for this, so the gap is much smaller than it once was.&lt;br /&gt;
&lt;br /&gt;
On licensing, Anaconda changed its terms in 2024 and they may not permit research use at an institution the size of WUR — see [https://www.anaconda.com/blog/update-on-anacondas-terms-of-service-for-academia-and-research Anaconda&#039;s own statement on academia and research].&lt;br /&gt;
&lt;br /&gt;
== Why they are not recommended in the cluster ==&lt;br /&gt;
&lt;br /&gt;
Both tools do run on Anunna. Neither is a good fit for it. The reasons below apply to Anaconda and Mamba alike, except the last one.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Neither is built for our hardware.&#039;&#039;&#039; Conda packages — from Anaconda and from conda-forge equally — are general-purpose builds that have to work on any machine in the world. The software we provide as modules is compiled for the exact processors in each generation of Anunna&#039;s nodes. If you care about speed and efficiency, use the modules in the buckets: see [[Python/Modules]].&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;They bring their own copies of software the cluster already provides.&#039;&#039;&#039; Ask for one package and you may also receive compilers, maths libraries, CUDA and MPI as dependencies. These sit alongside Anunna&#039;s own versions and can be picked up instead of them, which produces results that are hard to explain.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Their MPI is unlikely to use Anunna&#039;s fast network.&#039;&#039;&#039; A program that spreads work across several nodes needs MPI built against the cluster&#039;s high-speed interconnect. The MPI that comes out of a conda environment is a generic build, so a multi-node job may fall back to ordinary networking and run far slower, or fail to start at all. If your work runs on more than one node, use the MPI modules.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;They assume system libraries live where they do on a laptop.&#039;&#039;&#039; Those assumptions often do not hold here, and the result is a job that fails part-way through with an error that points nowhere useful.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;They fill your home directory.&#039;&#039;&#039; A single environment is tens of thousands of small files. Your home directory is small, it is backed up, and it sits on a filesystem measured at roughly ninety times slower than Lustre for large reads and writes. See [[Quotas]] and [[Storage Systems Overview]].&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Installing them slows the cluster down for everybody.&#039;&#039;&#039; Working out and unpacking an environment writes thousands of small files at once. On a login node, which is shared by every user, that is felt by everyone rather than only by you.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;They change your shell without asking.&#039;&#039;&#039; The &amp;lt;code&amp;gt;conda init&amp;lt;/code&amp;gt; command writes a block into your &amp;lt;code&amp;gt;~/.bashrc&amp;lt;/code&amp;gt;. That block is then read again by job scripts and by interactive sessions, and it can leak into containers, causing failures that look nothing like a conda problem.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Anaconda additionally has a licensing problem.&#039;&#039;&#039; Its 2024 terms require a paid licence for organisations of 200 or more people, and the free exemption covers teaching rather than research. Other HPC centres have already stopped providing it.&lt;br /&gt;
&lt;br /&gt;
== What to use instead ==&lt;br /&gt;
&lt;br /&gt;
In order — try the first before the second, and so on.&lt;br /&gt;
&lt;br /&gt;
=== Check whether it is already a module ===&lt;br /&gt;
&lt;br /&gt;
Most widely used scientific software is already installed on Anunna and compiled for our hardware. Search for it by name before installing anything yourself:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
module key blast&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;module key&amp;lt;/code&amp;gt; searches every bucket at once, so you do not need to load one first. See [[Environment Modules]].&lt;br /&gt;
&lt;br /&gt;
=== A virtual environment on a Python module ===&lt;br /&gt;
&lt;br /&gt;
If you only need Python packages, a virtual environment built on one of our Python modules is the right tool. It is smaller, faster and simpler than a conda environment, and it uses the Python we compiled for this machine.&lt;br /&gt;
&lt;br /&gt;
[[Python/Modules#Virtual environments]] covers this in full. The one thing to remember here is that the environment belongs on Lustre — under &amp;lt;code&amp;gt;$myNobackup&amp;lt;/code&amp;gt; — and not in your home directory.&lt;br /&gt;
&lt;br /&gt;
For a faster alternative to &amp;lt;code&amp;gt;pip&amp;lt;/code&amp;gt; when installing into such an environment, the &amp;lt;code&amp;gt;uv&amp;lt;/code&amp;gt; module is available in the 2025 bucket.&lt;br /&gt;
&lt;br /&gt;
=== A ready-made container ===&lt;br /&gt;
&lt;br /&gt;
Almost every package on bioconda is also published as a prebuilt container image, so you can run the software without building an environment at all. This is often the quickest route for bioinformatics software.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
module load utilities Apptainer&lt;br /&gt;
apptainer pull https://depot.galaxyproject.org/singularity/multiqc:1.29--pyhdfd78af_0&lt;br /&gt;
apptainer run multiqc_1.29--pyhdfd78af_0.sif multiqc --help&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Browse [https://depot.galaxyproject.org/singularity/ the image list] for the tool and version you want. See [[Apptainer]], and set &amp;lt;code&amp;gt;APPTAINER_CACHEDIR&amp;lt;/code&amp;gt; to a location on Lustre first, as that page describes.&lt;br /&gt;
&lt;br /&gt;
=== When none of these work ===&lt;br /&gt;
&lt;br /&gt;
Some software is published only as a conda package and has no module, no Python-only equivalent and no container. That is a real situation, and the rest of this page is for it.&lt;br /&gt;
&lt;br /&gt;
== If you still need conda ==&lt;br /&gt;
&lt;br /&gt;
Everything below is aimed at avoiding the problems described above. The two that matter most are keeping conda out of your &amp;lt;code&amp;gt;~/.bashrc&amp;lt;/code&amp;gt; and never building an environment on a login node.&lt;br /&gt;
&lt;br /&gt;
=== Use Miniforge, not Anaconda ===&lt;br /&gt;
&lt;br /&gt;
[https://github.com/conda-forge/miniforge Miniforge] is a small installer from the conda-forge community. It gives you both &amp;lt;code&amp;gt;conda&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;mamba&amp;lt;/code&amp;gt;, it uses conda-forge instead of Anaconda&#039;s repository, and it carries no licence conditions.&lt;br /&gt;
&lt;br /&gt;
=== Install it on Lustre, not in your home directory ===&lt;br /&gt;
&lt;br /&gt;
Start an interactive session first — see below — then:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd $myNobackup&lt;br /&gt;
curl -L -O https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-Linux-x86_64.sh&lt;br /&gt;
bash Miniforge3-Linux-x86_64.sh -b -p $myNobackup/miniforge3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;-p&amp;lt;/code&amp;gt; chooses where it goes. &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt; installs without asking questions &#039;&#039;&#039;and without touching your shell configuration&#039;&#039;&#039;, which is what you want.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$myNobackup&amp;lt;/code&amp;gt; is your Lustre location without backup, which is the right tier here: an environment can always be rebuilt from its list of packages, so it does not need backing up. If you have not set that variable yet, see [[Installing Personal Software#Aliases and local variables]].&lt;br /&gt;
&lt;br /&gt;
=== Do not let it change your shell ===&lt;br /&gt;
&lt;br /&gt;
Never run &amp;lt;code&amp;gt;conda init&amp;lt;/code&amp;gt;. Load conda explicitly instead, whenever you need it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
source $myNoBkp/miniforge3/etc/profile.d/conda.sh&lt;br /&gt;
conda activate myenv&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you have run &amp;lt;code&amp;gt;conda init&amp;lt;/code&amp;gt; in the past, open &amp;lt;code&amp;gt;~/.bashrc&amp;lt;/code&amp;gt; and delete everything between the lines &amp;lt;code&amp;gt;# &amp;gt;&amp;gt;&amp;gt; conda initialize &amp;gt;&amp;gt;&amp;gt;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;# &amp;lt;&amp;lt;&amp;lt; conda initialize &amp;lt;&amp;lt;&amp;lt;&amp;lt;/code&amp;gt;, including those two lines.&lt;br /&gt;
&lt;br /&gt;
=== Keep the package cache off your home directory ===&lt;br /&gt;
&lt;br /&gt;
Conda keeps a cache of downloaded packages and a record of your environments. Point both at Lustre by adding these lines to your &amp;lt;code&amp;gt;~/.bash_aliases&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
export CONDA_PKGS_DIRS=$myNoBkp/conda/pkgs&lt;br /&gt;
export CONDA_ENVS_DIRS=$myNoBkp/conda/envs&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Never build an environment on a login node ===&lt;br /&gt;
&lt;br /&gt;
Creating an environment is exactly the kind of work that disturbs the shared filesystem for other users. Ask for an interactive session on a compute node and do it there:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sinteractive -c 4 --mem 16G --time 120&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then create the environment. Listing the packages in a file makes it repeatable:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
source $myNoBkp/miniforge3/etc/profile.d/conda.sh&lt;br /&gt;
mamba create -n myenv python=3.12 numpy pandas&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
See [[Interactive Jobs]] for the options &amp;lt;code&amp;gt;sinteractive&amp;lt;/code&amp;gt; accepts.&lt;br /&gt;
&lt;br /&gt;
=== Using an environment in a job script ===&lt;br /&gt;
&lt;br /&gt;
Load conda and activate the environment inside the script itself. Note the first line: use plain &amp;lt;code&amp;gt;#!/bin/bash&amp;lt;/code&amp;gt;, not &amp;lt;code&amp;gt;#!/bin/bash -i&amp;lt;/code&amp;gt;, so the script does not read your shell configuration.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#SBATCH --job-name=myjob&lt;br /&gt;
#SBATCH --time=1:00:00&lt;br /&gt;
#SBATCH --cpus-per-task=4&lt;br /&gt;
#SBATCH --mem=16G&lt;br /&gt;
&lt;br /&gt;
source $myNobackup/miniforge3/etc/profile.d/conda.sh&lt;br /&gt;
conda activate myenv&lt;br /&gt;
&lt;br /&gt;
python myscript.py&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
See [[Batch Jobs]].&lt;br /&gt;
&lt;br /&gt;
=== Cleaning up ===&lt;br /&gt;
&lt;br /&gt;
Environments are large and easy to forget. Check what you have from time to time, remove what you no longer use, and empty the download cache:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
conda env list&lt;br /&gt;
conda env remove -n myenv&lt;br /&gt;
conda clean --all&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[Python]]&lt;br /&gt;
* [[Python/Modules]]&lt;br /&gt;
* [[Environment Modules]]&lt;br /&gt;
* [[Apptainer]]&lt;br /&gt;
* [[Interactive Jobs]]&lt;br /&gt;
* [[Batch Jobs]]&lt;br /&gt;
* [[Installing Personal Software]]&lt;br /&gt;
* [[Quotas]]&lt;br /&gt;
&lt;br /&gt;
== External links ==&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/conda-forge/miniforge Miniforge]&lt;br /&gt;
* [https://conda-forge.org/ conda-forge]&lt;br /&gt;
* [https://bioconda.github.io/ bioconda]&lt;br /&gt;
* [https://depot.galaxyproject.org/singularity/ Prebuilt bioconda container images]&lt;br /&gt;
* [https://www.anaconda.com/blog/update-on-anacondas-terms-of-service-for-academia-and-research Anaconda&#039;s terms of service for academia and research]&lt;/div&gt;</summary>
		<author><name>Honfi001</name></author>
	</entry>
	<entry>
		<id>https://wiki.anunna.wur.nl/index.php?title=Python/Conda&amp;diff=3051</id>
		<title>Python/Conda</title>
		<link rel="alternate" type="text/html" href="https://wiki.anunna.wur.nl/index.php?title=Python/Conda&amp;diff=3051"/>
		<updated>2026-08-17T13:42:12Z</updated>

		<summary type="html">&lt;p&gt;Honfi001: Created page with &amp;quot;Conda is a tool for installing scientific software and keeping it in self-contained folders called environments. You will meet it most often in bioinformatics, data science and machine learning, where a great deal of software is published this way.  This page explains what Anaconda and Mamba are, why we do not recommend them on Anunna, what to use instead, and — if you have no alternative — how to use conda here with the least trouble.  == Introduction ==  === What i...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Conda is a tool for installing scientific software and keeping it in self-contained folders called environments. You will meet it most often in bioinformatics, data science and machine learning, where a great deal of software is published this way.&lt;br /&gt;
&lt;br /&gt;
This page explains what Anaconda and Mamba are, why we do not recommend them on Anunna, what to use instead, and — if you have no alternative — how to use conda here with the least trouble.&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
=== What is Anaconda ===&lt;br /&gt;
&lt;br /&gt;
Anaconda is a Python distribution made by a company, Anaconda Inc. It arrives as one large download containing Python, the &amp;lt;code&amp;gt;conda&amp;lt;/code&amp;gt; command and several hundred scientific packages, already installed and ready to use. It is several gigabytes in size.&lt;br /&gt;
&lt;br /&gt;
It was designed for a personal computer: you install it once and nearly everything you might need is already there. That convenience is why it became so popular.&lt;br /&gt;
&lt;br /&gt;
=== What is Mamba ===&lt;br /&gt;
&lt;br /&gt;
Mamba is a free, open-source tool that does the same job as Anaconda&#039;s &amp;lt;code&amp;gt;conda&amp;lt;/code&amp;gt; command. It is not a bundle — it installs only the packages you ask for, and nothing else.&lt;br /&gt;
&lt;br /&gt;
Mamba comes from the [https://conda-forge.org/ conda-forge] community. You normally get it by installing [https://github.com/conda-forge/miniforge Miniforge], which provides both &amp;lt;code&amp;gt;conda&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;mamba&amp;lt;/code&amp;gt;. It gives you access to conda-forge and to [https://bioconda.github.io/ bioconda], the repository where most bioinformatics software is published.&lt;br /&gt;
&lt;br /&gt;
=== What they have in common ===&lt;br /&gt;
&lt;br /&gt;
Both build &#039;&#039;&#039;environments&#039;&#039;&#039; — a self-contained folder with its own Python and its own libraries. You can keep several side by side, each holding different versions of the same software, without them interfering with one another.&lt;br /&gt;
&lt;br /&gt;
Both also install much more than Python packages. &amp;lt;code&amp;gt;pip&amp;lt;/code&amp;gt; installs Python code and nothing else, whereas conda and mamba can install the things that code depends on as well: R, compilers, C libraries and command-line programs. That is the main reason people choose them.&lt;br /&gt;
&lt;br /&gt;
Underneath, they are the same system. They use the same package format and the same repositories, so an environment built by one can be used by the other, and the commands are identical — &amp;lt;code&amp;gt;create&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;install&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;activate&amp;lt;/code&amp;gt;. Moving from one to the other is not a migration; nothing needs converting.&lt;br /&gt;
&lt;br /&gt;
=== How they differ ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! !! Anaconda !! Mamba&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;What you get&#039;&#039;&#039; || Python and several hundred packages, whether you wanted them or not. Several gigabytes. || Only the packages you ask for.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Where packages come from&#039;&#039;&#039; || Anaconda&#039;s own repository. || conda-forge and bioconda.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Cost&#039;&#039;&#039; || A paid licence is required for large organisations. || Free and open source.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Speed used to be a clear difference too, as mamba worked out dependencies far faster than conda did. Since conda version 23.10 the two share the same machinery for this, so the gap is much smaller than it once was.&lt;br /&gt;
&lt;br /&gt;
On licensing, Anaconda changed its terms in 2024 and they may not permit research use at an institution the size of WUR — see [https://www.anaconda.com/blog/update-on-anacondas-terms-of-service-for-academia-and-research Anaconda&#039;s own statement on academia and research].&lt;br /&gt;
&lt;br /&gt;
== Why they are not recommended in the cluster ==&lt;br /&gt;
&lt;br /&gt;
Both tools do run on Anunna. Neither is a good fit for it. The reasons below apply to Anaconda and Mamba alike, except the last one.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Neither is built for our hardware.&#039;&#039;&#039; Conda packages — from Anaconda and from conda-forge equally — are general-purpose builds that have to work on any machine in the world. The software we provide as modules is compiled for the exact processors in each generation of Anunna&#039;s nodes. If you care about speed and efficiency, use the modules in the buckets: see [[Python/Modules]].&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;They bring their own copies of software the cluster already provides.&#039;&#039;&#039; Ask for one package and you may also receive compilers, maths libraries, CUDA and MPI as dependencies. These sit alongside Anunna&#039;s own versions and can be picked up instead of them, which produces results that are hard to explain.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Their MPI is unlikely to use Anunna&#039;s fast network.&#039;&#039;&#039; A program that spreads work across several nodes needs MPI built against the cluster&#039;s high-speed interconnect. The MPI that comes out of a conda environment is a generic build, so a multi-node job may fall back to ordinary networking and run far slower, or fail to start at all. If your work runs on more than one node, use the MPI modules.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;They assume system libraries live where they do on a laptop.&#039;&#039;&#039; Those assumptions often do not hold here, and the result is a job that fails part-way through with an error that points nowhere useful.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;They fill your home directory.&#039;&#039;&#039; A single environment is tens of thousands of small files. Your home directory is small, it is backed up, and it sits on a filesystem measured at roughly ninety times slower than Lustre for large reads and writes. See [[Quotas]] and [[Storage Systems Overview]].&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Installing them slows the cluster down for everybody.&#039;&#039;&#039; Working out and unpacking an environment writes thousands of small files at once. On a login node, which is shared by every user, that is felt by everyone rather than only by you.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;They change your shell without asking.&#039;&#039;&#039; The &amp;lt;code&amp;gt;conda init&amp;lt;/code&amp;gt; command writes a block into your &amp;lt;code&amp;gt;~/.bashrc&amp;lt;/code&amp;gt;. That block is then read again by job scripts and by interactive sessions, and it can leak into containers, causing failures that look nothing like a conda problem.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Anaconda additionally has a licensing problem.&#039;&#039;&#039; Its 2024 terms require a paid licence for organisations of 200 or more people, and the free exemption covers teaching rather than research. Other HPC centres have already stopped providing it.&lt;br /&gt;
&lt;br /&gt;
== What to use instead ==&lt;br /&gt;
&lt;br /&gt;
In order — try the first before the second, and so on.&lt;br /&gt;
&lt;br /&gt;
=== Check whether it is already a module ===&lt;br /&gt;
&lt;br /&gt;
Most widely used scientific software is already installed on Anunna and compiled for our hardware. Search for it by name before installing anything yourself:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
module key blast&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;module key&amp;lt;/code&amp;gt; searches every bucket at once, so you do not need to load one first. See [[Environment Modules]].&lt;br /&gt;
&lt;br /&gt;
=== A virtual environment on a Python module ===&lt;br /&gt;
&lt;br /&gt;
If you only need Python packages, a virtual environment built on one of our Python modules is the right tool. It is smaller, faster and simpler than a conda environment, and it uses the Python we compiled for this machine.&lt;br /&gt;
&lt;br /&gt;
[[Python/Modules#Virtual environments]] covers this in full. The one thing to remember here is that the environment belongs on Lustre — under &amp;lt;code&amp;gt;$myNobackup&amp;lt;/code&amp;gt; — and not in your home directory.&lt;br /&gt;
&lt;br /&gt;
For a faster alternative to &amp;lt;code&amp;gt;pip&amp;lt;/code&amp;gt; when installing into such an environment, the &amp;lt;code&amp;gt;uv&amp;lt;/code&amp;gt; module is available in the 2025 bucket.&lt;br /&gt;
&lt;br /&gt;
=== A ready-made container ===&lt;br /&gt;
&lt;br /&gt;
Almost every package on bioconda is also published as a prebuilt container image, so you can run the software without building an environment at all. This is often the quickest route for bioinformatics software.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
module load utilities Apptainer&lt;br /&gt;
apptainer pull https://depot.galaxyproject.org/singularity/multiqc:1.29--pyhdfd78af_0&lt;br /&gt;
apptainer run multiqc_1.29--pyhdfd78af_0.sif multiqc --help&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Browse [https://depot.galaxyproject.org/singularity/ the image list] for the tool and version you want. See [[Apptainer]], and set &amp;lt;code&amp;gt;APPTAINER_CACHEDIR&amp;lt;/code&amp;gt; to a location on Lustre first, as that page describes.&lt;br /&gt;
&lt;br /&gt;
=== When none of these work ===&lt;br /&gt;
&lt;br /&gt;
Some software is published only as a conda package and has no module, no Python-only equivalent and no container. That is a real situation, and the rest of this page is for it.&lt;br /&gt;
&lt;br /&gt;
== If you still need conda ==&lt;br /&gt;
&lt;br /&gt;
Everything below is aimed at avoiding the problems described above. The two that matter most are keeping conda out of your &amp;lt;code&amp;gt;~/.bashrc&amp;lt;/code&amp;gt; and never building an environment on a login node.&lt;br /&gt;
&lt;br /&gt;
=== Use Miniforge, not Anaconda ===&lt;br /&gt;
&lt;br /&gt;
[https://github.com/conda-forge/miniforge Miniforge] is a small installer from the conda-forge community. It gives you both &amp;lt;code&amp;gt;conda&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;mamba&amp;lt;/code&amp;gt;, it uses conda-forge instead of Anaconda&#039;s repository, and it carries no licence conditions.&lt;br /&gt;
&lt;br /&gt;
=== Install it on Lustre, not in your home directory ===&lt;br /&gt;
&lt;br /&gt;
Start an interactive session first — see below — then:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd $myNobackup&lt;br /&gt;
curl -L -O https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-Linux-x86_64.sh&lt;br /&gt;
bash Miniforge3-Linux-x86_64.sh -b -p $myNobackup/miniforge3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;-p&amp;lt;/code&amp;gt; chooses where it goes. &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt; installs without asking questions &#039;&#039;&#039;and without touching your shell configuration&#039;&#039;&#039;, which is what you want.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$myNobackup&amp;lt;/code&amp;gt; is your Lustre location without backup, which is the right tier here: an environment can always be rebuilt from its list of packages, so it does not need backing up. If you have not set that variable yet, see [[Installing Personal Software#Aliases and local variables]].&lt;br /&gt;
&lt;br /&gt;
=== Do not let it change your shell ===&lt;br /&gt;
&lt;br /&gt;
Never run &amp;lt;code&amp;gt;conda init&amp;lt;/code&amp;gt;. Load conda explicitly instead, whenever you need it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
source $myNobackup/miniforge3/etc/profile.d/conda.sh&lt;br /&gt;
conda activate myenv&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you have run &amp;lt;code&amp;gt;conda init&amp;lt;/code&amp;gt; in the past, open &amp;lt;code&amp;gt;~/.bashrc&amp;lt;/code&amp;gt; and delete everything between the lines &amp;lt;code&amp;gt;# &amp;gt;&amp;gt;&amp;gt; conda initialize &amp;gt;&amp;gt;&amp;gt;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;# &amp;lt;&amp;lt;&amp;lt; conda initialize &amp;lt;&amp;lt;&amp;lt;&amp;lt;/code&amp;gt;, including those two lines.&lt;br /&gt;
&lt;br /&gt;
=== Keep the package cache off your home directory ===&lt;br /&gt;
&lt;br /&gt;
Conda keeps a cache of downloaded packages and a record of your environments. Point both at Lustre by adding these lines to your &amp;lt;code&amp;gt;~/.bash_aliases&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
export CONDA_PKGS_DIRS=$myNobackup/conda/pkgs&lt;br /&gt;
export CONDA_ENVS_DIRS=$myNobackup/conda/envs&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Never build an environment on a login node ===&lt;br /&gt;
&lt;br /&gt;
Creating an environment is exactly the kind of work that disturbs the shared filesystem for other users. Ask for an interactive session on a compute node and do it there:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sinteractive -c 4 --mem 16G --time 120&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then create the environment. Listing the packages in a file makes it repeatable:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
source $myNobackup/miniforge3/etc/profile.d/conda.sh&lt;br /&gt;
mamba create -n myenv python=3.12 numpy pandas&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
See [[Interactive Jobs]] for the options &amp;lt;code&amp;gt;sinteractive&amp;lt;/code&amp;gt; accepts.&lt;br /&gt;
&lt;br /&gt;
=== Using an environment in a job script ===&lt;br /&gt;
&lt;br /&gt;
Load conda and activate the environment inside the script itself. Note the first line: use plain &amp;lt;code&amp;gt;#!/bin/bash&amp;lt;/code&amp;gt;, not &amp;lt;code&amp;gt;#!/bin/bash -i&amp;lt;/code&amp;gt;, so the script does not read your shell configuration.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#SBATCH --job-name=myjob&lt;br /&gt;
#SBATCH --time=1:00:00&lt;br /&gt;
#SBATCH --cpus-per-task=4&lt;br /&gt;
#SBATCH --mem=16G&lt;br /&gt;
&lt;br /&gt;
source $myNobackup/miniforge3/etc/profile.d/conda.sh&lt;br /&gt;
conda activate myenv&lt;br /&gt;
&lt;br /&gt;
python myscript.py&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
See [[Batch Jobs]].&lt;br /&gt;
&lt;br /&gt;
=== Cleaning up ===&lt;br /&gt;
&lt;br /&gt;
Environments are large and easy to forget. Check what you have from time to time, remove what you no longer use, and empty the download cache:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
conda env list&lt;br /&gt;
conda env remove -n myenv&lt;br /&gt;
conda clean --all&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[Python]]&lt;br /&gt;
* [[Python/Modules]]&lt;br /&gt;
* [[Environment Modules]]&lt;br /&gt;
* [[Apptainer]]&lt;br /&gt;
* [[Interactive Jobs]]&lt;br /&gt;
* [[Batch Jobs]]&lt;br /&gt;
* [[Installing Personal Software]]&lt;br /&gt;
* [[Quotas]]&lt;br /&gt;
&lt;br /&gt;
== External links ==&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/conda-forge/miniforge Miniforge]&lt;br /&gt;
* [https://conda-forge.org/ conda-forge]&lt;br /&gt;
* [https://bioconda.github.io/ bioconda]&lt;br /&gt;
* [https://depot.galaxyproject.org/singularity/ Prebuilt bioconda container images]&lt;br /&gt;
* [https://www.anaconda.com/blog/update-on-anacondas-terms-of-service-for-academia-and-research Anaconda&#039;s terms of service for academia and research]&lt;/div&gt;</summary>
		<author><name>Honfi001</name></author>
	</entry>
	<entry>
		<id>https://wiki.anunna.wur.nl/index.php?title=Python&amp;diff=3049</id>
		<title>Python</title>
		<link rel="alternate" type="text/html" href="https://wiki.anunna.wur.nl/index.php?title=Python&amp;diff=3049"/>
		<updated>2026-08-12T15:10:19Z</updated>

		<summary type="html">&lt;p&gt;Honfi001: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Python is a high-level, interpreted programming language popular in scientific computing for its readability and its enormous ecosystem of third-party libraries — NumPy, Pandas, scikit-learn, PyTorch, TensorFlow, and many more. This page describes how to use Python on Anunna: the provided modules, how to manage your own packages with virtual environments or Miniforge, and how to expose an environment as a Jupyter kernel.&lt;br /&gt;
&lt;br /&gt;
* [[Python/Modules|Modules]]&lt;br /&gt;
* uv (soon)&lt;br /&gt;
* Mamba/Conda (soon)&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[Environment Modules]]&lt;br /&gt;
* [[Installing Personal Software]]&lt;br /&gt;
* [[Jupyter]]&lt;br /&gt;
* [[R]]&lt;br /&gt;
* [[Apptainer]]&lt;br /&gt;
&lt;br /&gt;
== External links ==&lt;br /&gt;
&lt;br /&gt;
* [https://docs.python.org/3/library/venv.html Python venv documentation]&lt;br /&gt;
* [https://github.com/conda-forge/miniforge Miniforge]&lt;br /&gt;
* [https://conda-forge.org/ conda-forge]&lt;/div&gt;</summary>
		<author><name>Honfi001</name></author>
	</entry>
	<entry>
		<id>https://wiki.anunna.wur.nl/index.php?title=Python&amp;diff=3048</id>
		<title>Python</title>
		<link rel="alternate" type="text/html" href="https://wiki.anunna.wur.nl/index.php?title=Python&amp;diff=3048"/>
		<updated>2026-08-12T15:09:04Z</updated>

		<summary type="html">&lt;p&gt;Honfi001: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Python is a high-level, interpreted programming language popular in scientific computing for its readability and its enormous ecosystem of third-party libraries — NumPy, Pandas, scikit-learn, PyTorch, TensorFlow, and many more. This page describes how to use Python on Anunna: the provided modules, how to manage your own packages with virtual environments or Miniforge, and how to expose an environment as a Jupyter kernel.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[Environment Modules]]&lt;br /&gt;
* [[Installing Personal Software]]&lt;br /&gt;
* [[Jupyter]]&lt;br /&gt;
* [[R]]&lt;br /&gt;
* [[Apptainer]]&lt;br /&gt;
&lt;br /&gt;
== External links ==&lt;br /&gt;
&lt;br /&gt;
* [https://docs.python.org/3/library/venv.html Python venv documentation]&lt;br /&gt;
* [https://github.com/conda-forge/miniforge Miniforge]&lt;br /&gt;
* [https://conda-forge.org/ conda-forge]&lt;/div&gt;</summary>
		<author><name>Honfi001</name></author>
	</entry>
	<entry>
		<id>https://wiki.anunna.wur.nl/index.php?title=Python/Modules&amp;diff=3047</id>
		<title>Python/Modules</title>
		<link rel="alternate" type="text/html" href="https://wiki.anunna.wur.nl/index.php?title=Python/Modules&amp;diff=3047"/>
		<updated>2026-08-12T15:07:10Z</updated>

		<summary type="html">&lt;p&gt;Honfi001: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Modules =&lt;br /&gt;
The Python Environment Modules are the only officially supported Python distributions in the HPC. These are compiled for each specific architecture of the HPC and hence are likely going to be more performant than the versions obtained via Mamba or UV. &lt;br /&gt;
&lt;br /&gt;
Anunna provides one Python version per [[Environment Modules | module bucket]], plus bundle modules that carry a curated set of common extensions. Load a bucket, then the Python module:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;2023&#039;&#039;&#039;: &amp;lt;code&amp;gt;Python/3.11.3&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;2024&#039;&#039;&#039;: &amp;lt;code&amp;gt;Python/3.12.3&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;2024&#039;&#039;&#039;: &amp;lt;code&amp;gt;Python/3.13.1&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So, for instance, loading Python 3.12.3&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
module load 2024&lt;br /&gt;
module load Python/3.12.3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The bundle module &amp;lt;code&amp;gt;Python-bundle-PyPI&amp;lt;/code&amp;gt; adds many frequently-used packages on top of the base interpreter. Use &amp;lt;code&amp;gt;module key &amp;lt;package&amp;gt;&amp;lt;/code&amp;gt; to find which bundle contains a package you need (see [[Environment Modules#Searching by keyword | searching modules by keyword]]).&lt;br /&gt;
&lt;br /&gt;
For packages not in a module, the two recommended routes are a &#039;&#039;&#039;virtual environment&#039;&#039;&#039; built on a Python module (below), or &#039;&#039;&#039;Miniforge&#039;&#039;&#039; for a self-contained conda/mamba setup. The use of Anaconda is discouraged on Anunna — its default channels carry licensing restrictions and the full distribution is heavy; Miniforge is the lighter, unrestricted alternative.&lt;br /&gt;
&lt;br /&gt;
== Virtual environments ==&lt;br /&gt;
&lt;br /&gt;
A virtual environment is a self-contained directory holding a specific Python and its packages, so one project&#039;s dependencies cannot clash with another&#039;s. Python&#039;s built-in &amp;lt;code&amp;gt;venv&amp;lt;/code&amp;gt; module is the simplest way to make one on top of a Python module.&lt;br /&gt;
&lt;br /&gt;
First load the Python version you want:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
module load 2024&lt;br /&gt;
module load Python/3.12.3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then create the environment in a location of your choosing. The example uses &amp;lt;code&amp;gt;$myNobackup/PythonEnv&amp;lt;/code&amp;gt; — &amp;lt;code&amp;gt;$myNobackup&amp;lt;/code&amp;gt; is your Lustre nobackup location, set in your &amp;lt;code&amp;gt;~/.bash_aliases&amp;lt;/code&amp;gt; (see [[Installing Personal Software#Aliases and local variables | Aliases and local variables]]). Keeping environments on Lustre rather than your home directory avoids filling your home quota, and the nobackup tier is the right choice because an environment can always be recreated from scratch and so does not need backing up.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python -m venv $myNobackup/PythonEnv/my_env&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Activate it whenever you want to use it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
source $myNobackup/PythonEnv/my_env/bin/activate&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once active, the environment name appears as a prefix in your prompt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
(my_env) user001@login200:~$&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Install packages with &amp;lt;code&amp;gt;pip&amp;lt;/code&amp;gt; while the environment is active; they go into the environment, not your home directory:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
pip install -U numpy pandas matplotlib&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Leave the environment with &amp;lt;code&amp;gt;deactivate&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Jupyter kernels ==&lt;br /&gt;
&lt;br /&gt;
Once your virtual environment has been setup, you can can access it in jupyter, either via the apps or the notebooks page by setting up a kernel. A kernel is nothing more than a json file with details for jupyter on where to find your Python environment. First things first,  with your Python modules loaded activate your virtual environment from the example before. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;source $myNobackup/PythonEnv/my_env/bin/activate&amp;lt;/syntaxhighlight&amp;gt;The install [https://pypi.org/project/ipykernel/ ipyKernel]&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;(my_env) user001@login200:~$ pip install -U ipykernel&amp;lt;/syntaxhighlight&amp;gt;This is the only dependency that Python needs for creating kernels, you can then run &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;(my_env) user001@login200:~$ python -m ipykernel install --user --name=myenv --display-name=&amp;quot;Python (myenv)&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;This command will create a folder labelled &amp;lt;code&amp;gt;myenv&amp;lt;/code&amp;gt;  containing a &amp;lt;code&amp;gt;kernel.json&amp;lt;/code&amp;gt; file inside of  &amp;lt;code&amp;gt;$HOME/.local/share/jupyter/kernels/&amp;lt;/code&amp;gt; , which jupyter watches. If your goal is just to create a kernel for yourself, then you are done. The kernel should be visible to you both inside of the jupyter instances, either the ones accessed via the [https://apps.anunna.wur.nl anuna apps portal] or the [https://notebook.anunna.wur.nl notebooks page].  Thus, the kernel will not be visible or accessible to other users. &lt;br /&gt;
&lt;br /&gt;
The --name=myenv flag is entirely optional, it is the directory in which the &amp;lt;code&amp;gt;kernel.json&amp;lt;/code&amp;gt; file is generated. If not used, python will simply label it &amp;lt;code&amp;gt;python3&amp;lt;/code&amp;gt; . The use of this flag is recommended, specially when working with multiple kernels to avoid overwriting previously created kernels. &lt;br /&gt;
&lt;br /&gt;
=== Shared Kernels ===&lt;br /&gt;
Whether for a course or collaboration, sometimes it is convenient to share a kernel with other users. This is possible and the procedure is a variation of the previous one, with just some additional requirements&lt;br /&gt;
&lt;br /&gt;
* The virtual environment you create needs to be in a shared location , e.g. /lutre/shared&lt;br /&gt;
* The virtual environment folder needs to be visiible and accessible to other users i.e. it must have read and execute permissions, 755 is recommended&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Like before load the  bucket and its corresponding Python version and create your project folder and go there&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;module load 2025&lt;br /&gt;
module load Python/3.13.1&lt;br /&gt;
mkdir /lustre/shared/MyProject&lt;br /&gt;
cd /lustre/shared/MyProject&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Then create your virtual environemnt, activate it and install [https://pypi.org/project/ipykernel/ ipyKernel]&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;python -m venv ./project_env&lt;br /&gt;
source /lustre/shared/MyProject/project_env/bin/activate&lt;br /&gt;
pip install -U ipykernel&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here is where things differ, inside the activate kernel run the command&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python -m ipykernel install --sys-prefix --name=myproject --display-name=&amp;quot;Python (project_env)&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Note that now the command uses the flag  --sys-prefix . This flag sets the installation path of the kernel &#039;&#039;&#039;inside&#039;&#039;&#039; the virtual environment&#039;s directory, in this case, the kernel.json file will be generate in  &amp;lt;code&amp;gt;/lustre/shared/MyProject/project_env/share/jupyter/kernels/myproject&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
While the kernel has been created, jupyter still will not be able to see it. In order to be able to see and access the kernel you would need to either copy it to your  folder&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
MYPROJ=/lustre/shared/MyProject&lt;br /&gt;
cp -r $MYPROJ/project_env/share/jupyter/kernels/myproject $HOME/.local/share/jupyter/kernels/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;or link it&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
MYPROJ=/lustre/shared/MyProject&lt;br /&gt;
ln -s $MYPROJ/project_env/share/jupyter/kernels/myproject $HOME/.local/share/jupyter/kernels/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Any users that run this last step should gain access to the kernel from jupyter. Though note, that only users that have write permissions to virtual environment will be able to install and remove modules from it.   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color: #e7f3fe; border-left: 6px solid #2196F3; padding: 10px; margin-bottom: 15px;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; When using custom kernels do not run &amp;lt;code&amp;gt;!pip&amp;lt;/code&amp;gt;, just run &amp;lt;code&amp;gt;pip&amp;lt;/code&amp;gt; without the &amp;lt;code&amp;gt;!&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[Environment Modules]]&lt;br /&gt;
* [[Installing Personal Software]]&lt;br /&gt;
* [[Jupyter]]&lt;br /&gt;
* [[R]]&lt;br /&gt;
* [[Apptainer]]&lt;br /&gt;
&lt;br /&gt;
== External links ==&lt;br /&gt;
&lt;br /&gt;
* [https://docs.python.org/3/library/venv.html Python venv documentation]&lt;br /&gt;
* [https://github.com/conda-forge/miniforge Miniforge]&lt;br /&gt;
* [https://conda-forge.org/ conda-forge]&lt;/div&gt;</summary>
		<author><name>Honfi001</name></author>
	</entry>
	<entry>
		<id>https://wiki.anunna.wur.nl/index.php?title=Python/Modules&amp;diff=3046</id>
		<title>Python/Modules</title>
		<link rel="alternate" type="text/html" href="https://wiki.anunna.wur.nl/index.php?title=Python/Modules&amp;diff=3046"/>
		<updated>2026-08-12T15:06:07Z</updated>

		<summary type="html">&lt;p&gt;Honfi001: /* Jupyter kernels */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Modules =&lt;br /&gt;
The Python Environment Modules are the only officially supported Python distributions in the HPC. These are compiled for each specific architecture of the HPC and hence are likely going to be more performant than the versions obtained via Mamba or UV. &lt;br /&gt;
&lt;br /&gt;
Anunna provides one Python version per [[Environment Modules | module bucket]], plus bundle modules that carry a curated set of common extensions. Load a bucket, then the Python module:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;2023&#039;&#039;&#039;: &amp;lt;code&amp;gt;Python/3.11.3&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;2024&#039;&#039;&#039;: &amp;lt;code&amp;gt;Python/3.12.3&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;2024&#039;&#039;&#039;: &amp;lt;code&amp;gt;Python/3.13.1&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
module load 2024&lt;br /&gt;
module load Python/3.12.3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The bundle module &amp;lt;code&amp;gt;Python-bundle-PyPI&amp;lt;/code&amp;gt; adds many frequently-used packages on top of the base interpreter. Use &amp;lt;code&amp;gt;module key &amp;lt;package&amp;gt;&amp;lt;/code&amp;gt; to find which bundle contains a package you need (see [[Environment Modules#Searching by keyword | searching modules by keyword]]).&lt;br /&gt;
&lt;br /&gt;
For packages not in a module, the two recommended routes are a &#039;&#039;&#039;virtual environment&#039;&#039;&#039; built on a Python module (below), or &#039;&#039;&#039;Miniforge&#039;&#039;&#039; for a self-contained conda/mamba setup. The use of Anaconda is discouraged on Anunna — its default channels carry licensing restrictions and the full distribution is heavy; Miniforge is the lighter, unrestricted alternative.&lt;br /&gt;
&lt;br /&gt;
== Virtual environments ==&lt;br /&gt;
&lt;br /&gt;
A virtual environment is a self-contained directory holding a specific Python and its packages, so one project&#039;s dependencies cannot clash with another&#039;s. Python&#039;s built-in &amp;lt;code&amp;gt;venv&amp;lt;/code&amp;gt; module is the simplest way to make one on top of a Python module.&lt;br /&gt;
&lt;br /&gt;
First load the Python version you want:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
module load 2024&lt;br /&gt;
module load Python/3.12.3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then create the environment in a location of your choosing. The example uses &amp;lt;code&amp;gt;$myNobackup/PythonEnv&amp;lt;/code&amp;gt; — &amp;lt;code&amp;gt;$myNobackup&amp;lt;/code&amp;gt; is your Lustre nobackup location, set in your &amp;lt;code&amp;gt;~/.bash_aliases&amp;lt;/code&amp;gt; (see [[Installing Personal Software#Aliases and local variables | Aliases and local variables]]). Keeping environments on Lustre rather than your home directory avoids filling your home quota, and the nobackup tier is the right choice because an environment can always be recreated from scratch and so does not need backing up.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python -m venv $myNobackup/PythonEnv/my_env&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Activate it whenever you want to use it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
source $myNobackup/PythonEnv/my_env/bin/activate&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once active, the environment name appears as a prefix in your prompt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
(my_env) user001@login200:~$&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Install packages with &amp;lt;code&amp;gt;pip&amp;lt;/code&amp;gt; while the environment is active; they go into the environment, not your home directory:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
pip install -U numpy pandas matplotlib&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Leave the environment with &amp;lt;code&amp;gt;deactivate&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Jupyter kernels ==&lt;br /&gt;
&lt;br /&gt;
Once your virtual environment has been setup, you can can access it in jupyter, either via the apps or the notebooks page by setting up a kernel. A kernel is nothing more than a json file with details for jupyter on where to find your Python environment. First things first,  with your Python modules loaded activate your virtual environment from the example before. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;source $myNobackup/PythonEnv/my_env/bin/activate&amp;lt;/syntaxhighlight&amp;gt;The install [https://pypi.org/project/ipykernel/ ipyKernel]&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;(my_env) user001@login200:~$ pip install -U ipykernel&amp;lt;/syntaxhighlight&amp;gt;This is the only dependency that Python needs for creating kernels, you can then run &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;(my_env) user001@login200:~$ python -m ipykernel install --user --name=myenv --display-name=&amp;quot;Python (myenv)&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;This command will create a folder labelled &amp;lt;code&amp;gt;myenv&amp;lt;/code&amp;gt;  containing a &amp;lt;code&amp;gt;kernel.json&amp;lt;/code&amp;gt; file inside of  &amp;lt;code&amp;gt;$HOME/.local/share/jupyter/kernels/&amp;lt;/code&amp;gt; , which jupyter watches. If your goal is just to create a kernel for yourself, then you are done. The kernel should be visible to you both inside of the jupyter instances, either the ones accessed via the [https://apps.anunna.wur.nl anuna apps portal] or the [https://notebook.anunna.wur.nl notebooks page].  Thus, the kernel will not be visible or accessible to other users. &lt;br /&gt;
&lt;br /&gt;
The --name=myenv flag is entirely optional, it is the directory in which the &amp;lt;code&amp;gt;kernel.json&amp;lt;/code&amp;gt; file is generated. If not used, python will simply label it &amp;lt;code&amp;gt;python3&amp;lt;/code&amp;gt; . The use of this flag is recommended, specially when working with multiple kernels to avoid overwriting previously created kernels. &lt;br /&gt;
&lt;br /&gt;
=== Shared Kernels ===&lt;br /&gt;
Whether for a course or collaboration, sometimes it is convenient to share a kernel with other users. This is possible and the procedure is a variation of the previous one, with just some additional requirements&lt;br /&gt;
&lt;br /&gt;
* The virtual environment you create needs to be in a shared location , e.g. /lutre/shared&lt;br /&gt;
* The virtual environment folder needs to be visiible and accessible to other users i.e. it must have read and execute permissions, 755 is recommended&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Like before load the  bucket and its corresponding Python version and create your project folder and go there&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;module load 2025&lt;br /&gt;
module load Python/3.13.1&lt;br /&gt;
mkdir /lustre/shared/MyProject&lt;br /&gt;
cd /lustre/shared/MyProject&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Then create your virtual environemnt, activate it and install [https://pypi.org/project/ipykernel/ ipyKernel]&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;python -m venv ./project_env&lt;br /&gt;
source /lustre/shared/MyProject/project_env/bin/activate&lt;br /&gt;
pip install -U ipykernel&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here is where things differ, inside the activate kernel run the command&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python -m ipykernel install --sys-prefix --name=myproject --display-name=&amp;quot;Python (project_env)&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Note that now the command uses the flag  --sys-prefix . This flag sets the installation path of the kernel &#039;&#039;&#039;inside&#039;&#039;&#039; the virtual environment&#039;s directory, in this case, the kernel.json file will be generate in  &amp;lt;code&amp;gt;/lustre/shared/MyProject/project_env/share/jupyter/kernels/myproject&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
While the kernel has been created, jupyter still will not be able to see it. In order to be able to see and access the kernel you would need to either copy it to your  folder&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
MYPROJ=/lustre/shared/MyProject&lt;br /&gt;
cp -r $MYPROJ/project_env/share/jupyter/kernels/myproject $HOME/.local/share/jupyter/kernels/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;or link it&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
MYPROJ=/lustre/shared/MyProject&lt;br /&gt;
ln -s $MYPROJ/project_env/share/jupyter/kernels/myproject $HOME/.local/share/jupyter/kernels/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Any users that run this last step should gain access to the kernel from jupyter. Though note, that only users that have write permissions to virtual environment will be able to install and remove modules from it.   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color: #e7f3fe; border-left: 6px solid #2196F3; padding: 10px; margin-bottom: 15px;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; When using custom kernels do not run &amp;lt;code&amp;gt;!pip&amp;lt;/code&amp;gt;, just run &amp;lt;code&amp;gt;pip&amp;lt;/code&amp;gt; without the &amp;lt;code&amp;gt;!&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[Environment Modules]]&lt;br /&gt;
* [[Installing Personal Software]]&lt;br /&gt;
* [[Jupyter]]&lt;br /&gt;
* [[R]]&lt;br /&gt;
* [[Apptainer]]&lt;br /&gt;
&lt;br /&gt;
== External links ==&lt;br /&gt;
&lt;br /&gt;
* [https://docs.python.org/3/library/venv.html Python venv documentation]&lt;br /&gt;
* [https://github.com/conda-forge/miniforge Miniforge]&lt;br /&gt;
* [https://conda-forge.org/ conda-forge]&lt;/div&gt;</summary>
		<author><name>Honfi001</name></author>
	</entry>
	<entry>
		<id>https://wiki.anunna.wur.nl/index.php?title=Python/Modules&amp;diff=3045</id>
		<title>Python/Modules</title>
		<link rel="alternate" type="text/html" href="https://wiki.anunna.wur.nl/index.php?title=Python/Modules&amp;diff=3045"/>
		<updated>2026-08-12T14:56:26Z</updated>

		<summary type="html">&lt;p&gt;Honfi001: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Modules =&lt;br /&gt;
The Python Environment Modules are the only officially supported Python distributions in the HPC. These are compiled for each specific architecture of the HPC and hence are likely going to be more performant than the versions obtained via Mamba or UV. &lt;br /&gt;
&lt;br /&gt;
Anunna provides one Python version per [[Environment Modules | module bucket]], plus bundle modules that carry a curated set of common extensions. Load a bucket, then the Python module:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;2023&#039;&#039;&#039;: &amp;lt;code&amp;gt;Python/3.11.3&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;2024&#039;&#039;&#039;: &amp;lt;code&amp;gt;Python/3.12.3&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;2024&#039;&#039;&#039;: &amp;lt;code&amp;gt;Python/3.13.1&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
module load 2024&lt;br /&gt;
module load Python/3.12.3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The bundle module &amp;lt;code&amp;gt;Python-bundle-PyPI&amp;lt;/code&amp;gt; adds many frequently-used packages on top of the base interpreter. Use &amp;lt;code&amp;gt;module key &amp;lt;package&amp;gt;&amp;lt;/code&amp;gt; to find which bundle contains a package you need (see [[Environment Modules#Searching by keyword | searching modules by keyword]]).&lt;br /&gt;
&lt;br /&gt;
For packages not in a module, the two recommended routes are a &#039;&#039;&#039;virtual environment&#039;&#039;&#039; built on a Python module (below), or &#039;&#039;&#039;Miniforge&#039;&#039;&#039; for a self-contained conda/mamba setup. The use of Anaconda is discouraged on Anunna — its default channels carry licensing restrictions and the full distribution is heavy; Miniforge is the lighter, unrestricted alternative.&lt;br /&gt;
&lt;br /&gt;
== Virtual environments ==&lt;br /&gt;
&lt;br /&gt;
A virtual environment is a self-contained directory holding a specific Python and its packages, so one project&#039;s dependencies cannot clash with another&#039;s. Python&#039;s built-in &amp;lt;code&amp;gt;venv&amp;lt;/code&amp;gt; module is the simplest way to make one on top of a Python module.&lt;br /&gt;
&lt;br /&gt;
First load the Python version you want:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
module load 2024&lt;br /&gt;
module load Python/3.12.3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then create the environment in a location of your choosing. The example uses &amp;lt;code&amp;gt;$myNobackup/PythonEnv&amp;lt;/code&amp;gt; — &amp;lt;code&amp;gt;$myNobackup&amp;lt;/code&amp;gt; is your Lustre nobackup location, set in your &amp;lt;code&amp;gt;~/.bash_aliases&amp;lt;/code&amp;gt; (see [[Installing Personal Software#Aliases and local variables | Aliases and local variables]]). Keeping environments on Lustre rather than your home directory avoids filling your home quota, and the nobackup tier is the right choice because an environment can always be recreated from scratch and so does not need backing up.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python -m venv $myNobackup/PythonEnv/my_env&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Activate it whenever you want to use it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
source $myNobackup/PythonEnv/my_env/bin/activate&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once active, the environment name appears as a prefix in your prompt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
(my_env) user001@login200:~$&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Install packages with &amp;lt;code&amp;gt;pip&amp;lt;/code&amp;gt; while the environment is active; they go into the environment, not your home directory:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
pip install -U numpy pandas matplotlib&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Leave the environment with &amp;lt;code&amp;gt;deactivate&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Jupyter kernels ==&lt;br /&gt;
&lt;br /&gt;
Once your virtual environment has been setup, you can can access it in jupyter, either via the apps or the notebooks page by setting up a kernel. A kernel is nothing more than a json file with details for jupyter on where to find your Python environment. First things first,  with your Python modules loaded activate your virtual environment from the example before. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;source $myNobackup/PythonEnv/my_env/bin/activate&amp;lt;/syntaxhighlight&amp;gt;The install [https://pypi.org/project/ipykernel/ ipyKernel]&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;(my_env) user001@login200:~$ pip install -U ipykernel&amp;lt;/syntaxhighlight&amp;gt;This is the only dependency that Python needs for creating kernels, you can then run &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;(my_env) user001@login200:~$ python -m ipykernel install --user --name=myenv --display-name=&amp;quot;Python (myenv)&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;This command will create a folder labelled &amp;lt;code&amp;gt;myenv&amp;lt;/code&amp;gt;  containing a &amp;lt;code&amp;gt;kernel.json&amp;lt;/code&amp;gt; file inside of  &amp;lt;code&amp;gt;$HOME/.local/share/jupyter/kernels/&amp;lt;/code&amp;gt; , which jupyter watches. If your goal is just to create a kernel for yourself, then you are done. The kernel should be visible to you both inside of the jupyter instances, either the ones accessed via the [https://apps.anunna.wur.nl anuna apps portal] or the [https://notebook.anunna.wur.nl notebooks page].  Thus, the kernel will not be visible or accessible to other users. &lt;br /&gt;
&lt;br /&gt;
The --name=myenv flag is entirely optional, it is the directory in which the &amp;lt;code&amp;gt;kernel.json&amp;lt;/code&amp;gt; file is generated. If not used, python will simply label it &amp;lt;code&amp;gt;python3&amp;lt;/code&amp;gt; . The use of this flag is recommended, specially when working with multiple kernels to avoid overwriting previously created kernels. &lt;br /&gt;
&lt;br /&gt;
=== Shared Kernels ===&lt;br /&gt;
Whether for a course or collaboration, sometimes it is convenient to share a kernel with other users. This is possible and the procedure is a variation of the previous one, with just some additional requirements&lt;br /&gt;
&lt;br /&gt;
* The virtual environment you create needs to be in a shared location , e.g. /lutre/shared&lt;br /&gt;
* The virtual environment folder needs to be visiible and accessible to other users i.e. it must have read and execute permissions, 755 is recommended&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Like before load the  bucket and its corresponding Python version and create your project folder and go there&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;module load 2025&lt;br /&gt;
module load Python/3.13.1&lt;br /&gt;
mkdir /lustre/shared/MyProject&lt;br /&gt;
cd /lustre/shared/MyProject&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Then create your virtual environemnt, activate it and install [https://pypi.org/project/ipykernel/ ipyKernel]&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;python -m venv ./project_env&lt;br /&gt;
source /lustre/shared/MyProject/project_env/bin/activate&lt;br /&gt;
pip install -U ipykernel&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here is where things differ, inside the activate kernel run the command&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python -m ipykernel install --sys-prefix --name=myproject --display-name=&amp;quot;Python (project_env)&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Note that now the command uses the flag  --sys-prefix . This flag sets the installation path of the kernel &#039;&#039;&#039;inside&#039;&#039;&#039; the virtual environment&#039;s directory, in this case, the kernel.json file will be generate in  &amp;lt;code&amp;gt;/lustre/shared/MyProject/project_env/share/jupyter/kernels/myproject&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
While the kernel has been created, jupyter still will not be able to see it. In order to be able to see and access the kernel you would need to either copy it to your  folder&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
MYPROJ=/lustre/shared/MyProject&lt;br /&gt;
cp -r $MYPROJ/project_env/share/jupyter/kernels/myproject $HOME/.local/share/jupyter/kernels/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;or link it&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
MYPROJ=/lustre/shared/MyProject&lt;br /&gt;
ln -s $MYPROJ/project_env/share/jupyter/kernels/myproject $HOME/.local/share/jupyter/kernels/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Any users that run this last step should gain access to the kernel from jupyter. Though note, that only users that have write permissions to the kernel file will be able to modify &lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[Environment Modules]]&lt;br /&gt;
* [[Installing Personal Software]]&lt;br /&gt;
* [[Jupyter]]&lt;br /&gt;
* [[R]]&lt;br /&gt;
* [[Apptainer]]&lt;br /&gt;
&lt;br /&gt;
== External links ==&lt;br /&gt;
&lt;br /&gt;
* [https://docs.python.org/3/library/venv.html Python venv documentation]&lt;br /&gt;
* [https://github.com/conda-forge/miniforge Miniforge]&lt;br /&gt;
* [https://conda-forge.org/ conda-forge]&lt;/div&gt;</summary>
		<author><name>Honfi001</name></author>
	</entry>
	<entry>
		<id>https://wiki.anunna.wur.nl/index.php?title=Python/Modules&amp;diff=3044</id>
		<title>Python/Modules</title>
		<link rel="alternate" type="text/html" href="https://wiki.anunna.wur.nl/index.php?title=Python/Modules&amp;diff=3044"/>
		<updated>2026-08-12T11:56:02Z</updated>

		<summary type="html">&lt;p&gt;Honfi001: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Modules =&lt;br /&gt;
The Python Environment Modules are the only officially supported Python distributions in the HPC. These are compiled for each specific architecture of the HPC and hence are likely going to be more performant than the versions obtained via Mamba or UV. &lt;br /&gt;
&lt;br /&gt;
Anunna provides one Python version per [[Environment Modules | module bucket]], plus bundle modules that carry a curated set of common extensions. Load a bucket, then the Python module:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;2023&#039;&#039;&#039;: &amp;lt;code&amp;gt;Python/3.11.3&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;2024&#039;&#039;&#039;: &amp;lt;code&amp;gt;Python/3.12.3&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;2024&#039;&#039;&#039;: &amp;lt;code&amp;gt;Python/3.13.1&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
module load 2024&lt;br /&gt;
module load Python/3.12.3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The bundle module &amp;lt;code&amp;gt;Python-bundle-PyPI&amp;lt;/code&amp;gt; adds many frequently-used packages on top of the base interpreter. Use &amp;lt;code&amp;gt;module key &amp;lt;package&amp;gt;&amp;lt;/code&amp;gt; to find which bundle contains a package you need (see [[Environment Modules#Searching by keyword | searching modules by keyword]]).&lt;br /&gt;
&lt;br /&gt;
For packages not in a module, the two recommended routes are a &#039;&#039;&#039;virtual environment&#039;&#039;&#039; built on a Python module (below), or &#039;&#039;&#039;Miniforge&#039;&#039;&#039; for a self-contained conda/mamba setup. The use of Anaconda is discouraged on Anunna — its default channels carry licensing restrictions and the full distribution is heavy; Miniforge is the lighter, unrestricted alternative.&lt;br /&gt;
&lt;br /&gt;
== Virtual environments ==&lt;br /&gt;
&lt;br /&gt;
A virtual environment is a self-contained directory holding a specific Python and its packages, so one project&#039;s dependencies cannot clash with another&#039;s. Python&#039;s built-in &amp;lt;code&amp;gt;venv&amp;lt;/code&amp;gt; module is the simplest way to make one on top of a Python module.&lt;br /&gt;
&lt;br /&gt;
First load the Python version you want:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
module load 2024&lt;br /&gt;
module load Python/3.12.3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then create the environment in a location of your choosing. The example uses &amp;lt;code&amp;gt;$myNobackup/PythonEnv&amp;lt;/code&amp;gt; — &amp;lt;code&amp;gt;$myNobackup&amp;lt;/code&amp;gt; is your Lustre nobackup location, set in your &amp;lt;code&amp;gt;~/.bash_aliases&amp;lt;/code&amp;gt; (see [[Installing Personal Software#Aliases and local variables | Aliases and local variables]]). Keeping environments on Lustre rather than your home directory avoids filling your home quota, and the nobackup tier is the right choice because an environment can always be recreated from scratch and so does not need backing up.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python -m venv $myNobackup/PythonEnv/my_env&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Activate it whenever you want to use it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
source $myNobackup/PythonEnv/my_env/bin/activate&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once active, the environment name appears as a prefix in your prompt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
(my_env) user001@login200:~$&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Install packages with &amp;lt;code&amp;gt;pip&amp;lt;/code&amp;gt; while the environment is active; they go into the environment, not your home directory:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
pip install -U numpy pandas matplotlib&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Leave the environment with &amp;lt;code&amp;gt;deactivate&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Miniforge (conda / mamba) ==&lt;br /&gt;
&lt;br /&gt;
[https://github.com/conda-forge/miniforge Miniforge] is a minimal installer that gives you the &amp;lt;code&amp;gt;conda&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;mamba&amp;lt;/code&amp;gt; package managers preconfigured to use the community [https://conda-forge.org/ conda-forge] channel. &amp;lt;code&amp;gt;mamba&amp;lt;/code&amp;gt; is a fast drop-in replacement for &amp;lt;code&amp;gt;conda&amp;lt;/code&amp;gt;. This is the recommended way to use conda-style environments on Anunna; it avoids Anaconda&#039;s licensing restrictions.&lt;br /&gt;
&lt;br /&gt;
Download and run the installer, pointing it at a location with room (your Lustre nobackup space, not your home directory):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
wget https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-Linux-x86_64.sh&lt;br /&gt;
bash Miniforge3-Linux-x86_64.sh -b -p $myNobackup/miniforge3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Do not run &amp;lt;code&amp;gt;conda init&amp;lt;/code&amp;gt;&#039;&#039;&#039; on Anunna — it writes startup code into your &amp;lt;code&amp;gt;~/.bashrc&amp;lt;/code&amp;gt; that runs on every login and can interfere with the module system. Instead, activate Miniforge only when you need it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
source $myNobackup/miniforge3/bin/activate&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then create and use environments with &amp;lt;code&amp;gt;mamba&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mamba create -n myenv python=3.12 numpy pandas&lt;br /&gt;
mamba activate myenv&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Jupyter kernels ==&lt;br /&gt;
&lt;br /&gt;
To use one of your environments inside [[Jupyter]], register it as a kernel.&lt;br /&gt;
&lt;br /&gt;
=== From a virtual environment ===&lt;br /&gt;
&lt;br /&gt;
A &amp;lt;code&amp;gt;venv&amp;lt;/code&amp;gt; kernel needs a wrapper script, because the kernel is launched without your normal shell environment and so cannot load modules by itself. First, with the environment active, install &amp;lt;code&amp;gt;ipykernel&amp;lt;/code&amp;gt; and generate the kernel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
module load 2024&lt;br /&gt;
module load Python/3.12.3&lt;br /&gt;
source $myNobackup/PythonEnv/my_env/bin/activate&lt;br /&gt;
pip install ipykernel&lt;br /&gt;
python -m ipykernel install --user --name=my_env_kernel&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The kernel is written to &amp;lt;code&amp;gt;~/.local/share/jupyter/kernels/&amp;lt;/code&amp;gt;, which Jupyter watches. On its own it will not work, because it cannot find the modules — so write a wrapper script that loads them. Save this as, for example, &amp;lt;code&amp;gt;$HOME/wrap.sh&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash -l&lt;br /&gt;
&lt;br /&gt;
module reset&lt;br /&gt;
module load 2024&lt;br /&gt;
module load Python/3.12.3&lt;br /&gt;
&lt;br /&gt;
exec $myNobackup/PythonEnv/my_env/bin/python -m ipykernel_launcher &amp;quot;$@&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;#!/bin/bash -l&amp;lt;/code&amp;gt; line starts a login shell, which loads Lmod and sources your &amp;lt;code&amp;gt;~/.bash_aliases&amp;lt;/code&amp;gt; (so &amp;lt;code&amp;gt;$myNobackup&amp;lt;/code&amp;gt; is defined). Make the wrapper executable with &amp;lt;code&amp;gt;chmod +x $HOME/wrap.sh&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Finally point the kernel at the wrapper by editing &amp;lt;code&amp;gt;~/.local/share/jupyter/kernels/my_env_kernel/kernel.json&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
 &amp;quot;argv&amp;quot;: [&lt;br /&gt;
  &amp;quot;/home/WUR/user001/wrap.sh&amp;quot;,&lt;br /&gt;
  &amp;quot;-f&amp;quot;,&lt;br /&gt;
  &amp;quot;{connection_file}&amp;quot;&lt;br /&gt;
 ],&lt;br /&gt;
 &amp;quot;display_name&amp;quot;: &amp;quot;Python my_env&amp;quot;,&lt;br /&gt;
 &amp;quot;language&amp;quot;: &amp;quot;python&amp;quot;,&lt;br /&gt;
 &amp;quot;metadata&amp;quot;: {&lt;br /&gt;
  &amp;quot;debugger&amp;quot;: true&lt;br /&gt;
 }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The only difference from a plain kernel file is that &amp;lt;code&amp;gt;argv&amp;lt;/code&amp;gt; points at the wrapper script instead of the Python executable directly.&lt;br /&gt;
&lt;br /&gt;
=== From a conda / mamba environment ===&lt;br /&gt;
&lt;br /&gt;
A conda or mamba environment is simpler, because the environment is self-contained. With Miniforge active and your environment created, install &amp;lt;code&amp;gt;ipykernel&amp;lt;/code&amp;gt; into it and register the kernel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mamba create -y -n kernel_test python=3 ipykernel&lt;br /&gt;
mamba activate kernel_test&lt;br /&gt;
python -m ipykernel install --user --name kernel_test&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To remove the kernel and environment again:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
jupyter kernelspec uninstall kernel_test&lt;br /&gt;
mamba deactivate&lt;br /&gt;
mamba remove -y -n kernel_test --all&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[Environment Modules]]&lt;br /&gt;
* [[Installing Personal Software]]&lt;br /&gt;
* [[Jupyter]]&lt;br /&gt;
* [[R]]&lt;br /&gt;
* [[Apptainer]]&lt;br /&gt;
&lt;br /&gt;
== External links ==&lt;br /&gt;
&lt;br /&gt;
* [https://docs.python.org/3/library/venv.html Python venv documentation]&lt;br /&gt;
* [https://github.com/conda-forge/miniforge Miniforge]&lt;br /&gt;
* [https://conda-forge.org/ conda-forge]&lt;/div&gt;</summary>
		<author><name>Honfi001</name></author>
	</entry>
	<entry>
		<id>https://wiki.anunna.wur.nl/index.php?title=Python/Modules&amp;diff=3043</id>
		<title>Python/Modules</title>
		<link rel="alternate" type="text/html" href="https://wiki.anunna.wur.nl/index.php?title=Python/Modules&amp;diff=3043"/>
		<updated>2026-08-12T11:52:28Z</updated>

		<summary type="html">&lt;p&gt;Honfi001: Created page with &amp;quot;= Modules =  Anunna provides one Python version per  module bucket, plus bundle modules that carry a curated set of common extensions. Load a bucket, then the Python module:  * &amp;#039;&amp;#039;&amp;#039;2023&amp;#039;&amp;#039;&amp;#039;: &amp;lt;code&amp;gt;Python/3.11.3&amp;lt;/code&amp;gt; * &amp;#039;&amp;#039;&amp;#039;2024&amp;#039;&amp;#039;&amp;#039;: &amp;lt;code&amp;gt;Python/3.12.3&amp;lt;/code&amp;gt; * &amp;#039;&amp;#039;&amp;#039;2024&amp;#039;&amp;#039;&amp;#039;: &amp;lt;code&amp;gt;Python/3.13.1&amp;lt;/code&amp;gt;   &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; module load 2024 module load Python/3.12.3 &amp;lt;/syntaxhighlight&amp;gt;  The bundle module &amp;lt;code&amp;gt;Python-bundle-PyPI&amp;lt;/code&amp;gt; adds ma...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Modules =&lt;br /&gt;
&lt;br /&gt;
Anunna provides one Python version per [[Environment Modules | module bucket]], plus bundle modules that carry a curated set of common extensions. Load a bucket, then the Python module:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;2023&#039;&#039;&#039;: &amp;lt;code&amp;gt;Python/3.11.3&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;2024&#039;&#039;&#039;: &amp;lt;code&amp;gt;Python/3.12.3&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;2024&#039;&#039;&#039;: &amp;lt;code&amp;gt;Python/3.13.1&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
module load 2024&lt;br /&gt;
module load Python/3.12.3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The bundle module &amp;lt;code&amp;gt;Python-bundle-PyPI&amp;lt;/code&amp;gt; adds many frequently-used packages on top of the base interpreter. Use &amp;lt;code&amp;gt;module key &amp;lt;package&amp;gt;&amp;lt;/code&amp;gt; to find which bundle contains a package you need (see [[Environment Modules#Searching by keyword | searching modules by keyword]]).&lt;br /&gt;
&lt;br /&gt;
For packages not in a module, the two recommended routes are a &#039;&#039;&#039;virtual environment&#039;&#039;&#039; built on a Python module (below), or &#039;&#039;&#039;Miniforge&#039;&#039;&#039; for a self-contained conda/mamba setup. The use of Anaconda is discouraged on Anunna — its default channels carry licensing restrictions and the full distribution is heavy; Miniforge is the lighter, unrestricted alternative.&lt;br /&gt;
&lt;br /&gt;
== Virtual environments ==&lt;br /&gt;
&lt;br /&gt;
A virtual environment is a self-contained directory holding a specific Python and its packages, so one project&#039;s dependencies cannot clash with another&#039;s. Python&#039;s built-in &amp;lt;code&amp;gt;venv&amp;lt;/code&amp;gt; module is the simplest way to make one on top of a Python module.&lt;br /&gt;
&lt;br /&gt;
First load the Python version you want:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
module load 2024&lt;br /&gt;
module load Python/3.12.3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then create the environment in a location of your choosing. The example uses &amp;lt;code&amp;gt;$myNobackup/PythonEnv&amp;lt;/code&amp;gt; — &amp;lt;code&amp;gt;$myNobackup&amp;lt;/code&amp;gt; is your Lustre nobackup location, set in your &amp;lt;code&amp;gt;~/.bash_aliases&amp;lt;/code&amp;gt; (see [[Installing Personal Software#Aliases and local variables | Aliases and local variables]]). Keeping environments on Lustre rather than your home directory avoids filling your home quota, and the nobackup tier is the right choice because an environment can always be recreated from scratch and so does not need backing up.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python -m venv $myNobackup/PythonEnv/my_env&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Activate it whenever you want to use it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
source $myNobackup/PythonEnv/my_env/bin/activate&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once active, the environment name appears as a prefix in your prompt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
(my_env) user001@login200:~$&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Install packages with &amp;lt;code&amp;gt;pip&amp;lt;/code&amp;gt; while the environment is active; they go into the environment, not your home directory:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
pip install -U numpy pandas matplotlib&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Leave the environment with &amp;lt;code&amp;gt;deactivate&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Miniforge (conda / mamba) ==&lt;br /&gt;
&lt;br /&gt;
[https://github.com/conda-forge/miniforge Miniforge] is a minimal installer that gives you the &amp;lt;code&amp;gt;conda&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;mamba&amp;lt;/code&amp;gt; package managers preconfigured to use the community [https://conda-forge.org/ conda-forge] channel. &amp;lt;code&amp;gt;mamba&amp;lt;/code&amp;gt; is a fast drop-in replacement for &amp;lt;code&amp;gt;conda&amp;lt;/code&amp;gt;. This is the recommended way to use conda-style environments on Anunna; it avoids Anaconda&#039;s licensing restrictions.&lt;br /&gt;
&lt;br /&gt;
Download and run the installer, pointing it at a location with room (your Lustre nobackup space, not your home directory):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
wget https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-Linux-x86_64.sh&lt;br /&gt;
bash Miniforge3-Linux-x86_64.sh -b -p $myNobackup/miniforge3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Do not run &amp;lt;code&amp;gt;conda init&amp;lt;/code&amp;gt;&#039;&#039;&#039; on Anunna — it writes startup code into your &amp;lt;code&amp;gt;~/.bashrc&amp;lt;/code&amp;gt; that runs on every login and can interfere with the module system. Instead, activate Miniforge only when you need it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
source $myNobackup/miniforge3/bin/activate&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then create and use environments with &amp;lt;code&amp;gt;mamba&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mamba create -n myenv python=3.12 numpy pandas&lt;br /&gt;
mamba activate myenv&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Jupyter kernels ==&lt;br /&gt;
&lt;br /&gt;
To use one of your environments inside [[Jupyter]], register it as a kernel.&lt;br /&gt;
&lt;br /&gt;
=== From a virtual environment ===&lt;br /&gt;
&lt;br /&gt;
A &amp;lt;code&amp;gt;venv&amp;lt;/code&amp;gt; kernel needs a wrapper script, because the kernel is launched without your normal shell environment and so cannot load modules by itself. First, with the environment active, install &amp;lt;code&amp;gt;ipykernel&amp;lt;/code&amp;gt; and generate the kernel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
module load 2024&lt;br /&gt;
module load Python/3.12.3&lt;br /&gt;
source $myNobackup/PythonEnv/my_env/bin/activate&lt;br /&gt;
pip install ipykernel&lt;br /&gt;
python -m ipykernel install --user --name=my_env_kernel&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The kernel is written to &amp;lt;code&amp;gt;~/.local/share/jupyter/kernels/&amp;lt;/code&amp;gt;, which Jupyter watches. On its own it will not work, because it cannot find the modules — so write a wrapper script that loads them. Save this as, for example, &amp;lt;code&amp;gt;$HOME/wrap.sh&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash -l&lt;br /&gt;
&lt;br /&gt;
module reset&lt;br /&gt;
module load 2024&lt;br /&gt;
module load Python/3.12.3&lt;br /&gt;
&lt;br /&gt;
exec $myNobackup/PythonEnv/my_env/bin/python -m ipykernel_launcher &amp;quot;$@&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;#!/bin/bash -l&amp;lt;/code&amp;gt; line starts a login shell, which loads Lmod and sources your &amp;lt;code&amp;gt;~/.bash_aliases&amp;lt;/code&amp;gt; (so &amp;lt;code&amp;gt;$myNobackup&amp;lt;/code&amp;gt; is defined). Make the wrapper executable with &amp;lt;code&amp;gt;chmod +x $HOME/wrap.sh&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Finally point the kernel at the wrapper by editing &amp;lt;code&amp;gt;~/.local/share/jupyter/kernels/my_env_kernel/kernel.json&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
 &amp;quot;argv&amp;quot;: [&lt;br /&gt;
  &amp;quot;/home/WUR/user001/wrap.sh&amp;quot;,&lt;br /&gt;
  &amp;quot;-f&amp;quot;,&lt;br /&gt;
  &amp;quot;{connection_file}&amp;quot;&lt;br /&gt;
 ],&lt;br /&gt;
 &amp;quot;display_name&amp;quot;: &amp;quot;Python my_env&amp;quot;,&lt;br /&gt;
 &amp;quot;language&amp;quot;: &amp;quot;python&amp;quot;,&lt;br /&gt;
 &amp;quot;metadata&amp;quot;: {&lt;br /&gt;
  &amp;quot;debugger&amp;quot;: true&lt;br /&gt;
 }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The only difference from a plain kernel file is that &amp;lt;code&amp;gt;argv&amp;lt;/code&amp;gt; points at the wrapper script instead of the Python executable directly.&lt;br /&gt;
&lt;br /&gt;
=== From a conda / mamba environment ===&lt;br /&gt;
&lt;br /&gt;
A conda or mamba environment is simpler, because the environment is self-contained. With Miniforge active and your environment created, install &amp;lt;code&amp;gt;ipykernel&amp;lt;/code&amp;gt; into it and register the kernel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mamba create -y -n kernel_test python=3 ipykernel&lt;br /&gt;
mamba activate kernel_test&lt;br /&gt;
python -m ipykernel install --user --name kernel_test&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To remove the kernel and environment again:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
jupyter kernelspec uninstall kernel_test&lt;br /&gt;
mamba deactivate&lt;br /&gt;
mamba remove -y -n kernel_test --all&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[Environment Modules]]&lt;br /&gt;
* [[Installing Personal Software]]&lt;br /&gt;
* [[Jupyter]]&lt;br /&gt;
* [[R]]&lt;br /&gt;
* [[Apptainer]]&lt;br /&gt;
&lt;br /&gt;
== External links ==&lt;br /&gt;
&lt;br /&gt;
* [https://docs.python.org/3/library/venv.html Python venv documentation]&lt;br /&gt;
* [https://github.com/conda-forge/miniforge Miniforge]&lt;br /&gt;
* [https://conda-forge.org/ conda-forge]&lt;/div&gt;</summary>
		<author><name>Honfi001</name></author>
	</entry>
	<entry>
		<id>https://wiki.anunna.wur.nl/index.php?title=Python&amp;diff=3042</id>
		<title>Python</title>
		<link rel="alternate" type="text/html" href="https://wiki.anunna.wur.nl/index.php?title=Python&amp;diff=3042"/>
		<updated>2026-08-12T11:51:11Z</updated>

		<summary type="html">&lt;p&gt;Honfi001: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Python is a high-level, interpreted programming language popular in scientific computing for its readability and its enormous ecosystem of third-party libraries — NumPy, Pandas, scikit-learn, PyTorch, TensorFlow, and many more. This page describes how to use Python on Anunna: the provided modules, how to manage your own packages with virtual environments or Miniforge, and how to expose an environment as a Jupyter kernel.&lt;br /&gt;
&lt;br /&gt;
== Modules ==&lt;br /&gt;
&lt;br /&gt;
Anunna provides one Python version per [[Environment Modules | module bucket]], plus bundle modules that carry a curated set of common extensions. Load a bucket, then the Python module:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;2023&#039;&#039;&#039;: &amp;lt;code&amp;gt;Python/3.11.3&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;2024&#039;&#039;&#039;: &amp;lt;code&amp;gt;Python/3.12.3&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;2024&#039;&#039;&#039;: &amp;lt;code&amp;gt;Python/3.13.1&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
module load 2024&lt;br /&gt;
module load Python/3.12.3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The bundle module &amp;lt;code&amp;gt;Python-bundle-PyPI&amp;lt;/code&amp;gt; adds many frequently-used packages on top of the base interpreter. Use &amp;lt;code&amp;gt;module key &amp;lt;package&amp;gt;&amp;lt;/code&amp;gt; to find which bundle contains a package you need (see [[Environment Modules#Searching by keyword | searching modules by keyword]]).&lt;br /&gt;
&lt;br /&gt;
For packages not in a module, the two recommended routes are a &#039;&#039;&#039;virtual environment&#039;&#039;&#039; built on a Python module (below), or &#039;&#039;&#039;Miniforge&#039;&#039;&#039; for a self-contained conda/mamba setup. The use of Anaconda is discouraged on Anunna — its default channels carry licensing restrictions and the full distribution is heavy; Miniforge is the lighter, unrestricted alternative.&lt;br /&gt;
&lt;br /&gt;
== Virtual environments ==&lt;br /&gt;
&lt;br /&gt;
A virtual environment is a self-contained directory holding a specific Python and its packages, so one project&#039;s dependencies cannot clash with another&#039;s. Python&#039;s built-in &amp;lt;code&amp;gt;venv&amp;lt;/code&amp;gt; module is the simplest way to make one on top of a Python module.&lt;br /&gt;
&lt;br /&gt;
First load the Python version you want:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
module load 2024&lt;br /&gt;
module load Python/3.12.3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then create the environment in a location of your choosing. The example uses &amp;lt;code&amp;gt;$myNobackup/PythonEnv&amp;lt;/code&amp;gt; — &amp;lt;code&amp;gt;$myNobackup&amp;lt;/code&amp;gt; is your Lustre nobackup location, set in your &amp;lt;code&amp;gt;~/.bash_aliases&amp;lt;/code&amp;gt; (see [[Installing Personal Software#Aliases and local variables | Aliases and local variables]]). Keeping environments on Lustre rather than your home directory avoids filling your home quota, and the nobackup tier is the right choice because an environment can always be recreated from scratch and so does not need backing up.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python -m venv $myNobackup/PythonEnv/my_env&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Activate it whenever you want to use it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
source $myNobackup/PythonEnv/my_env/bin/activate&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once active, the environment name appears as a prefix in your prompt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
(my_env) user001@login200:~$&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Install packages with &amp;lt;code&amp;gt;pip&amp;lt;/code&amp;gt; while the environment is active; they go into the environment, not your home directory:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
pip install -U numpy pandas matplotlib&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Leave the environment with &amp;lt;code&amp;gt;deactivate&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Miniforge (conda / mamba) ==&lt;br /&gt;
&lt;br /&gt;
[https://github.com/conda-forge/miniforge Miniforge] is a minimal installer that gives you the &amp;lt;code&amp;gt;conda&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;mamba&amp;lt;/code&amp;gt; package managers preconfigured to use the community [https://conda-forge.org/ conda-forge] channel. &amp;lt;code&amp;gt;mamba&amp;lt;/code&amp;gt; is a fast drop-in replacement for &amp;lt;code&amp;gt;conda&amp;lt;/code&amp;gt;. This is the recommended way to use conda-style environments on Anunna; it avoids Anaconda&#039;s licensing restrictions.&lt;br /&gt;
&lt;br /&gt;
Download and run the installer, pointing it at a location with room (your Lustre nobackup space, not your home directory):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
wget https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-Linux-x86_64.sh&lt;br /&gt;
bash Miniforge3-Linux-x86_64.sh -b -p $myNobackup/miniforge3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Do not run &amp;lt;code&amp;gt;conda init&amp;lt;/code&amp;gt;&#039;&#039;&#039; on Anunna — it writes startup code into your &amp;lt;code&amp;gt;~/.bashrc&amp;lt;/code&amp;gt; that runs on every login and can interfere with the module system. Instead, activate Miniforge only when you need it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
source $myNobackup/miniforge3/bin/activate&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then create and use environments with &amp;lt;code&amp;gt;mamba&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mamba create -n myenv python=3.12 numpy pandas&lt;br /&gt;
mamba activate myenv&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Jupyter kernels ==&lt;br /&gt;
&lt;br /&gt;
To use one of your environments inside [[Jupyter]], register it as a kernel.&lt;br /&gt;
&lt;br /&gt;
=== From a virtual environment ===&lt;br /&gt;
&lt;br /&gt;
A &amp;lt;code&amp;gt;venv&amp;lt;/code&amp;gt; kernel needs a wrapper script, because the kernel is launched without your normal shell environment and so cannot load modules by itself. First, with the environment active, install &amp;lt;code&amp;gt;ipykernel&amp;lt;/code&amp;gt; and generate the kernel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
module load 2024&lt;br /&gt;
module load Python/3.12.3&lt;br /&gt;
source $myNobackup/PythonEnv/my_env/bin/activate&lt;br /&gt;
pip install ipykernel&lt;br /&gt;
python -m ipykernel install --user --name=my_env_kernel&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The kernel is written to &amp;lt;code&amp;gt;~/.local/share/jupyter/kernels/&amp;lt;/code&amp;gt;, which Jupyter watches. On its own it will not work, because it cannot find the modules — so write a wrapper script that loads them. Save this as, for example, &amp;lt;code&amp;gt;$HOME/wrap.sh&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash -l&lt;br /&gt;
&lt;br /&gt;
module reset&lt;br /&gt;
module load 2024&lt;br /&gt;
module load Python/3.12.3&lt;br /&gt;
&lt;br /&gt;
exec $myNobackup/PythonEnv/my_env/bin/python -m ipykernel_launcher &amp;quot;$@&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;#!/bin/bash -l&amp;lt;/code&amp;gt; line starts a login shell, which loads Lmod and sources your &amp;lt;code&amp;gt;~/.bash_aliases&amp;lt;/code&amp;gt; (so &amp;lt;code&amp;gt;$myNobackup&amp;lt;/code&amp;gt; is defined). Make the wrapper executable with &amp;lt;code&amp;gt;chmod +x $HOME/wrap.sh&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Finally point the kernel at the wrapper by editing &amp;lt;code&amp;gt;~/.local/share/jupyter/kernels/my_env_kernel/kernel.json&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
 &amp;quot;argv&amp;quot;: [&lt;br /&gt;
  &amp;quot;/home/WUR/user001/wrap.sh&amp;quot;,&lt;br /&gt;
  &amp;quot;-f&amp;quot;,&lt;br /&gt;
  &amp;quot;{connection_file}&amp;quot;&lt;br /&gt;
 ],&lt;br /&gt;
 &amp;quot;display_name&amp;quot;: &amp;quot;Python my_env&amp;quot;,&lt;br /&gt;
 &amp;quot;language&amp;quot;: &amp;quot;python&amp;quot;,&lt;br /&gt;
 &amp;quot;metadata&amp;quot;: {&lt;br /&gt;
  &amp;quot;debugger&amp;quot;: true&lt;br /&gt;
 }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The only difference from a plain kernel file is that &amp;lt;code&amp;gt;argv&amp;lt;/code&amp;gt; points at the wrapper script instead of the Python executable directly.&lt;br /&gt;
&lt;br /&gt;
=== From a conda / mamba environment ===&lt;br /&gt;
&lt;br /&gt;
A conda or mamba environment is simpler, because the environment is self-contained. With Miniforge active and your environment created, install &amp;lt;code&amp;gt;ipykernel&amp;lt;/code&amp;gt; into it and register the kernel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mamba create -y -n kernel_test python=3 ipykernel&lt;br /&gt;
mamba activate kernel_test&lt;br /&gt;
python -m ipykernel install --user --name kernel_test&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To remove the kernel and environment again:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
jupyter kernelspec uninstall kernel_test&lt;br /&gt;
mamba deactivate&lt;br /&gt;
mamba remove -y -n kernel_test --all&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[Environment Modules]]&lt;br /&gt;
* [[Installing Personal Software]]&lt;br /&gt;
* [[Jupyter]]&lt;br /&gt;
* [[R]]&lt;br /&gt;
* [[Apptainer]]&lt;br /&gt;
&lt;br /&gt;
== External links ==&lt;br /&gt;
&lt;br /&gt;
* [https://docs.python.org/3/library/venv.html Python venv documentation]&lt;br /&gt;
* [https://github.com/conda-forge/miniforge Miniforge]&lt;br /&gt;
* [https://conda-forge.org/ conda-forge]&lt;/div&gt;</summary>
		<author><name>Honfi001</name></author>
	</entry>
	<entry>
		<id>https://wiki.anunna.wur.nl/index.php?title=For_PIs&amp;diff=3041</id>
		<title>For PIs</title>
		<link rel="alternate" type="text/html" href="https://wiki.anunna.wur.nl/index.php?title=For_PIs&amp;diff=3041"/>
		<updated>2026-08-12T07:29:38Z</updated>

		<summary type="html">&lt;p&gt;Honfi001: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Information for group leaders, PIs, and teachers running projects and courses on Anunna.&lt;br /&gt;
&lt;br /&gt;
== In this section ==&lt;br /&gt;
&lt;br /&gt;
* [[Dos and Don&#039;ts]] — good and bad practice at a glance&lt;br /&gt;
* [[Project Creation]] — setting up a project / billing account&lt;br /&gt;
* [[Managing Group Members]] — working with groups&lt;br /&gt;
* [[Storage Requests]] — requesting more storage&lt;br /&gt;
* [[Resource Allocation Requests]] — requesting larger or dedicated allocations&lt;br /&gt;
* [[External Collaborator Access]] — giving access to collaborators outside WUR&lt;br /&gt;
* [[Reporting Usage]] — tracking your group&#039;s usage and costs&lt;br /&gt;
* [[Grant Support Documentation]] — facility descriptions and support for funding applications&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Steps for courses]] — running a course on Anunna&lt;/div&gt;</summary>
		<author><name>Honfi001</name></author>
	</entry>
	<entry>
		<id>https://wiki.anunna.wur.nl/index.php?title=Julia&amp;diff=3040</id>
		<title>Julia</title>
		<link rel="alternate" type="text/html" href="https://wiki.anunna.wur.nl/index.php?title=Julia&amp;diff=3040"/>
		<updated>2026-08-11T12:51:17Z</updated>

		<summary type="html">&lt;p&gt;Honfi001: Add table with Julia versions for every bucket&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[https://julialang.org/ Julia] is a high-level, high-performance language for technical computing. This page covers using Julia on Anunna.&lt;br /&gt;
&lt;br /&gt;
== Loading Julia ==&lt;br /&gt;
&lt;br /&gt;
Julia is provided through the module system. Load a [[Environment Modules|bucket]] first, then Julia:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
module load 2024&lt;br /&gt;
module load Julia/1.11.6&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To see which versions are available, use &amp;lt;code&amp;gt;module key Julia&amp;lt;/code&amp;gt; (see [[Environment Modules]]).&lt;br /&gt;
&lt;br /&gt;
There is at least one version of Julia installed in each bucket:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Bucket&lt;br /&gt;
!Julia Version&lt;br /&gt;
|-&lt;br /&gt;
|2023&lt;br /&gt;
|1.11.3&lt;br /&gt;
|-&lt;br /&gt;
|2024&lt;br /&gt;
|1.11.6&lt;br /&gt;
|-&lt;br /&gt;
|2025&lt;br /&gt;
|1.12.3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Packages ==&lt;br /&gt;
&lt;br /&gt;
Julia manages its own packages with the built-in package manager (&amp;lt;code&amp;gt;Pkg&amp;lt;/code&amp;gt;). By default packages install into your home directory under &amp;lt;code&amp;gt;~/.julia&amp;lt;/code&amp;gt;. Because [[Home Directory|home]] is small and not meant for heavy I/O, point Julia&#039;s depot at a larger [[Compute Storage|Lustre]] location by setting &amp;lt;code&amp;gt;JULIA_DEPOT_PATH&amp;lt;/code&amp;gt; before starting Julia:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
export JULIA_DEPOT_PATH=/lustre/nobackup/&amp;lt;group&amp;gt;/&amp;lt;user&amp;gt;/julia_depot&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then add packages from the Julia REPL:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;julia&amp;quot;&amp;gt;&lt;br /&gt;
import Pkg&lt;br /&gt;
Pkg.add(&amp;quot;DataFrames&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Running Julia in a job ==&lt;br /&gt;
&lt;br /&gt;
Run Julia scripts as batch jobs through the scheduler — see [[Batch Jobs]]. For interactive work, start an [[Interactive Jobs|interactive job]] first.&lt;br /&gt;
&lt;br /&gt;
To use multiple cores, start Julia with the &amp;lt;code&amp;gt;-t&amp;lt;/code&amp;gt; (threads) option, or use Julia&#039;s distributed/parallel facilities — see [[Performance Optimization/Multiple CPUs]]:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
julia -t $SLURM_CPUS_PER_TASK myscript.jl&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Software Overview]]&lt;br /&gt;
* [[Environment Modules]]&lt;br /&gt;
* [[Jupyter]]&lt;br /&gt;
* [[Installing Personal Software]]&lt;/div&gt;</summary>
		<author><name>Honfi001</name></author>
	</entry>
	<entry>
		<id>https://wiki.anunna.wur.nl/index.php?title=Software&amp;diff=3039</id>
		<title>Software</title>
		<link rel="alternate" type="text/html" href="https://wiki.anunna.wur.nl/index.php?title=Software&amp;diff=3039"/>
		<updated>2026-08-11T12:18:03Z</updated>

		<summary type="html">&lt;p&gt;Honfi001: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The software available on Anunna and how to use, install, and manage it.&lt;br /&gt;
&lt;br /&gt;
== Organization ==&lt;br /&gt;
&lt;br /&gt;
* [[Software Overview]] — the software landscape&lt;br /&gt;
* [[Environment Modules]] — loading software with modules and buckets&lt;br /&gt;
* [[Installing Personal Software]] — installing into your own space&lt;br /&gt;
* [[Licensed Software]] — software that needs a licence&lt;br /&gt;
&lt;br /&gt;
== Scripting Languanges ==&lt;br /&gt;
* [[Python]] &lt;br /&gt;
* [[R]] &lt;br /&gt;
* [[Julia]] &lt;br /&gt;
&lt;br /&gt;
== Containers ==&lt;br /&gt;
* [[Apptainer]] — containers&lt;br /&gt;
&lt;br /&gt;
== MPI Implemenations ==&lt;br /&gt;
* [[OpenMPI]]&lt;br /&gt;
* [[IntelMPI]]&lt;/div&gt;</summary>
		<author><name>Honfi001</name></author>
	</entry>
	<entry>
		<id>https://wiki.anunna.wur.nl/index.php?title=OpenMPI&amp;diff=3038</id>
		<title>OpenMPI</title>
		<link rel="alternate" type="text/html" href="https://wiki.anunna.wur.nl/index.php?title=OpenMPI&amp;diff=3038"/>
		<updated>2026-08-06T14:55:29Z</updated>

		<summary type="html">&lt;p&gt;Honfi001: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;OpenMPI&#039;&#039;&#039; is the MPI library Anunna is built around. MPI — the Message Passing Interface — is how a single program runs as many cooperating processes at once, each with its own private memory, passing messages between themselves as the calculation proceeds. It is what lets one job use more than one node.&lt;br /&gt;
&lt;br /&gt;
This page is the practical side: which OpenMPI modules exist here, how to launch a job on one node and across several, and how to choose the network transport, which on Anunna needs saying out loud. If you are still deciding whether MPI is the right shape for your work at all, start at [[Workflows/Multi-Process|Multi-Process Workflows]] — that page covers when to use MPI and when a [[Workflows/Embarassinly-Parallel|job array]] or [[Workflows/Multi-threaded|threads]] would serve you better. For a worked example you can run yourself, see [[Tutorials/Parallelism-Estimating-Pi|Parallelism: Estimating π]].&lt;br /&gt;
&lt;br /&gt;
One thing to be clear about before anything else: &#039;&#039;&#039;MPI has to be built into the program.&#039;&#039;&#039; You cannot add it from a job script. If your software&#039;s documentation never mentions MPI or ranks, this page is not the one you need.&lt;br /&gt;
&lt;br /&gt;
== What is available on Anunna ==&lt;br /&gt;
&lt;br /&gt;
Software here is built with [https://easybuild.io EasyBuild] and grouped into [[Environment Modules|buckets]]. A bucket has to be loaded before you can &#039;&#039;load&#039;&#039; anything from it — and before &amp;lt;code&amp;gt;module avail&amp;lt;/code&amp;gt; will list its contents. Each bucket corresponds to an EasyBuild toolchain generation:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Bucket !! Toolchain !! OpenMPI !! Compiler&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;2023&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;foss/2023a&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;gompi/2023a&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;OpenMPI/4.1.5&amp;lt;/code&amp;gt; || GCC 12.3.0&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;2024&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;foss/2024a&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;gompi/2024a&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;OpenMPI/5.0.3&amp;lt;/code&amp;gt; || GCC 13.3.0&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;2025&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;foss/2025a&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;gompi/2025a&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;OpenMPI/5.0.7&amp;lt;/code&amp;gt; || GCC 14.2.0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Three ways in, and they differ only in how much they bring with them:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;foss&amp;lt;/code&amp;gt;&#039;&#039;&#039; — the full toolchain: GCC, OpenMPI, OpenBLAS, FFTW and ScaLAPACK. Load this if your program wants linear algebra or FFTs as well as MPI.&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;gompi&amp;lt;/code&amp;gt;&#039;&#039;&#039; — GCC and OpenMPI, nothing else. The lean choice when MPI is all you need.&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;OpenMPI/&amp;lt;version&amp;gt;&amp;lt;/code&amp;gt;&#039;&#039;&#039; — the library on its own, with its compiler underneath.&lt;br /&gt;
&lt;br /&gt;
You can list them yourself with &amp;lt;code&amp;gt;module key&amp;lt;/code&amp;gt;, which searches module descriptions as well as names. It reads Lmod&#039;s cache rather than your current environment, so — unlike &amp;lt;code&amp;gt;module avail&amp;lt;/code&amp;gt; — it needs &#039;&#039;&#039;no&#039;&#039;&#039; bucket loaded and reports matches from every bucket at once:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
module key OpenMPI        # no bucket needed; searches across all of them&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
That is the quickest way to see which OpenMPI versions exist and which toolchains carry them. Once you have picked one, &#039;&#039;then&#039;&#039; load its bucket and the module.&lt;br /&gt;
&lt;br /&gt;
=== Loading it ===&lt;br /&gt;
&lt;br /&gt;
Two steps, always in this order: &#039;&#039;&#039;the bucket, then the module.&#039;&#039;&#039; Nothing from a bucket can be loaded until the bucket itself is.&lt;br /&gt;
&lt;br /&gt;
To get the full toolchain from the 2024 bucket:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;module load 2024&lt;br /&gt;
module load 2024 OpenMPI/5.0.3    # OpenMPI alone&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The short version number is enough — you do &#039;&#039;&#039;not&#039;&#039;&#039; need to type the compiler suffix. &amp;lt;code&amp;gt;OpenMPI/5.0.3&amp;lt;/code&amp;gt; resolves to &amp;lt;code&amp;gt;OpenMPI/5.0.3-GCC-13.3.0&amp;lt;/code&amp;gt;, which is the full name &amp;lt;code&amp;gt;module list&amp;lt;/code&amp;gt; will show you afterwards. If you want to see everything a bucket offers, &amp;lt;code&amp;gt;module avail OpenMPI&amp;lt;/code&amp;gt; lists it once that bucket is loaded.&lt;br /&gt;
&lt;br /&gt;
Alternatively, swap the second line for modules that bundle OpenMPI with other additional modules:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;module load 2024 gompi/2024a      # GCC + OpenMPI, no maths libraries&lt;br /&gt;
module load foss/2024a            # GCC + OpenMPI + maths libraries&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Check what you actually got.&#039;&#039;&#039; Two commands, both worth the habit&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
module list        # everything now loaded, including pulled-in dependencies&lt;br /&gt;
mpirun --version   # confirms which OpenMPI is on your PATH&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Which one to load ===&lt;br /&gt;
&lt;br /&gt;
The rule that saves the most time: &#039;&#039;&#039;load the same MPI the program was built against.&#039;&#039;&#039; Building with one MPI and running under another produces failures that look like almost anything except the mismatch causing them — hangs, garbled output, crashes inside library calls.&lt;br /&gt;
&lt;br /&gt;
In practice that means:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Running software from the module system?&#039;&#039;&#039; Load &#039;&#039;&#039;its&#039;&#039;&#039; module and let it pull in the matching MPI as a dependency. You never have to choose, and you cannot get it wrong.&lt;br /&gt;
* &#039;&#039;&#039;Running something you built yourself?&#039;&#039;&#039; Load the same toolchain you built it with.&lt;br /&gt;
* &#039;&#039;&#039;Building it yourself?&#039;&#039;&#039; Use the compiler wrappers the MPI module provides — &amp;lt;code&amp;gt;mpicc&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;mpicxx&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;mpifort&amp;lt;/code&amp;gt; — which call your ordinary compiler with the MPI headers and libraries already in place.&lt;br /&gt;
&lt;br /&gt;
If none of those settles it, prefer the newest bucket your software is available in: the OpenMPI it carries is the one that has had the most attention here.&lt;br /&gt;
&lt;br /&gt;
== Recommended Environment ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
export OMPI_MCA_pml=cm&lt;br /&gt;
export OMPI_MCA_mtl=ofi&lt;br /&gt;
export FI_PROVIDER=psm2&lt;br /&gt;
export OMPI_MCA_btl=self,sm #substitute sm with vader for v4&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Running on a single node ==&lt;br /&gt;
&lt;br /&gt;
Remember that nothing should run on the login nodes — they are shared, and are for editing, submitting and light housekeeping only. Describe the job in a script, keep the data on Lustre under &amp;lt;code&amp;gt;$myScratch&amp;lt;/code&amp;gt;, and hand it to &amp;lt;code&amp;gt;sbatch&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;#!/bin/bash&lt;br /&gt;
#SBATCH --job-name=mpi_single&lt;br /&gt;
#SBATCH --nodes=1&lt;br /&gt;
#SBATCH --ntasks=64             # 64 ranks, all on one machine&lt;br /&gt;
#SBATCH --cpus-per-task=1&lt;br /&gt;
#SBATCH --mem-per-cpu=2G        # per CORE, not per node&lt;br /&gt;
#SBATCH --time=01:00:00&lt;br /&gt;
#SBATCH --output=%x-%j.out&lt;br /&gt;
&lt;br /&gt;
cd &amp;quot;$myScratch/my_simulation&amp;quot;&lt;br /&gt;
&lt;br /&gt;
module load 2024 foss/2024a&lt;br /&gt;
&lt;br /&gt;
export OMPI_MCA_pml=cm&lt;br /&gt;
export OMPI_MCA_mtl=ofi&lt;br /&gt;
export FI_PROVIDER=psm2&lt;br /&gt;
export OMPI_MCA_btl=self,sm&lt;br /&gt;
&lt;br /&gt;
mpirun -np ${SLURM_NTASKS} ./my_mpi_program&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Two habits in there are worth keeping:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;-np ${SLURM_NTASKS}&amp;lt;/code&amp;gt;, never a hard-coded number.&#039;&#039;&#039; Slurm exports the task count it granted; passing that through means the request and the run cannot drift apart when you change one of them.&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;--mem-per-cpu&amp;lt;/code&amp;gt;, not &amp;lt;code&amp;gt;--mem&amp;lt;/code&amp;gt;.&#039;&#039;&#039; &amp;lt;code&amp;gt;--mem&amp;lt;/code&amp;gt; is a &#039;&#039;per-node&#039;&#039; request shared out among all ranks on that node — at 64 or 128 ranks each one ends up with a few megabytes, less than an MPI process needs simply to start, and the job dies of an out-of-memory kill that points nowhere near the flag responsible.&lt;br /&gt;
&lt;br /&gt;
On one node OpenMPI talks to itself through shared memory. There is nothing to configure and no network involved, which is why this case is simple and the next one is not.&lt;br /&gt;
&lt;br /&gt;
== Running across several nodes ==&lt;br /&gt;
&lt;br /&gt;
The moment a job spans two nodes, the ranks have to talk over the network — and on Anunna that path needs to be chosen explicitly.&lt;br /&gt;
&lt;br /&gt;
Anunna&#039;s fabric is &#039;&#039;&#039;Omni-Path (OPA100)&#039;&#039;&#039;, and inter-node MPI rides it through &#039;&#039;&#039;libfabric&#039;&#039;&#039;. libfabric offers more than one &#039;&#039;provider&#039;&#039; for this hardware, and on our cluster they are not equally healthy:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Provider !! Status on Anunna !! Use it?&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;psm2&amp;lt;/code&amp;gt; || Validated at line rate (~97 Gbps), on both Intel and AMD nodes, under all three toolchains || &#039;&#039;&#039;Yes — this is the one&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;opx&amp;lt;/code&amp;gt; || Not currently operational || Not yet&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Because TCP can be picked up automatically, &#039;&#039;&#039;an inter-node MPI job should explicitly ask for &amp;lt;code&amp;gt;psm2&amp;lt;/code&amp;gt;&#039;&#039;&#039;  rather than trusting the default:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mpirun --mca pml cm --mca mtl ofi --mca mtl_ofi_provider_include psm2 \&lt;br /&gt;
       -x FI_PROVIDER=psm2 \&lt;br /&gt;
       -np ${SLURM_NTASKS} ./my_mpi_program --input data.nc&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A complete multi-node job script:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#SBATCH --job-name=mpi_multi&lt;br /&gt;
#SBATCH --nodes=4&lt;br /&gt;
#SBATCH --ntasks-per-node=64    # 256 ranks in total&lt;br /&gt;
#SBATCH --cpus-per-task=1&lt;br /&gt;
#SBATCH --mem-per-cpu=2G&lt;br /&gt;
#SBATCH --time=02:00:00&lt;br /&gt;
#SBATCH --output=%x-%j.out&lt;br /&gt;
&lt;br /&gt;
cd &amp;quot;$myScratch/my_simulation&amp;quot;&lt;br /&gt;
&lt;br /&gt;
module load 2024 foss/2024a&lt;br /&gt;
&lt;br /&gt;
mpirun --mca pml cm --mca mtl ofi \&lt;br /&gt;
       --mca mtl_ofi_provider_include psm2 \&lt;br /&gt;
       --mca btl self,sm \&lt;br /&gt;
       -x FI_PROVIDER=psm2 \&lt;br /&gt;
       -np ${SLURM_NTASKS} ./my_mpi_program&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Note some of the settings can be done by OpenMPI&#039;s own tags. &lt;br /&gt;
&lt;br /&gt;
=== Exporting variables to the other nodes: the &amp;lt;code&amp;gt;-x&amp;lt;/code&amp;gt; flag ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;-x&amp;lt;/code&amp;gt; hands a named environment variable to every rank, including those in other nodes :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mpirun -x FI_PROVIDER=psm2 -x MY_DATA_DIR -np ${SLURM_NTASKS} ./prog&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;-x VAR=value&amp;lt;/code&amp;gt; sets it; &amp;lt;code&amp;gt;-x VAR&amp;lt;/code&amp;gt; passes through whatever value it already has. Use one &amp;lt;code&amp;gt;-x&amp;lt;/code&amp;gt; per variable.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;With OpenMPI 5 inside a Slurm job, you usually do not need it.&#039;&#039;&#039; &#039;&#039;&#039;Though, do not read that as universal,  it depends on the version.&#039;&#039;&#039; It was verified for OpenMPI 5.0.7, in the &amp;lt;code&amp;gt;2025&amp;lt;/code&amp;gt; bucket. The &amp;lt;code&amp;gt;2023&amp;lt;/code&amp;gt; bucket carries &#039;&#039;&#039;OpenMPI 4.1.5&#039;&#039;&#039;, which may not propagate your environment automatically; historically variables did have to be passed by hand. And in a hostfile launch over &amp;lt;code&amp;gt;ssh&amp;lt;/code&amp;gt;, rather than inside a Slurm allocation, remote shells start clean and nothing travels at all.&lt;br /&gt;
&lt;br /&gt;
So use &amp;lt;code&amp;gt;-x&amp;lt;/code&amp;gt; if you are on the &amp;lt;code&amp;gt;2023&amp;lt;/code&amp;gt; bucket, if you are launching outside Slurm, or if you simply would rather not depend on any of the above. It costs nothing when it turns out to be redundant, and it is the one form that works in every case.&lt;br /&gt;
&lt;br /&gt;
So treat &amp;lt;code&amp;gt;-x&amp;lt;/code&amp;gt; as the &#039;&#039;&#039;explicit&#039;&#039;&#039; form rather than a workaround. It costs nothing, it states in the launch line what the run depends on, and it keeps working if the launch path changes underneath you. And if a job behaves differently across several nodes than it does on one, a variable that failed to travel is still the first thing worth suspecting.&lt;br /&gt;
&lt;br /&gt;
=== A start-up gotcha ===&lt;br /&gt;
&lt;br /&gt;
Do not use &amp;lt;code&amp;gt;sbatch --wrap&amp;lt;/code&amp;gt; for MPI jobs. The wrapped command runs under &amp;lt;code&amp;gt;dash&amp;lt;/code&amp;gt;, where Lmod&#039;s &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; function is not initialised, so module loads fail quietly and the job proceeds without the software it asked for. Write a real script starting &amp;lt;code&amp;gt;#!/bin/bash -l&amp;lt;/code&amp;gt; instead.&lt;br /&gt;
&lt;br /&gt;
== Advanced: pinning and rank placement ==&lt;br /&gt;
&lt;br /&gt;
By default OpenMPI decides where each rank sits and which cores it may use. For most jobs that is fine. It stops being fine when a job is memory-bandwidth-bound, when ranks each run threads of their own, or when timings vary between runs for no visible reason — all of which come down to &#039;&#039;placement&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Two ideas, easy to mix up:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Mapping&#039;&#039;&#039; — which rank goes where. &amp;lt;code&amp;gt;--map-by &amp;lt;unit&amp;gt;&amp;lt;/code&amp;gt;, where the unit can be &amp;lt;code&amp;gt;core&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;l3cache&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;numa&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;package&amp;lt;/code&amp;gt; (socket), or &amp;lt;code&amp;gt;node&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;Binding&#039;&#039;&#039; — how tightly a rank is then pinned. &amp;lt;code&amp;gt;--bind-to core&amp;lt;/code&amp;gt; is the usual choice; &amp;lt;code&amp;gt;--bind-to none&amp;lt;/code&amp;gt; lets a rank roam.&lt;br /&gt;
&lt;br /&gt;
Before tuning anything, look at what you are actually getting:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mpirun --report-bindings -np ${SLURM_NTASKS} ./my_mpi_program&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
That prints one line per rank showing the cores it is bound to. It is the only way to know rather than assume, and defaults differ between OpenMPI versions.&lt;br /&gt;
&lt;br /&gt;
=== Why multiples of eight suit our AMD nodes ===&lt;br /&gt;
&lt;br /&gt;
Most of Anunna&#039;s compute is AMD — &#039;&#039;&#039;Zen 3&#039;&#039;&#039; (EPYC Milan) and &#039;&#039;&#039;Zen 5&#039;&#039;&#039; (EPYC Turin). Both build a socket out of &#039;&#039;chiplets&#039;&#039; of &#039;&#039;&#039;8 cores&#039;&#039;&#039;, and each chiplet has its own slice of L3 cache. Cores inside a chiplet share that cache and reach memory together; cores in different chiplets do not.&lt;br /&gt;
&lt;br /&gt;
The practical consequence: &#039;&#039;&#039;ask for ranks in multiples of 8&#039;&#039;&#039;, so that chiplets are filled evenly and no chiplet is left holding a single stray rank while its cache and memory channels go mostly unused. 64, 128 and 256 are comfortable numbers here; 50 or 100 are not, and will spread unevenly no matter how you map them.&lt;br /&gt;
&lt;br /&gt;
Mapping by cache makes the intent explicit — one rank per chiplet, each free to use that chiplet&#039;s cores:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mpirun --map-by l3cache --bind-to core -np ${SLURM_NTASKS} ./my_mpi_program&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A related point for memory-bound work: spreading ranks across chiplets and NUMA domains uses many memory controllers at once, while packing them close leaves most idle. On our AMD nodes that difference is large, not marginal.&lt;br /&gt;
&lt;br /&gt;
=== Ranks with threads inside them ===&lt;br /&gt;
&lt;br /&gt;
If each rank also runs OpenMP threads, mapping and binding stop being optional. Give each rank a block of cores with &amp;lt;code&amp;gt;PE=&amp;lt;/code&amp;gt;, and bind inside it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
export OMP_NUM_THREADS=${SLURM_CPUS_PER_TASK}&lt;br /&gt;
mpirun --map-by ppr:8:node:PE=${SLURM_CPUS_PER_TASK} --bind-to core \&lt;br /&gt;
       -x OMP_NUM_THREADS \&lt;br /&gt;
       -np ${SLURM_NTASKS} ./my_hybrid_program&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
That reads as: place 8 ranks per node, give each one &amp;lt;code&amp;gt;SLURM_CPUS_PER_TASK&amp;lt;/code&amp;gt; cores, and bind them there. &#039;&#039;&#039;Without the &amp;lt;code&amp;gt;PE=&amp;lt;/code&amp;gt; part every thread of a rank can end up on one single core&#039;&#039;&#039; — the job runs, produces correct results, and is many times slower than it should be. It is a silent failure, so check it with &amp;lt;code&amp;gt;--report-bindings&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Note also that &#039;&#039;&#039;MPI binding and OpenMP affinity are separate knobs.&#039;&#039;&#039; &amp;lt;code&amp;gt;--map-by&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;--bind-to&amp;lt;/code&amp;gt; decide which cores a &#039;&#039;rank&#039;&#039; owns; &amp;lt;code&amp;gt;OMP_PROC_BIND&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;OMP_PLACES&amp;lt;/code&amp;gt; decide how that rank&#039;s &#039;&#039;threads&#039;&#039; arrange themselves within those cores. Setting the OpenMP variables cannot rescue a rank that was only given one core to begin with — the threads have nowhere to spread to. Get the MPI side right first.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[Workflows/Multi-Process|Multi-Process Workflows]] — when MPI is the right choice, and what the job script looks like.&lt;br /&gt;
* [[Intel MPI]] — the other MPI here, its &amp;lt;code&amp;gt;I_MPI_*&amp;lt;/code&amp;gt; pinning dialect, and MKL&#039;s behaviour on AMD nodes.&lt;br /&gt;
* [[Workflows/Multi-threaded|Multi-threaded Workflows]] — threads on one node, for programs that are not MPI.&lt;br /&gt;
* [[Tutorials/Parallelism-Estimating-Pi|Parallelism: Estimating π]] — the same calculation run serially, threaded, with MPI, and across nodes.&lt;br /&gt;
* [[Environment Modules]] — buckets, and how to find the module you need.&lt;br /&gt;
* [[Compute Hardware Overview]] — the nodes, their core counts and their memory.&lt;br /&gt;
* [[Batch Jobs]] — writing and submitting job scripts.&lt;br /&gt;
* [[Scheduler Overview (Slurm)]] — how the scheduler allocates what you ask for.&lt;/div&gt;</summary>
		<author><name>Honfi001</name></author>
	</entry>
	<entry>
		<id>https://wiki.anunna.wur.nl/index.php?title=Software&amp;diff=3037</id>
		<title>Software</title>
		<link rel="alternate" type="text/html" href="https://wiki.anunna.wur.nl/index.php?title=Software&amp;diff=3037"/>
		<updated>2026-08-06T14:48:30Z</updated>

		<summary type="html">&lt;p&gt;Honfi001: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The software available on Anunna and how to use, install, and manage it.&lt;br /&gt;
&lt;br /&gt;
== In this section ==&lt;br /&gt;
&lt;br /&gt;
* [[Software Overview]] — the software landscape&lt;br /&gt;
* [[Environment Modules]] — loading software with modules and buckets&lt;br /&gt;
* [[Installing Personal Software]] — installing into your own space&lt;br /&gt;
* [[Python]] — Python (modules, Miniforge, virtual environments)&lt;br /&gt;
* [[R]] — R-lang and libraries&lt;br /&gt;
* [[Julia]] — Julia&lt;br /&gt;
* [[Apptainer]] — containers&lt;br /&gt;
* [[OpenMPI]]&lt;br /&gt;
* [[IntelMPI]]&lt;br /&gt;
* [[Licensed Software]] — software that needs a licence&lt;/div&gt;</summary>
		<author><name>Honfi001</name></author>
	</entry>
	<entry>
		<id>https://wiki.anunna.wur.nl/index.php?title=OpenMPI&amp;diff=3036</id>
		<title>OpenMPI</title>
		<link rel="alternate" type="text/html" href="https://wiki.anunna.wur.nl/index.php?title=OpenMPI&amp;diff=3036"/>
		<updated>2026-08-06T14:46:43Z</updated>

		<summary type="html">&lt;p&gt;Honfi001: Add recommended environment section&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;OpenMPI&#039;&#039;&#039; is the MPI library Anunna is built around. MPI — the Message Passing Interface — is how a single program runs as many cooperating processes at once, each with its own private memory, passing messages between themselves as the calculation proceeds. It is what lets one job use more than one node.&lt;br /&gt;
&lt;br /&gt;
This page is the practical side: which OpenMPI modules exist here, how to launch a job on one node and across several, and how to choose the network transport, which on Anunna needs saying out loud. If you are still deciding whether MPI is the right shape for your work at all, start at [[Workflows/Multi-Process|Multi-Process Workflows]] — that page covers when to use MPI and when a [[Workflows/Embarassinly-Parallel|job array]] or [[Workflows/Multi-threaded|threads]] would serve you better. For a worked example you can run yourself, see [[Tutorials/Parallelism-Estimating-Pi|Parallelism: Estimating π]].&lt;br /&gt;
&lt;br /&gt;
One thing to be clear about before anything else: &#039;&#039;&#039;MPI has to be built into the program.&#039;&#039;&#039; You cannot add it from a job script. If your software&#039;s documentation never mentions MPI or ranks, this page is not the one you need.&lt;br /&gt;
&lt;br /&gt;
== What is available on Anunna ==&lt;br /&gt;
&lt;br /&gt;
Software here is built with [https://easybuild.io EasyBuild] and grouped into [[Environment Modules|buckets]]. A bucket has to be loaded before you can &#039;&#039;load&#039;&#039; anything from it — and before &amp;lt;code&amp;gt;module avail&amp;lt;/code&amp;gt; will list its contents. Each bucket corresponds to an EasyBuild toolchain generation:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Bucket !! Toolchain !! OpenMPI !! Compiler&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;2023&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;foss/2023a&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;gompi/2023a&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;OpenMPI/4.1.5&amp;lt;/code&amp;gt; || GCC 12.3.0&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;2024&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;foss/2024a&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;gompi/2024a&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;OpenMPI/5.0.3&amp;lt;/code&amp;gt; || GCC 13.3.0&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;2025&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;foss/2025a&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;gompi/2025a&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;OpenMPI/5.0.7&amp;lt;/code&amp;gt; || GCC 14.2.0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Three ways in, and they differ only in how much they bring with them:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;foss&amp;lt;/code&amp;gt;&#039;&#039;&#039; — the full toolchain: GCC, OpenMPI, OpenBLAS, FFTW and ScaLAPACK. Load this if your program wants linear algebra or FFTs as well as MPI.&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;gompi&amp;lt;/code&amp;gt;&#039;&#039;&#039; — GCC and OpenMPI, nothing else. The lean choice when MPI is all you need.&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;OpenMPI/&amp;lt;version&amp;gt;&amp;lt;/code&amp;gt;&#039;&#039;&#039; — the library on its own, with its compiler underneath.&lt;br /&gt;
&lt;br /&gt;
You can list them yourself with &amp;lt;code&amp;gt;module key&amp;lt;/code&amp;gt;, which searches module descriptions as well as names. It reads Lmod&#039;s cache rather than your current environment, so — unlike &amp;lt;code&amp;gt;module avail&amp;lt;/code&amp;gt; — it needs &#039;&#039;&#039;no&#039;&#039;&#039; bucket loaded and reports matches from every bucket at once:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
module key OpenMPI        # no bucket needed; searches across all of them&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
That is the quickest way to see which OpenMPI versions exist and which toolchains carry them. Once you have picked one, &#039;&#039;then&#039;&#039; load its bucket and the module.&lt;br /&gt;
&lt;br /&gt;
=== Loading it ===&lt;br /&gt;
&lt;br /&gt;
Two steps, always in this order: &#039;&#039;&#039;the bucket, then the module.&#039;&#039;&#039; Nothing from a bucket can be loaded until the bucket itself is.&lt;br /&gt;
&lt;br /&gt;
To get the full toolchain from the 2024 bucket:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;module load 2024&lt;br /&gt;
module load 2024 OpenMPI/5.0.3    # OpenMPI alone&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The short version number is enough — you do &#039;&#039;&#039;not&#039;&#039;&#039; need to type the compiler suffix. &amp;lt;code&amp;gt;OpenMPI/5.0.3&amp;lt;/code&amp;gt; resolves to &amp;lt;code&amp;gt;OpenMPI/5.0.3-GCC-13.3.0&amp;lt;/code&amp;gt;, which is the full name &amp;lt;code&amp;gt;module list&amp;lt;/code&amp;gt; will show you afterwards. If you want to see everything a bucket offers, &amp;lt;code&amp;gt;module avail OpenMPI&amp;lt;/code&amp;gt; lists it once that bucket is loaded.&lt;br /&gt;
&lt;br /&gt;
Alternatively, swap the second line for modules that bundle OpenMPI with other additional modules:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;module load 2024 gompi/2024a      # GCC + OpenMPI, no maths libraries&lt;br /&gt;
module load foss/2024a            # GCC + OpenMPI + maths libraries&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Check what you actually got.&#039;&#039;&#039; Two commands, both worth the habit&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
module list        # everything now loaded, including pulled-in dependencies&lt;br /&gt;
mpirun --version   # confirms which OpenMPI is on your PATH&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Which one to load ===&lt;br /&gt;
&lt;br /&gt;
The rule that saves the most time: &#039;&#039;&#039;load the same MPI the program was built against.&#039;&#039;&#039; Building with one MPI and running under another produces failures that look like almost anything except the mismatch causing them — hangs, garbled output, crashes inside library calls.&lt;br /&gt;
&lt;br /&gt;
In practice that means:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Running software from the module system?&#039;&#039;&#039; Load &#039;&#039;&#039;its&#039;&#039;&#039; module and let it pull in the matching MPI as a dependency. You never have to choose, and you cannot get it wrong.&lt;br /&gt;
* &#039;&#039;&#039;Running something you built yourself?&#039;&#039;&#039; Load the same toolchain you built it with.&lt;br /&gt;
* &#039;&#039;&#039;Building it yourself?&#039;&#039;&#039; Use the compiler wrappers the MPI module provides — &amp;lt;code&amp;gt;mpicc&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;mpicxx&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;mpifort&amp;lt;/code&amp;gt; — which call your ordinary compiler with the MPI headers and libraries already in place.&lt;br /&gt;
&lt;br /&gt;
If none of those settles it, prefer the newest bucket your software is available in: the OpenMPI it carries is the one that has had the most attention here.&lt;br /&gt;
&lt;br /&gt;
== Recommended Environment ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
export OMPI_MCA_pml=cm&lt;br /&gt;
export OMPI_MCA_mtl=ofi&lt;br /&gt;
export FI_PROVIDER=psm2&lt;br /&gt;
export OMPI_MCA_btl=self,sm #substitute sm with vader for v4&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Running on a single node ==&lt;br /&gt;
&lt;br /&gt;
Remember that nothing should run on the login nodes — they are shared, and are for editing, submitting and light housekeeping only. Describe the job in a script, keep the data on Lustre under &amp;lt;code&amp;gt;$myScratch&amp;lt;/code&amp;gt;, and hand it to &amp;lt;code&amp;gt;sbatch&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;#!/bin/bash&lt;br /&gt;
#SBATCH --job-name=mpi_single&lt;br /&gt;
#SBATCH --nodes=1&lt;br /&gt;
#SBATCH --ntasks=64             # 64 ranks, all on one machine&lt;br /&gt;
#SBATCH --cpus-per-task=1&lt;br /&gt;
#SBATCH --mem-per-cpu=2G        # per CORE, not per node&lt;br /&gt;
#SBATCH --time=01:00:00&lt;br /&gt;
#SBATCH --output=%x-%j.out&lt;br /&gt;
&lt;br /&gt;
cd &amp;quot;$myScratch/my_simulation&amp;quot;&lt;br /&gt;
&lt;br /&gt;
module load 2024 foss/2024a&lt;br /&gt;
&lt;br /&gt;
mpirun -np ${SLURM_NTASKS} ./my_mpi_program&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Two habits in there are worth keeping:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;-np ${SLURM_NTASKS}&amp;lt;/code&amp;gt;, never a hard-coded number.&#039;&#039;&#039; Slurm exports the task count it granted; passing that through means the request and the run cannot drift apart when you change one of them.&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;--mem-per-cpu&amp;lt;/code&amp;gt;, not &amp;lt;code&amp;gt;--mem&amp;lt;/code&amp;gt;.&#039;&#039;&#039; &amp;lt;code&amp;gt;--mem&amp;lt;/code&amp;gt; is a &#039;&#039;per-node&#039;&#039; request shared out among all ranks on that node — at 64 or 128 ranks each one ends up with a few megabytes, less than an MPI process needs simply to start, and the job dies of an out-of-memory kill that points nowhere near the flag responsible.&lt;br /&gt;
&lt;br /&gt;
On one node OpenMPI talks to itself through shared memory. There is nothing to configure and no network involved, which is why this case is simple and the next one is not.&lt;br /&gt;
&lt;br /&gt;
== Running across several nodes ==&lt;br /&gt;
&lt;br /&gt;
The moment a job spans two nodes, the ranks have to talk over the network — and on Anunna that path needs to be chosen explicitly.&lt;br /&gt;
&lt;br /&gt;
Anunna&#039;s fabric is &#039;&#039;&#039;Omni-Path (OPA100)&#039;&#039;&#039;, and inter-node MPI rides it through &#039;&#039;&#039;libfabric&#039;&#039;&#039;. libfabric offers more than one &#039;&#039;provider&#039;&#039; for this hardware, and on our cluster they are not equally healthy:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Provider !! Status on Anunna !! Use it?&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;psm2&amp;lt;/code&amp;gt; || Validated at line rate (~97 Gbps), on both Intel and AMD nodes, under all three toolchains || &#039;&#039;&#039;Yes — this is the one&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;opx&amp;lt;/code&amp;gt; || Not currently operational || Not yet&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Because TCP can be picked up automatically, &#039;&#039;&#039;an inter-node MPI job should explicitly ask for &amp;lt;code&amp;gt;psm2&amp;lt;/code&amp;gt;&#039;&#039;&#039;  rather than trusting the default:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mpirun --mca pml cm --mca mtl ofi --mca mtl_ofi_provider_include psm2 \&lt;br /&gt;
       -x FI_PROVIDER=psm2 \&lt;br /&gt;
       -np ${SLURM_NTASKS} ./my_mpi_program --input data.nc&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A complete multi-node job script:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#SBATCH --job-name=mpi_multi&lt;br /&gt;
#SBATCH --nodes=4&lt;br /&gt;
#SBATCH --ntasks-per-node=64    # 256 ranks in total&lt;br /&gt;
#SBATCH --cpus-per-task=1&lt;br /&gt;
#SBATCH --mem-per-cpu=2G&lt;br /&gt;
#SBATCH --time=02:00:00&lt;br /&gt;
#SBATCH --output=%x-%j.out&lt;br /&gt;
&lt;br /&gt;
cd &amp;quot;$myScratch/my_simulation&amp;quot;&lt;br /&gt;
&lt;br /&gt;
module load 2024 foss/2024a&lt;br /&gt;
&lt;br /&gt;
mpirun --mca pml cm --mca mtl ofi --mca mtl_ofi_provider_include psm2 \&lt;br /&gt;
       -x FI_PROVIDER=psm2 \&lt;br /&gt;
       -np ${SLURM_NTASKS} ./my_mpi_program --input data.nc&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exporting variables to the other nodes: the &amp;lt;code&amp;gt;-x&amp;lt;/code&amp;gt; flag ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;-x&amp;lt;/code&amp;gt; hands a named environment variable to every rank:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mpirun -x FI_PROVIDER=psm2 -x MY_DATA_DIR -np ${SLURM_NTASKS} ./prog&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;-x VAR=value&amp;lt;/code&amp;gt; sets it; &amp;lt;code&amp;gt;-x VAR&amp;lt;/code&amp;gt; passes through whatever value it already has. Use one &amp;lt;code&amp;gt;-x&amp;lt;/code&amp;gt; per variable.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;With OpenMPI 5 inside a Slurm job, you usually do not need it.&#039;&#039;&#039; &#039;&#039;&#039;Though, do not read that as universal,  it depends on the version.&#039;&#039;&#039; It was verified for OpenMPI 5.0.7, in the &amp;lt;code&amp;gt;2025&amp;lt;/code&amp;gt; bucket. The &amp;lt;code&amp;gt;2023&amp;lt;/code&amp;gt; bucket carries &#039;&#039;&#039;OpenMPI 4.1.5&#039;&#039;&#039;, which predates the PRRTE launcher and has not been tested here; historically variables did have to be passed by hand. And in a hostfile launch over &amp;lt;code&amp;gt;ssh&amp;lt;/code&amp;gt;, rather than inside a Slurm allocation, remote shells start clean and nothing travels at all.&lt;br /&gt;
&lt;br /&gt;
So use &amp;lt;code&amp;gt;-x&amp;lt;/code&amp;gt; if you are on the &amp;lt;code&amp;gt;2023&amp;lt;/code&amp;gt; bucket, if you are launching outside Slurm, or if you simply would rather not depend on any of the above. It costs nothing when it turns out to be redundant, and it is the one form that works in every case.&lt;br /&gt;
&lt;br /&gt;
So treat &amp;lt;code&amp;gt;-x&amp;lt;/code&amp;gt; as the &#039;&#039;&#039;explicit&#039;&#039;&#039; form rather than a workaround. It costs nothing, it states in the launch line what the run depends on, and it keeps working if the launch path changes underneath you. And if a job behaves differently across several nodes than it does on one, a variable that failed to travel is still the first thing worth suspecting.&lt;br /&gt;
&lt;br /&gt;
=== A start-up gotcha ===&lt;br /&gt;
&lt;br /&gt;
Do not use &amp;lt;code&amp;gt;sbatch --wrap&amp;lt;/code&amp;gt; for MPI jobs. The wrapped command runs under &amp;lt;code&amp;gt;dash&amp;lt;/code&amp;gt;, where Lmod&#039;s &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; function is not initialised, so module loads fail quietly and the job proceeds without the software it asked for. Write a real script starting &amp;lt;code&amp;gt;#!/bin/bash -l&amp;lt;/code&amp;gt; instead.&lt;br /&gt;
&lt;br /&gt;
== Advanced: pinning and rank placement ==&lt;br /&gt;
&lt;br /&gt;
By default OpenMPI decides where each rank sits and which cores it may use. For most jobs that is fine. It stops being fine when a job is memory-bandwidth-bound, when ranks each run threads of their own, or when timings vary between runs for no visible reason — all of which come down to &#039;&#039;placement&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Two ideas, easy to mix up:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Mapping&#039;&#039;&#039; — which rank goes where. &amp;lt;code&amp;gt;--map-by &amp;lt;unit&amp;gt;&amp;lt;/code&amp;gt;, where the unit can be &amp;lt;code&amp;gt;core&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;l3cache&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;numa&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;package&amp;lt;/code&amp;gt; (socket), or &amp;lt;code&amp;gt;node&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;Binding&#039;&#039;&#039; — how tightly a rank is then pinned. &amp;lt;code&amp;gt;--bind-to core&amp;lt;/code&amp;gt; is the usual choice; &amp;lt;code&amp;gt;--bind-to none&amp;lt;/code&amp;gt; lets a rank roam.&lt;br /&gt;
&lt;br /&gt;
Before tuning anything, look at what you are actually getting:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mpirun --report-bindings -np ${SLURM_NTASKS} ./my_mpi_program&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
That prints one line per rank showing the cores it is bound to. It is the only way to know rather than assume, and defaults differ between OpenMPI versions.&lt;br /&gt;
&lt;br /&gt;
=== Why multiples of eight suit our AMD nodes ===&lt;br /&gt;
&lt;br /&gt;
Most of Anunna&#039;s compute is AMD — &#039;&#039;&#039;Zen 3&#039;&#039;&#039; (EPYC Milan) and &#039;&#039;&#039;Zen 5&#039;&#039;&#039; (EPYC Turin). Both build a socket out of &#039;&#039;chiplets&#039;&#039; of &#039;&#039;&#039;8 cores&#039;&#039;&#039;, and each chiplet has its own slice of L3 cache. Cores inside a chiplet share that cache and reach memory together; cores in different chiplets do not.&lt;br /&gt;
&lt;br /&gt;
The practical consequence: &#039;&#039;&#039;ask for ranks in multiples of 8&#039;&#039;&#039;, so that chiplets are filled evenly and no chiplet is left holding a single stray rank while its cache and memory channels go mostly unused. 64, 128 and 256 are comfortable numbers here; 50 or 100 are not, and will spread unevenly no matter how you map them.&lt;br /&gt;
&lt;br /&gt;
Mapping by cache makes the intent explicit — one rank per chiplet, each free to use that chiplet&#039;s cores:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mpirun --map-by l3cache --bind-to core -np ${SLURM_NTASKS} ./my_mpi_program&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A related point for memory-bound work: spreading ranks across chiplets and NUMA domains uses many memory controllers at once, while packing them close leaves most idle. On our AMD nodes that difference is large, not marginal.&lt;br /&gt;
&lt;br /&gt;
=== Ranks with threads inside them ===&lt;br /&gt;
&lt;br /&gt;
If each rank also runs OpenMP threads, mapping and binding stop being optional. Give each rank a block of cores with &amp;lt;code&amp;gt;PE=&amp;lt;/code&amp;gt;, and bind inside it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
export OMP_NUM_THREADS=${SLURM_CPUS_PER_TASK}&lt;br /&gt;
mpirun --map-by ppr:8:node:PE=${SLURM_CPUS_PER_TASK} --bind-to core \&lt;br /&gt;
       -x OMP_NUM_THREADS \&lt;br /&gt;
       -np ${SLURM_NTASKS} ./my_hybrid_program&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
That reads as: place 8 ranks per node, give each one &amp;lt;code&amp;gt;SLURM_CPUS_PER_TASK&amp;lt;/code&amp;gt; cores, and bind them there. &#039;&#039;&#039;Without the &amp;lt;code&amp;gt;PE=&amp;lt;/code&amp;gt; part every thread of a rank can end up on one single core&#039;&#039;&#039; — the job runs, produces correct results, and is many times slower than it should be. It is a silent failure, so check it with &amp;lt;code&amp;gt;--report-bindings&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Note also that &#039;&#039;&#039;MPI binding and OpenMP affinity are separate knobs.&#039;&#039;&#039; &amp;lt;code&amp;gt;--map-by&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;--bind-to&amp;lt;/code&amp;gt; decide which cores a &#039;&#039;rank&#039;&#039; owns; &amp;lt;code&amp;gt;OMP_PROC_BIND&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;OMP_PLACES&amp;lt;/code&amp;gt; decide how that rank&#039;s &#039;&#039;threads&#039;&#039; arrange themselves within those cores. Setting the OpenMP variables cannot rescue a rank that was only given one core to begin with — the threads have nowhere to spread to. Get the MPI side right first.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[Workflows/Multi-Process|Multi-Process Workflows]] — when MPI is the right choice, and what the job script looks like.&lt;br /&gt;
* [[Intel MPI]] — the other MPI here, its &amp;lt;code&amp;gt;I_MPI_*&amp;lt;/code&amp;gt; pinning dialect, and MKL&#039;s behaviour on AMD nodes.&lt;br /&gt;
* [[Workflows/Multi-threaded|Multi-threaded Workflows]] — threads on one node, for programs that are not MPI.&lt;br /&gt;
* [[Tutorials/Parallelism-Estimating-Pi|Parallelism: Estimating π]] — the same calculation run serially, threaded, with MPI, and across nodes.&lt;br /&gt;
* [[Environment Modules]] — buckets, and how to find the module you need.&lt;br /&gt;
* [[Compute Hardware Overview]] — the nodes, their core counts and their memory.&lt;br /&gt;
* [[Batch Jobs]] — writing and submitting job scripts.&lt;br /&gt;
* [[Scheduler Overview (Slurm)]] — how the scheduler allocates what you ask for.&lt;/div&gt;</summary>
		<author><name>Honfi001</name></author>
	</entry>
	<entry>
		<id>https://wiki.anunna.wur.nl/index.php?title=IntelMPI&amp;diff=3035</id>
		<title>IntelMPI</title>
		<link rel="alternate" type="text/html" href="https://wiki.anunna.wur.nl/index.php?title=IntelMPI&amp;diff=3035"/>
		<updated>2026-08-05T14:46:12Z</updated>

		<summary type="html">&lt;p&gt;Honfi001: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Intel MPI&#039;&#039;&#039; is the other MPI implementation available on Anunna, alongside [[OpenMPI]]. It arrives as part of the Intel toolchain, together with the Intel compilers and the Intel Math Kernel Library (MKL).&lt;br /&gt;
&lt;br /&gt;
Everything general about MPI — that it runs one program as many cooperating processes, that it has to be built into the program, and when it is the right tool at all — is covered on [[Workflows/Multi-Process|Multi-Process Workflows]]. This page is the Intel-specific practice: which modules exist, how to launch, how the pinning controls differ from OpenMPI&#039;s, and one thing that catches people out on our AMD nodes.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Which should you use?&#039;&#039;&#039; Whichever your program was built with. That is not a dodge — mixing MPI implementations between build and run does not work, so in practice the software chooses for you. Where you genuinely have a choice, Intel MPI and MKL are the natural pairing for code that leans on Intel&#039;s maths libraries, and [[OpenMPI]] is the default for everything else here.&lt;br /&gt;
&lt;br /&gt;
== What is available on Anunna ==&lt;br /&gt;
&lt;br /&gt;
Software is built with [https://easybuild.io EasyBuild] and grouped into [[Environment Modules|buckets]]; a bucket has to be loaded before you can load anything from it. The Intel toolchain follows the same yearly generations as &amp;lt;code&amp;gt;foss&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Bucket !! Toolchain !! Contains&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;2023&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;intel/2023a&amp;lt;/code&amp;gt; || Intel compilers, Intel MPI, MKL&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;2024&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;intel/2024a&amp;lt;/code&amp;gt; || Intel compilers, Intel MPI, MKL&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;2025&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;intel/2025a&amp;lt;/code&amp;gt; || Intel compilers, Intel MPI, MKL&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;intel/&amp;lt;year&amp;gt;a&amp;lt;/code&amp;gt; is the counterpart of &amp;lt;code&amp;gt;foss/&amp;lt;year&amp;gt;a&amp;lt;/code&amp;gt;: one module that brings the whole stack — compilers, MPI, MKL and FFTW. There are leaner ways in, mirroring &amp;lt;code&amp;gt;gompi&amp;lt;/code&amp;gt; on the &amp;lt;code&amp;gt;foss&amp;lt;/code&amp;gt; side:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;iimpi/&amp;lt;year&amp;gt;a&amp;lt;/code&amp;gt;&#039;&#039;&#039; — Intel compilers and Intel MPI, without MKL. The lean choice when you only need MPI.&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;impi/&amp;lt;version&amp;gt;&amp;lt;/code&amp;gt;&#039;&#039;&#039; — the MPI library alone. In the 2025 bucket this is &amp;lt;code&amp;gt;impi/2021.15.0-intel-compilers-2025.1.1&amp;lt;/code&amp;gt;; note that Intel MPI&#039;s own version numbering (2021.x) does not track the toolchain year.&lt;br /&gt;
&lt;br /&gt;
To see what a bucket actually offers, ask the module system — &amp;lt;code&amp;gt;module key&amp;lt;/code&amp;gt; reads Lmod&#039;s cache, so it needs no bucket loaded and searches every bucket at once:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
module key intel      # the toolchains&lt;br /&gt;
module key impi       # the MPI library on its own&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Loading it ===&lt;br /&gt;
&lt;br /&gt;
Bucket first, then the module — the same two steps as any other software here:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
module load 2024 intel/2024a&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then confirm what you got, which is worth the habit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
module list           # everything loaded, dependencies included&lt;br /&gt;
mpirun -version       # which Intel MPI is on your PATH&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Keep a job inside one bucket. Do not load &amp;lt;code&amp;gt;intel&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;foss&amp;lt;/code&amp;gt; in the same job — they provide competing compilers, MPI libraries and BLAS, and the result is unpredictable rather than merely slow. If you want a clean starting point, &amp;lt;code&amp;gt;module reset&amp;lt;/code&amp;gt; returns you to the system defaults; the &amp;lt;code&amp;gt;slurm&amp;lt;/code&amp;gt; module is &#039;&#039;sticky&#039;&#039; and survives it either way.&lt;br /&gt;
&lt;br /&gt;
== Running on a single node ==&lt;br /&gt;
&lt;br /&gt;
Nothing runs on the login nodes. Put the work in a script, keep data on Lustre under &amp;lt;code&amp;gt;$myScratch&amp;lt;/code&amp;gt;, and submit with &amp;lt;code&amp;gt;sbatch&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash -l&lt;br /&gt;
#SBATCH --job-name=impi_single&lt;br /&gt;
#SBATCH --nodes=1&lt;br /&gt;
#SBATCH --ntasks=64&lt;br /&gt;
#SBATCH --cpus-per-task=1&lt;br /&gt;
#SBATCH --mem-per-cpu=2G        # per CORE, not per node&lt;br /&gt;
#SBATCH --time=01:00:00&lt;br /&gt;
#SBATCH --output=%x-%j.out&lt;br /&gt;
&lt;br /&gt;
cd &amp;quot;$myScratch/my_simulation&amp;quot;&lt;br /&gt;
&lt;br /&gt;
module load 2024 intel/2024a&lt;br /&gt;
&lt;br /&gt;
mpirun -np ${SLURM_NTASKS} ./my_mpi_program --input data.nc&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Two things carried over from [[OpenMPI]], for the same reasons: pass &amp;lt;code&amp;gt;${SLURM_NTASKS}&amp;lt;/code&amp;gt; rather than hard-coding the rank count, and use &amp;lt;code&amp;gt;--mem-per-cpu&amp;lt;/code&amp;gt; rather than &amp;lt;code&amp;gt;--mem&amp;lt;/code&amp;gt;, which is a per-&#039;&#039;node&#039;&#039; request divided among all the ranks on that node.&lt;br /&gt;
&lt;br /&gt;
Note the &amp;lt;code&amp;gt;#!/bin/bash -l&amp;lt;/code&amp;gt;. A login shell is what initialises Lmod, so without it &amp;lt;code&amp;gt;module load&amp;lt;/code&amp;gt; can fail quietly. For the same reason, never launch an MPI job with &amp;lt;code&amp;gt;sbatch --wrap&amp;lt;/code&amp;gt; — that runs under &amp;lt;code&amp;gt;dash&amp;lt;/code&amp;gt;, where &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; does not exist.&lt;br /&gt;
&lt;br /&gt;
On one node the ranks talk through shared memory and there is nothing to configure.&lt;br /&gt;
&lt;br /&gt;
== Running across several nodes ==&lt;br /&gt;
&lt;br /&gt;
Anunna&#039;s fabric is &#039;&#039;&#039;Omni-Path (OPA100)&#039;&#039;&#039;, and both MPI implementations reach it through &#039;&#039;&#039;libfabric&#039;&#039;&#039;. The provider that works reliably here is &#039;&#039;&#039;&amp;lt;code&amp;gt;psm2&amp;lt;/code&amp;gt;&#039;&#039;&#039;; the &amp;lt;code&amp;gt;opx&amp;lt;/code&amp;gt; provider is broken for inter-node traffic on this hardware. So an inter-node job should name the provider rather than trust auto-selection:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash -l&lt;br /&gt;
#SBATCH --job-name=impi_multi&lt;br /&gt;
#SBATCH --nodes=4&lt;br /&gt;
#SBATCH --ntasks-per-node=64&lt;br /&gt;
#SBATCH --cpus-per-task=1&lt;br /&gt;
#SBATCH --mem-per-cpu=2G&lt;br /&gt;
#SBATCH --time=02:00:00&lt;br /&gt;
#SBATCH --output=%x-%j.out&lt;br /&gt;
&lt;br /&gt;
cd &amp;quot;$myScratch/my_simulation&amp;quot;&lt;br /&gt;
&lt;br /&gt;
module load 2024 intel/2024a&lt;br /&gt;
&lt;br /&gt;
mpirun -genv I_MPI_OFI_PROVIDER psm2 -genv FI_PROVIDER psm2 \&lt;br /&gt;
       -np ${SLURM_NTASKS} ./my_mpi_program --input data.nc&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To see what was actually selected — provider, pinning, rank layout — turn up Intel MPI&#039;s own diagnostics:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
export I_MPI_DEBUG=4&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
That prints the chosen fabric and the rank-to-core map at start-up, and is the fastest way to confirm a setting took effect instead of assuming it did.&lt;br /&gt;
&lt;br /&gt;
=== Getting variables to the other nodes ===&lt;br /&gt;
&lt;br /&gt;
Ranks on remote nodes are started fresh, so any variable your program or the fabric depends on has to reach them. Intel MPI&#039;s controls are:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Option !! Effect&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;-genv &amp;lt;VAR&amp;gt; &amp;lt;value&amp;gt;&amp;lt;/code&amp;gt; || Set one variable for &#039;&#039;&#039;all&#039;&#039;&#039; ranks. The explicit, always-safe form.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;-genvall&amp;lt;/code&amp;gt; || Pass the whole launching environment to all ranks. This is the default.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;-genvlist &amp;lt;a,b,c&amp;gt;&amp;lt;/code&amp;gt; || Pass only the named variables.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;-genvnone&amp;lt;/code&amp;gt; || Pass nothing.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In practice &#039;&#039;&#039;a plain &amp;lt;code&amp;gt;export&amp;lt;/code&amp;gt; in your job script does reach every rank&#039;&#039;&#039; — tested on Anunna across two nodes.&lt;br /&gt;
&lt;br /&gt;
It arrives whatever you do to stop it: restricting Intel MPI&#039;s own propagation with &amp;lt;code&amp;gt;-genvlist PATH&amp;lt;/code&amp;gt;, which should have excluded the test variable, delivered it to both nodes anyway. [[OpenMPI]] 5.0.7 behaved identically — with &amp;lt;code&amp;gt;-x&amp;lt;/code&amp;gt;, without it, and even with Slurm&#039;s own environment forwarding suppressed.&lt;br /&gt;
&lt;br /&gt;
The practical reading is that &#039;&#039;&#039;inside a Slurm allocation both implementations get your environment to the ranks&#039;&#039;&#039;, by way of the process-management layer (PMIx and the launcher&#039;s job description) rather than the batch environment. On the OpenMPI side that was pinned down: removing the variable from &amp;lt;code&amp;gt;mpirun&amp;lt;/code&amp;gt;&#039;s own environment is the only thing that stopped it arriving — see [[OpenMPI#Exporting variables to the other nodes: the -x flag|the OpenMPI page]] for the full result.&lt;br /&gt;
&lt;br /&gt;
None of which is worth depending on in a job script. It held for the current toolchains and not necessarily for older ones, so say what your run needs explicitly with &amp;lt;code&amp;gt;-genv&amp;lt;/code&amp;gt; and the question stops mattering.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;code&amp;gt;-genv&amp;lt;/code&amp;gt; is still the habit worth keeping&#039;&#039;&#039; for anything the run depends on, as in the script above. It does not rely on which layer happens to be propagating, it states the intent in the launch line, it survives a site or script that restricts propagation later, and it is the first thing to try if a variable does mysteriously fail to arrive.&lt;br /&gt;
&lt;br /&gt;
== Intel MPI, MKL, and AMD nodes ==&lt;br /&gt;
&lt;br /&gt;
Most of Anunna&#039;s compute is AMD, and the Intel stack has a well-known wrinkle there. It is worth being precise about where it lives: &#039;&#039;&#039;the issue is in MKL, not in Intel MPI.&#039;&#039;&#039; But MKL arrives with the same &amp;lt;code&amp;gt;intel/&amp;lt;year&amp;gt;a&amp;lt;/code&amp;gt; module, and &amp;quot;our Intel build is slow on the AMD nodes&amp;quot; is usually this, so it belongs on this page.&lt;br /&gt;
&lt;br /&gt;
MKL checks the &#039;&#039;&#039;CPU vendor&#039;&#039;&#039; at run time. On a non-Intel CPU, kernels without specific Zen coverage can fall back to an &#039;&#039;&#039;SSE&#039;&#039;&#039; code path instead of using &#039;&#039;&#039;AVX2&#039;&#039;&#039;, leaving much of the vector width unused. This is still the behaviour in MKL 2025.x — it has not been quietly fixed. The old &amp;lt;code&amp;gt;MKL_DEBUG_CPU_TYPE&amp;lt;/code&amp;gt; workaround is gone, removed back in MKL 2020 Update 1, so anything you read recommending it is out of date.&lt;br /&gt;
&lt;br /&gt;
The current mitigation is a small shim, &#039;&#039;&#039;&amp;lt;code&amp;gt;libfakeintel.so&amp;lt;/code&amp;gt;&#039;&#039;&#039;, &amp;lt;code&amp;gt;LD_PRELOAD&amp;lt;/code&amp;gt;ed ahead of MKL. It overrides the vendor test (&amp;lt;code&amp;gt;mkl_serv_intel_cpu_true&amp;lt;/code&amp;gt;) so that it returns true, and MKL then dispatches its AVX2 kernels:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
export LD_PRELOAD=/path/to/libfakeintel.so&lt;br /&gt;
mpirun -np ${SLURM_NTASKS} ./my_mpi_program&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before assuming this is your problem, two things are worth checking, because often it is not. The shim only &#039;&#039;widens arithmetic&#039;&#039;, so it pays off when MKL is doing &#039;&#039;&#039;compute-bound work&#039;&#039;&#039;. It does nothing when MKL is only handling bandwidth-bound work, and nothing at all if your library does its own arithmetic e.g. PETSc.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MKL_VERBOSE=1&amp;lt;/code&amp;gt; is the quick way to find out: it prints every MKL call, so you can see whether MKL is on your hot path at all and what it is being asked to do. Keep it off any run you intend to time — at high call counts the logging is itself a real cost.&lt;br /&gt;
&lt;br /&gt;
If MKL turns out to suit your workload poorly on the AMD nodes, the &amp;lt;code&amp;gt;foss&amp;lt;/code&amp;gt; toolchain&#039;s OpenBLAS-based BLAS is worth benchmarking against.&lt;br /&gt;
&lt;br /&gt;
== Advanced: pinning and rank placement ==&lt;br /&gt;
&lt;br /&gt;
Intel MPI and OpenMPI express placement differently: OpenMPI takes command-line flags, Intel MPI reads &amp;lt;code&amp;gt;I_MPI_*&amp;lt;/code&amp;gt; environment variables. The intents map across cleanly, so if you know one dialect this table gives you the other:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Intent !! Intel MPI !! OpenMPI&lt;br /&gt;
|-&lt;br /&gt;
| One rank per physical core, no migration || &amp;lt;code&amp;gt;I_MPI_PIN=1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;I_MPI_PIN_DOMAIN=core&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;--bind-to core&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Fill the node, neighbours adjacent || &amp;lt;code&amp;gt;I_MPI_PIN_ORDER=compact&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;--map-by core&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Under-subscribed, spread across all NUMA domains || &amp;lt;code&amp;gt;I_MPI_PIN_ORDER=scatter&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;--map-by numa --bind-to core&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| One rank per chiplet / L3 slice || &amp;lt;code&amp;gt;I_MPI_PIN_DOMAIN=cache3&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;--map-by l3cache --bind-to core&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Print the map actually used || &amp;lt;code&amp;gt;I_MPI_DEBUG=4&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;--report-bindings&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Three rules that matter more than the individual settings:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Verify, do not assume.&#039;&#039;&#039; Print the map with &amp;lt;code&amp;gt;I_MPI_DEBUG=4&amp;lt;/code&amp;gt; before and after any change. Placement bugs do not announce themselves; the job runs and is simply slower than it should be.&lt;br /&gt;
* &#039;&#039;&#039;One source of truth.&#039;&#039;&#039; Pin with the MPI launcher &#039;&#039;&#039;or&#039;&#039;&#039; with Slurm (&amp;lt;code&amp;gt;--cpu-bind&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--distribution&amp;lt;/code&amp;gt;), never both. Two pinners fighting each other produce a nonsense map.&lt;br /&gt;
* &#039;&#039;&#039;Spread suits memory-bound work.&#039;&#039;&#039; AMD sockets are built from 8-core chiplets, each with its own cache slice and share of the memory channels. A bandwidth-bound job saturates memory well before every core is busy, so spreading a reduced number of ranks across all NUMA domains keeps every memory channel active, while packing them together leaves most idle. Asking for ranks in multiples of 8 keeps chiplets evenly filled.&lt;br /&gt;
&lt;br /&gt;
For the reasoning behind that last point, and the equivalent OpenMPI syntax, see [[OpenMPI#Advanced: pinning and rank placement|the OpenMPI page]].&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[OpenMPI]] — the other MPI here, and the default for most software.&lt;br /&gt;
* [[Workflows/Multi-Process|Multi-Process Workflows]] — whether MPI is the right shape for your work.&lt;br /&gt;
* [[Environment Modules]] — buckets, and finding the module you need.&lt;br /&gt;
* [[Compute Hardware Overview]] — what the nodes actually are.&lt;br /&gt;
* [[Batch Jobs]] — writing and submitting job scripts.&lt;br /&gt;
* [[Scheduler Overview (Slurm)]] — how the scheduler allocates what you ask for.&lt;/div&gt;</summary>
		<author><name>Honfi001</name></author>
	</entry>
	<entry>
		<id>https://wiki.anunna.wur.nl/index.php?title=IntelMPI&amp;diff=3034</id>
		<title>IntelMPI</title>
		<link rel="alternate" type="text/html" href="https://wiki.anunna.wur.nl/index.php?title=IntelMPI&amp;diff=3034"/>
		<updated>2026-08-05T14:40:48Z</updated>

		<summary type="html">&lt;p&gt;Honfi001: Created page with &amp;quot;&amp;#039;&amp;#039;&amp;#039;Intel MPI&amp;#039;&amp;#039;&amp;#039; is the other MPI implementation available on Anunna, alongside OpenMPI. It arrives as part of the Intel toolchain, together with the Intel compilers and the Intel Math Kernel Library (MKL).  Everything general about MPI — that it runs one program as many cooperating processes, that it has to be built into the program, and when it is the right tool at all — is covered on Multi-Process Workflows. This page is the Intel-sp...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Intel MPI&#039;&#039;&#039; is the other MPI implementation available on Anunna, alongside [[OpenMPI]]. It arrives as part of the Intel toolchain, together with the Intel compilers and the Intel Math Kernel Library (MKL).&lt;br /&gt;
&lt;br /&gt;
Everything general about MPI — that it runs one program as many cooperating processes, that it has to be built into the program, and when it is the right tool at all — is covered on [[Workflows/Multi-Process|Multi-Process Workflows]]. This page is the Intel-specific practice: which modules exist, how to launch, how the pinning controls differ from OpenMPI&#039;s, and one thing that catches people out on our AMD nodes.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Which should you use?&#039;&#039;&#039; Whichever your program was built with. That is not a dodge — mixing MPI implementations between build and run does not work, so in practice the software chooses for you. Where you genuinely have a choice, Intel MPI and MKL are the natural pairing for code that leans on Intel&#039;s maths libraries, and [[OpenMPI]] is the default for everything else here.&lt;br /&gt;
&lt;br /&gt;
== What is available on Anunna ==&lt;br /&gt;
&lt;br /&gt;
Software is built with [https://easybuild.io EasyBuild] and grouped into [[Environment Modules|buckets]]; a bucket has to be loaded before you can load anything from it. The Intel toolchain follows the same yearly generations as &amp;lt;code&amp;gt;foss&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Bucket !! Toolchain !! Contains&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;2023&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;intel/2023a&amp;lt;/code&amp;gt; || Intel compilers, Intel MPI, MKL&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;2024&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;intel/2024a&amp;lt;/code&amp;gt; || Intel compilers, Intel MPI, MKL&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;2025&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;intel/2025a&amp;lt;/code&amp;gt; || Intel compilers, Intel MPI, MKL&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;intel/&amp;lt;year&amp;gt;a&amp;lt;/code&amp;gt; is the counterpart of &amp;lt;code&amp;gt;foss/&amp;lt;year&amp;gt;a&amp;lt;/code&amp;gt;: one module that brings the whole stack — compilers, MPI, MKL and FFTW. There are leaner ways in, mirroring &amp;lt;code&amp;gt;gompi&amp;lt;/code&amp;gt; on the &amp;lt;code&amp;gt;foss&amp;lt;/code&amp;gt; side:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;iimpi/&amp;lt;year&amp;gt;a&amp;lt;/code&amp;gt;&#039;&#039;&#039; — Intel compilers and Intel MPI, without MKL. The lean choice when you only need MPI.&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;impi/&amp;lt;version&amp;gt;&amp;lt;/code&amp;gt;&#039;&#039;&#039; — the MPI library alone. In the 2025 bucket this is &amp;lt;code&amp;gt;impi/2021.15.0-intel-compilers-2025.1.1&amp;lt;/code&amp;gt;; note that Intel MPI&#039;s own version numbering (2021.x) does not track the toolchain year.&lt;br /&gt;
&lt;br /&gt;
To see what a bucket actually offers, ask the module system — &amp;lt;code&amp;gt;module key&amp;lt;/code&amp;gt; reads Lmod&#039;s cache, so it needs no bucket loaded and searches every bucket at once:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
module key intel      # the toolchains&lt;br /&gt;
module key impi       # the MPI library on its own&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Loading it ===&lt;br /&gt;
&lt;br /&gt;
Bucket first, then the module — the same two steps as any other software here:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
module load 2024 intel/2024a&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then confirm what you got, which is worth the habit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
module list           # everything loaded, dependencies included&lt;br /&gt;
mpirun -version       # which Intel MPI is on your PATH&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If your software has its own module, load &#039;&#039;&#039;that&#039;&#039;&#039; instead and let it pull the matching MPI in as a dependency. A package built with this toolchain has a name ending in &amp;lt;code&amp;gt;-intel-2024a&amp;lt;/code&amp;gt; or similar, which tells you what you are getting:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
module load 2024&lt;br /&gt;
module load &amp;lt;YourSoftware&amp;gt;/&amp;lt;version&amp;gt;    # Intel MPI arrives as a dependency&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Keep a job inside one bucket. Do not load &amp;lt;code&amp;gt;intel&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;foss&amp;lt;/code&amp;gt; in the same job — they provide competing compilers, MPI libraries and BLAS, and the result is unpredictable rather than merely slow. If you want a clean starting point, &amp;lt;code&amp;gt;module reset&amp;lt;/code&amp;gt; returns you to the system defaults; the &amp;lt;code&amp;gt;slurm&amp;lt;/code&amp;gt; module is &#039;&#039;sticky&#039;&#039; and survives it either way.&lt;br /&gt;
&lt;br /&gt;
== Running on a single node ==&lt;br /&gt;
&lt;br /&gt;
Nothing runs on the login nodes. Put the work in a script, keep data on Lustre under &amp;lt;code&amp;gt;$myScratch&amp;lt;/code&amp;gt;, and submit with &amp;lt;code&amp;gt;sbatch&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash -l&lt;br /&gt;
#SBATCH --job-name=impi_single&lt;br /&gt;
#SBATCH --nodes=1&lt;br /&gt;
#SBATCH --ntasks=64&lt;br /&gt;
#SBATCH --cpus-per-task=1&lt;br /&gt;
#SBATCH --mem-per-cpu=2G        # per CORE, not per node&lt;br /&gt;
#SBATCH --time=01:00:00&lt;br /&gt;
#SBATCH --output=%x-%j.out&lt;br /&gt;
&lt;br /&gt;
cd &amp;quot;$myScratch/my_simulation&amp;quot;&lt;br /&gt;
&lt;br /&gt;
module load 2024 intel/2024a&lt;br /&gt;
&lt;br /&gt;
mpirun -np ${SLURM_NTASKS} ./my_mpi_program --input data.nc&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Two things carried over from [[OpenMPI]], for the same reasons: pass &amp;lt;code&amp;gt;${SLURM_NTASKS}&amp;lt;/code&amp;gt; rather than hard-coding the rank count, and use &amp;lt;code&amp;gt;--mem-per-cpu&amp;lt;/code&amp;gt; rather than &amp;lt;code&amp;gt;--mem&amp;lt;/code&amp;gt;, which is a per-&#039;&#039;node&#039;&#039; request divided among all the ranks on that node.&lt;br /&gt;
&lt;br /&gt;
Note the &amp;lt;code&amp;gt;#!/bin/bash -l&amp;lt;/code&amp;gt;. A login shell is what initialises Lmod, so without it &amp;lt;code&amp;gt;module load&amp;lt;/code&amp;gt; can fail quietly. For the same reason, never launch an MPI job with &amp;lt;code&amp;gt;sbatch --wrap&amp;lt;/code&amp;gt; — that runs under &amp;lt;code&amp;gt;dash&amp;lt;/code&amp;gt;, where &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; does not exist.&lt;br /&gt;
&lt;br /&gt;
On one node the ranks talk through shared memory and there is nothing to configure.&lt;br /&gt;
&lt;br /&gt;
== Running across several nodes ==&lt;br /&gt;
&lt;br /&gt;
Anunna&#039;s fabric is &#039;&#039;&#039;Omni-Path (OPA100)&#039;&#039;&#039;, and both MPI implementations reach it through &#039;&#039;&#039;libfabric&#039;&#039;&#039;. The provider that works reliably here is &#039;&#039;&#039;&amp;lt;code&amp;gt;psm2&amp;lt;/code&amp;gt;&#039;&#039;&#039;; the &amp;lt;code&amp;gt;opx&amp;lt;/code&amp;gt; provider is broken for inter-node traffic on this hardware. So an inter-node job should name the provider rather than trust auto-selection:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash -l&lt;br /&gt;
#SBATCH --job-name=impi_multi&lt;br /&gt;
#SBATCH --nodes=4&lt;br /&gt;
#SBATCH --ntasks-per-node=64&lt;br /&gt;
#SBATCH --cpus-per-task=1&lt;br /&gt;
#SBATCH --mem-per-cpu=2G&lt;br /&gt;
#SBATCH --time=02:00:00&lt;br /&gt;
#SBATCH --output=%x-%j.out&lt;br /&gt;
&lt;br /&gt;
cd &amp;quot;$myScratch/my_simulation&amp;quot;&lt;br /&gt;
&lt;br /&gt;
module load 2024 intel/2024a&lt;br /&gt;
&lt;br /&gt;
mpirun -genv I_MPI_OFI_PROVIDER psm2 -genv FI_PROVIDER psm2 \&lt;br /&gt;
       -np ${SLURM_NTASKS} ./my_mpi_program --input data.nc&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To see what was actually selected — provider, pinning, rank layout — turn up Intel MPI&#039;s own diagnostics:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
export I_MPI_DEBUG=4&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
That prints the chosen fabric and the rank-to-core map at start-up, and is the fastest way to confirm a setting took effect instead of assuming it did.&lt;br /&gt;
&lt;br /&gt;
=== Getting variables to the other nodes ===&lt;br /&gt;
&lt;br /&gt;
Ranks on remote nodes are started fresh, so any variable your program or the fabric depends on has to reach them. Intel MPI&#039;s controls are:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Option !! Effect&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;-genv &amp;lt;VAR&amp;gt; &amp;lt;value&amp;gt;&amp;lt;/code&amp;gt; || Set one variable for &#039;&#039;&#039;all&#039;&#039;&#039; ranks. The explicit, always-safe form.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;-genvall&amp;lt;/code&amp;gt; || Pass the whole launching environment to all ranks. This is the default.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;-genvlist &amp;lt;a,b,c&amp;gt;&amp;lt;/code&amp;gt; || Pass only the named variables.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;-genvnone&amp;lt;/code&amp;gt; || Pass nothing.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In practice &#039;&#039;&#039;a plain &amp;lt;code&amp;gt;export&amp;lt;/code&amp;gt; in your job script does reach every rank&#039;&#039;&#039; — tested on Anunna across two nodes.&lt;br /&gt;
&lt;br /&gt;
It arrives whatever you do to stop it: restricting Intel MPI&#039;s own propagation with &amp;lt;code&amp;gt;-genvlist PATH&amp;lt;/code&amp;gt;, which should have excluded the test variable, delivered it to both nodes anyway. [[OpenMPI]] 5.0.7 behaved identically — with &amp;lt;code&amp;gt;-x&amp;lt;/code&amp;gt;, without it, and even with Slurm&#039;s own environment forwarding suppressed.&lt;br /&gt;
&lt;br /&gt;
The practical reading is that &#039;&#039;&#039;inside a Slurm allocation both implementations get your environment to the ranks&#039;&#039;&#039;, by way of the process-management layer (PMIx and the launcher&#039;s job description) rather than the batch environment. On the OpenMPI side that was pinned down: removing the variable from &amp;lt;code&amp;gt;mpirun&amp;lt;/code&amp;gt;&#039;s own environment is the only thing that stopped it arriving — see [[OpenMPI#Exporting variables to the other nodes: the -x flag|the OpenMPI page]] for the full result.&lt;br /&gt;
&lt;br /&gt;
None of which is worth depending on in a job script. It held for the current toolchains and not necessarily for older ones, so say what your run needs explicitly with &amp;lt;code&amp;gt;-genv&amp;lt;/code&amp;gt; and the question stops mattering.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;code&amp;gt;-genv&amp;lt;/code&amp;gt; is still the habit worth keeping&#039;&#039;&#039; for anything the run depends on, as in the script above. It does not rely on which layer happens to be propagating, it states the intent in the launch line, it survives a site or script that restricts propagation later, and it is the first thing to try if a variable does mysteriously fail to arrive.&lt;br /&gt;
&lt;br /&gt;
== Intel MPI, MKL, and our AMD nodes ==&lt;br /&gt;
&lt;br /&gt;
Most of Anunna&#039;s compute is AMD, and the Intel stack has a well-known wrinkle there. It is worth being precise about where it lives: &#039;&#039;&#039;the issue is in MKL, not in Intel MPI.&#039;&#039;&#039; But MKL arrives with the same &amp;lt;code&amp;gt;intel/&amp;lt;year&amp;gt;a&amp;lt;/code&amp;gt; module, and &amp;quot;our Intel build is slow on the AMD nodes&amp;quot; is usually this, so it belongs on this page.&lt;br /&gt;
&lt;br /&gt;
MKL checks the &#039;&#039;&#039;CPU vendor&#039;&#039;&#039; at run time. On a non-Intel CPU, kernels without specific Zen coverage can fall back to an &#039;&#039;&#039;SSE&#039;&#039;&#039; code path instead of using &#039;&#039;&#039;AVX2&#039;&#039;&#039;, leaving much of the vector width unused. This is still the behaviour in MKL 2025.x — it has not been quietly fixed. The old &amp;lt;code&amp;gt;MKL_DEBUG_CPU_TYPE&amp;lt;/code&amp;gt; workaround is gone, removed back in MKL 2020 Update 1, so anything you read recommending it is out of date.&lt;br /&gt;
&lt;br /&gt;
The current mitigation is a small shim, &#039;&#039;&#039;&amp;lt;code&amp;gt;libfakeintel.so&amp;lt;/code&amp;gt;&#039;&#039;&#039;, &amp;lt;code&amp;gt;LD_PRELOAD&amp;lt;/code&amp;gt;ed ahead of MKL. It overrides the vendor test (&amp;lt;code&amp;gt;mkl_serv_intel_cpu_true&amp;lt;/code&amp;gt;) so that it returns true, and MKL then dispatches its AVX2 kernels:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
export LD_PRELOAD=/path/to/libfakeintel.so&lt;br /&gt;
mpirun -np ${SLURM_NTASKS} ./my_mpi_program&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before assuming this is your problem, two things are worth checking, because often it is not. The shim only &#039;&#039;widens arithmetic&#039;&#039;, so it pays off when MKL is doing &#039;&#039;&#039;compute-bound Level-3 work&#039;&#039;&#039; such as &amp;lt;code&amp;gt;DGEMM&amp;lt;/code&amp;gt;. It does nothing when MKL is only handling bandwidth-bound Level-1/2 vector kernels, and nothing at all if your library does its own arithmetic — PETSc, for instance, performs its sparse matrix–vector products itself, so MKL never sees the dominant cost of a Krylov solve.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MKL_VERBOSE=1&amp;lt;/code&amp;gt; is the quick way to find out: it prints every MKL call, so you can see whether MKL is on your hot path at all and what it is being asked to do. Keep it off any run you intend to time — at high call counts the logging is itself a real cost.&lt;br /&gt;
&lt;br /&gt;
If MKL turns out to suit your workload poorly on the AMD nodes, the &amp;lt;code&amp;gt;foss&amp;lt;/code&amp;gt; toolchain&#039;s OpenBLAS-based BLAS is worth benchmarking against.&lt;br /&gt;
&lt;br /&gt;
== Advanced: pinning and rank placement ==&lt;br /&gt;
&lt;br /&gt;
Intel MPI and OpenMPI express placement differently: OpenMPI takes command-line flags, Intel MPI reads &amp;lt;code&amp;gt;I_MPI_*&amp;lt;/code&amp;gt; environment variables. The intents map across cleanly, so if you know one dialect this table gives you the other:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Intent !! Intel MPI !! OpenMPI&lt;br /&gt;
|-&lt;br /&gt;
| One rank per physical core, no migration || &amp;lt;code&amp;gt;I_MPI_PIN=1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;I_MPI_PIN_DOMAIN=core&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;--bind-to core&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Fill the node, neighbours adjacent || &amp;lt;code&amp;gt;I_MPI_PIN_ORDER=compact&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;--map-by core&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Under-subscribed, spread across all NUMA domains || &amp;lt;code&amp;gt;I_MPI_PIN_ORDER=scatter&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;--map-by numa --bind-to core&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| One rank per chiplet / L3 slice || &amp;lt;code&amp;gt;I_MPI_PIN_DOMAIN=cache3&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;--map-by l3cache --bind-to core&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Print the map actually used || &amp;lt;code&amp;gt;I_MPI_DEBUG=4&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;--report-bindings&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Three rules that matter more than the individual settings:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Verify, do not assume.&#039;&#039;&#039; Print the map with &amp;lt;code&amp;gt;I_MPI_DEBUG=4&amp;lt;/code&amp;gt; before and after any change. Placement bugs do not announce themselves; the job runs and is simply slower than it should be.&lt;br /&gt;
* &#039;&#039;&#039;One source of truth.&#039;&#039;&#039; Pin with the MPI launcher &#039;&#039;&#039;or&#039;&#039;&#039; with Slurm (&amp;lt;code&amp;gt;--cpu-bind&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--distribution&amp;lt;/code&amp;gt;), never both. Two pinners fighting each other produce a nonsense map.&lt;br /&gt;
* &#039;&#039;&#039;Spread suits memory-bound work.&#039;&#039;&#039; AMD sockets are built from 8-core chiplets, each with its own cache slice and share of the memory channels. A bandwidth-bound job saturates memory well before every core is busy, so spreading a reduced number of ranks across all NUMA domains keeps every memory channel active, while packing them together leaves most idle. Asking for ranks in multiples of 8 keeps chiplets evenly filled.&lt;br /&gt;
&lt;br /&gt;
For the reasoning behind that last point, and the equivalent OpenMPI syntax, see [[OpenMPI#Advanced: pinning and rank placement|the OpenMPI page]].&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[OpenMPI]] — the other MPI here, and the default for most software.&lt;br /&gt;
* [[Workflows/Multi-Process|Multi-Process Workflows]] — whether MPI is the right shape for your work.&lt;br /&gt;
* [[Environment Modules]] — buckets, and finding the module you need.&lt;br /&gt;
* [[Compute Hardware Overview]] — what the nodes actually are.&lt;br /&gt;
* [[Batch Jobs]] — writing and submitting job scripts.&lt;br /&gt;
* [[Scheduler Overview (Slurm)]] — how the scheduler allocates what you ask for.&lt;/div&gt;</summary>
		<author><name>Honfi001</name></author>
	</entry>
</feed>