diff --git a/about/index.html b/about/index.html
index fd70d665..1add1ab9 100644
--- a/about/index.html
+++ b/about/index.html
@@ -10,7 +10,7 @@
-
+
diff --git a/assets/js/04c65fe0.baf55ce2.js b/assets/js/04c65fe0.db5d8114.js
similarity index 99%
rename from assets/js/04c65fe0.baf55ce2.js
rename to assets/js/04c65fe0.db5d8114.js
index 57f4981f..795dd010 100644
--- a/assets/js/04c65fe0.baf55ce2.js
+++ b/assets/js/04c65fe0.db5d8114.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkgrc=self.webpackChunkgrc||[]).push([[8912],{8960:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>l,contentTitle:()=>a,default:()=>h,frontMatter:()=>r,metadata:()=>o,toc:()=>c});var t=s(5893),i=s(1151);const r={},a="Main Scenario",o={id:"hermes/main-scenario",title:"Main Scenario",description:"Hermes 1.1.0 is now available! [Download",source:"@site/docs/03-hermes/01-main-scenario.md",sourceDirName:"03-hermes",slug:"/hermes/main-scenario",permalink:"/docs/hermes/main-scenario",draft:!1,unlisted:!1,tags:[],version:"current",sidebarPosition:1,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Hermes",permalink:"/docs/category/hermes"},next:{title:"building-hermes",permalink:"/docs/hermes/building-hermes"}},l={},c=[{value:"How We Do It",id:"how-we-do-it",level:2},{value:"Other Scenarios and Use Cases",id:"other-scenarios-and-use-cases",level:2},{value:"Resources",id:"resources",level:2}];function d(e){const n={a:"a",admonition:"admonition",em:"em",h1:"h1",h2:"h2",img:"img",li:"li",p:"p",strong:"strong",ul:"ul",...(0,i.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"main-scenario",children:"Main Scenario"}),"\n",(0,t.jsx)(n.admonition,{type:"info",children:(0,t.jsxs)(n.p,{children:["Hermes ",(0,t.jsx)(n.strong,{children:"1.1.0"})," is now available! ",(0,t.jsx)(n.a,{href:"https://github.com/HDFGroup/hermes/releases",children:"Download\nnow"})," for the latest features and\nimprovements. For more information, visit the ",(0,t.jsx)(n.a,{href:"/research/projects/hermes",children:"Hermes project\npage"}),"."]})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"Deep Memory and Storage Hierarchy (DMSH)",src:s(2602).Z+"",width:"637",height:"408"})}),"\n",(0,t.jsxs)(n.p,{children:["Consider an HPC cluster equipped with a ",(0,t.jsx)(n.a,{href:"components/examples",children:"deep memory and storage\nhierarchy"})," (DMSH), the bottom layer of\nwhich is typically a parallel file system (PFS). DMSH was introduced to\nboost or to at least improve the I/O (POSIX, MPI-IO, HDF5, ...)\nperformance of applications performing poorly otherwise. Unfortunately,\nDMSH is not a turn-key solution and difficult to use from a developer's or user's\nperspective. It seems that users are expected to\ntake control, to learn all the necessary DMSH details, and to make the\nnecessary code changes. Even if successful, this is a distraction from\nsolving domain problems and, worse, it will be harder to maintain and\nport the application to other or future systems."]}),"\n",(0,t.jsxs)(n.p,{children:["The goal of the Hermes project is to provide a ",(0,t.jsx)(n.em,{children:"seamless"})," solution that\nutilizes DMSH none or minimal changes to applications."]}),"\n",(0,t.jsx)(n.p,{children:"(Even without a deep DMSH, determined users have created original\nsolutions to overcome I/O performance challenges. See use cases for an example. Many of them can be\nconsidered custom, i.e., application-specific, I/O buffering systems.)"}),"\n",(0,t.jsx)(n.h2,{id:"how-we-do-it",children:"How We Do It"}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"Hermes Core",src:s(5362).Z+"",width:"641",height:"593"})}),"\n",(0,t.jsxs)(n.p,{children:["We implement an ",(0,t.jsx)(n.em,{children:"I/O buffering system"}),"\nwith the following characteristics:"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Being seamless, it's a go-between for the by-and-large unmodified\napplications and the PFS. Applications will see a hopefully more\nperformant PFS."}),"\n",(0,t.jsx)(n.li,{children:"Users designate certain resources to be used for I/O buffering. Like\nmost buffering systems, it has a finite capacity. When that capacity\nis reached, the buffering system can no longer deliver noticeable\nbenefits and may perform as poorly as (or worse) than the unbuffered\nsystem (going to PFS)."}),"\n",(0,t.jsx)(n.li,{children:"Users express I/O priorities, constraints, and hints via buffering policies."}),"\n",(0,t.jsxs)(n.li,{children:["Given individual or batches of I/O operations (writes and reads),\nthe ",(0,t.jsx)(n.strong,{children:"main challenge"})," for such a buffering system is to determine\nwhere in DMSH a given data item is ",(0,t.jsx)("b",{children:"best/well/optimally-"}),"placed at\nthat point in time."]}),"\n",(0,t.jsxs)(n.li,{children:["To that end, the system consists of the following major components:","\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.a,{href:"components/data-placement",children:"Strategies and algorithms"})," that\nimplement policies and facilitate\ndata placement decisions. Speculative data\nplacement for read operations is also known as\n",(0,t.jsx)(n.a,{href:"components/prefetcher",children:"Prefetching"}),"."]}),"\n",(0,t.jsxs)(n.li,{children:["These strategies work with (dynamic) sets of ",(0,t.jsx)(n.a,{href:"components/buffering-target",children:"buffering\ntarget"}),"s and are applicable more\nbroadly."]}),"\n",(0,t.jsxs)(n.li,{children:["The physical buffering resources are managed in a distributed\n",(0,t.jsx)(n.a,{href:"components/buffer-pool",children:"Buffer Pool"})," (see also Batching\nSystem)."]}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"components/buffer-organizer",children:"Buffer Organizer"})}),"\n",(0,t.jsx)(n.li,{children:"Profiler"}),"\n",(0,t.jsxs)(n.li,{children:["To separate concerns and for portability, system buffers are\n",(0,t.jsx)(n.strong,{children:"not"})," directly exposed to applications. There is a set of\nintermediate primitives targeted by\n",(0,t.jsx)(n.a,{href:"adapters",children:"adapters"})," for different I/O libraries. A\ngeneric ",(0,t.jsx)(n.a,{href:"components/distributed-metadata",children:"metadata manager"})," (MDM),\nsupports the bookkeeping needs of the various components."]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.li,{children:"The whole system is deployed in a server-less fashion."}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Note"}),": A buffering system does ",(0,t.jsx)(n.strong,{children:"not"})," provide the same semantics as\nstorage."]}),"\n",(0,t.jsx)(n.h2,{id:"other-scenarios-and-use-cases",children:"Other Scenarios and Use Cases"}),"\n",(0,t.jsxs)(n.p,{children:["Our main scenario, a parallel application running on an HPC system and\nwriting files to a parallel file system, might be referred to as\noperating in Hermes ",(0,t.jsx)(n.strong,{children:"persistent mode."}),' This might be extended to\nmultiple applications "communicating" via the PFS. Another important\nscenario and set of use cases include applications that operate in a\nmore ',(0,t.jsx)(n.strong,{children:"transient mode"}),': they tend to produce massive amounts of\ntemporary data that need not be persisted in a PFS after the application\ncompletes. With DMSH, the use of PFS appears as a matter of last resort\n("out-of-core"), and an I/O buffering system might offer a more\nperformant solution.']}),"\n",(0,t.jsx)(n.p,{children:"DMSH are by no means limited to HPC clusters. Today, cloud-based VMs\nfrom major providers offer half a dozen or more storage options and\nmultiple interconnects. Since customers/users have the ability to\ncustomize the target system, it may seem that good I/O performance might\nbe a little easier to achieve. In practice, the picture is more\ncomplicated. For one, this is no longer just a technical decision, but\neconomic considerations (price and supply) play an important role. To\nwrite applications that perform well across a fleet of instance types\nand storage options is almost more challenging than to target a\nby-comparison stable HPC system. The concepts and techniques behind\nHermes are by no means specific to HPC systems and their suitability\nshould be examined in cloud-based environments."}),"\n",(0,t.jsx)(n.h2,{id:"resources",children:"Resources"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"https://par.nsf.gov/servlets/purl/10063843",children:"Hermes: a heterogeneous-aware multi-tiered distributed I/O\nbuffering system"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"https://drive.google.com/drive/u/0/folders/0ALuH0a_m3nGWUk9PVA",children:"Google\nDrive"})}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},5362:(e,n,s)=>{s.d(n,{Z:()=>t});const t=s.p+"assets/images/Hermes_Core_Lib_internals-75c6dbfaf190b4e42c765bee3c3dd82e.jpg"},2602:(e,n,s)=>{s.d(n,{Z:()=>t});const t=s.p+"assets/images/Hermes_hierachy-a8c0d5e9e044008fd19663a13df5bb02.jpg"},1151:(e,n,s)=>{s.d(n,{Z:()=>o,a:()=>a});var t=s(7294);const i={},r=t.createContext(i);function a(e){const n=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),t.createElement(r.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
+"use strict";(self.webpackChunkgrc=self.webpackChunkgrc||[]).push([[8912],{8960:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>l,contentTitle:()=>a,default:()=>h,frontMatter:()=>r,metadata:()=>o,toc:()=>c});var t=s(5893),i=s(1151);const r={},a="Main Scenario",o={id:"hermes/main-scenario",title:"Main Scenario",description:"Hermes 1.1.0 is now available! [Download",source:"@site/docs/03-hermes/01-main-scenario.md",sourceDirName:"03-hermes",slug:"/hermes/main-scenario",permalink:"/docs/hermes/main-scenario",draft:!1,unlisted:!1,tags:[],version:"current",sidebarPosition:1,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Hermes",permalink:"/docs/category/hermes"},next:{title:"Building Hermes",permalink:"/docs/hermes/building-hermes"}},l={},c=[{value:"How We Do It",id:"how-we-do-it",level:2},{value:"Other Scenarios and Use Cases",id:"other-scenarios-and-use-cases",level:2},{value:"Resources",id:"resources",level:2}];function d(e){const n={a:"a",admonition:"admonition",em:"em",h1:"h1",h2:"h2",img:"img",li:"li",p:"p",strong:"strong",ul:"ul",...(0,i.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"main-scenario",children:"Main Scenario"}),"\n",(0,t.jsx)(n.admonition,{type:"info",children:(0,t.jsxs)(n.p,{children:["Hermes ",(0,t.jsx)(n.strong,{children:"1.1.0"})," is now available! ",(0,t.jsx)(n.a,{href:"https://github.com/HDFGroup/hermes/releases",children:"Download\nnow"})," for the latest features and\nimprovements. For more information, visit the ",(0,t.jsx)(n.a,{href:"/research/projects/hermes",children:"Hermes project\npage"}),"."]})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"Deep Memory and Storage Hierarchy (DMSH)",src:s(2602).Z+"",width:"637",height:"408"})}),"\n",(0,t.jsxs)(n.p,{children:["Consider an HPC cluster equipped with a ",(0,t.jsx)(n.a,{href:"components/examples",children:"deep memory and storage\nhierarchy"})," (DMSH), the bottom layer of\nwhich is typically a parallel file system (PFS). DMSH was introduced to\nboost or to at least improve the I/O (POSIX, MPI-IO, HDF5, ...)\nperformance of applications performing poorly otherwise. Unfortunately,\nDMSH is not a turn-key solution and difficult to use from a developer's or user's\nperspective. It seems that users are expected to\ntake control, to learn all the necessary DMSH details, and to make the\nnecessary code changes. Even if successful, this is a distraction from\nsolving domain problems and, worse, it will be harder to maintain and\nport the application to other or future systems."]}),"\n",(0,t.jsxs)(n.p,{children:["The goal of the Hermes project is to provide a ",(0,t.jsx)(n.em,{children:"seamless"})," solution that\nutilizes DMSH none or minimal changes to applications."]}),"\n",(0,t.jsx)(n.p,{children:"(Even without a deep DMSH, determined users have created original\nsolutions to overcome I/O performance challenges. See use cases for an example. Many of them can be\nconsidered custom, i.e., application-specific, I/O buffering systems.)"}),"\n",(0,t.jsx)(n.h2,{id:"how-we-do-it",children:"How We Do It"}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"Hermes Core",src:s(5362).Z+"",width:"641",height:"593"})}),"\n",(0,t.jsxs)(n.p,{children:["We implement an ",(0,t.jsx)(n.em,{children:"I/O buffering system"}),"\nwith the following characteristics:"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Being seamless, it's a go-between for the by-and-large unmodified\napplications and the PFS. Applications will see a hopefully more\nperformant PFS."}),"\n",(0,t.jsx)(n.li,{children:"Users designate certain resources to be used for I/O buffering. Like\nmost buffering systems, it has a finite capacity. When that capacity\nis reached, the buffering system can no longer deliver noticeable\nbenefits and may perform as poorly as (or worse) than the unbuffered\nsystem (going to PFS)."}),"\n",(0,t.jsx)(n.li,{children:"Users express I/O priorities, constraints, and hints via buffering policies."}),"\n",(0,t.jsxs)(n.li,{children:["Given individual or batches of I/O operations (writes and reads),\nthe ",(0,t.jsx)(n.strong,{children:"main challenge"})," for such a buffering system is to determine\nwhere in DMSH a given data item is ",(0,t.jsx)("b",{children:"best/well/optimally-"}),"placed at\nthat point in time."]}),"\n",(0,t.jsxs)(n.li,{children:["To that end, the system consists of the following major components:","\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.a,{href:"components/data-placement",children:"Strategies and algorithms"})," that\nimplement policies and facilitate\ndata placement decisions. Speculative data\nplacement for read operations is also known as\n",(0,t.jsx)(n.a,{href:"components/prefetcher",children:"Prefetching"}),"."]}),"\n",(0,t.jsxs)(n.li,{children:["These strategies work with (dynamic) sets of ",(0,t.jsx)(n.a,{href:"components/buffering-target",children:"buffering\ntarget"}),"s and are applicable more\nbroadly."]}),"\n",(0,t.jsxs)(n.li,{children:["The physical buffering resources are managed in a distributed\n",(0,t.jsx)(n.a,{href:"components/buffer-pool",children:"Buffer Pool"})," (see also Batching\nSystem)."]}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"components/buffer-organizer",children:"Buffer Organizer"})}),"\n",(0,t.jsx)(n.li,{children:"Profiler"}),"\n",(0,t.jsxs)(n.li,{children:["To separate concerns and for portability, system buffers are\n",(0,t.jsx)(n.strong,{children:"not"})," directly exposed to applications. There is a set of\nintermediate primitives targeted by\n",(0,t.jsx)(n.a,{href:"adapters",children:"adapters"})," for different I/O libraries. A\ngeneric ",(0,t.jsx)(n.a,{href:"components/distributed-metadata",children:"metadata manager"})," (MDM),\nsupports the bookkeeping needs of the various components."]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.li,{children:"The whole system is deployed in a server-less fashion."}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Note"}),": A buffering system does ",(0,t.jsx)(n.strong,{children:"not"})," provide the same semantics as\nstorage."]}),"\n",(0,t.jsx)(n.h2,{id:"other-scenarios-and-use-cases",children:"Other Scenarios and Use Cases"}),"\n",(0,t.jsxs)(n.p,{children:["Our main scenario, a parallel application running on an HPC system and\nwriting files to a parallel file system, might be referred to as\noperating in Hermes ",(0,t.jsx)(n.strong,{children:"persistent mode."}),' This might be extended to\nmultiple applications "communicating" via the PFS. Another important\nscenario and set of use cases include applications that operate in a\nmore ',(0,t.jsx)(n.strong,{children:"transient mode"}),': they tend to produce massive amounts of\ntemporary data that need not be persisted in a PFS after the application\ncompletes. With DMSH, the use of PFS appears as a matter of last resort\n("out-of-core"), and an I/O buffering system might offer a more\nperformant solution.']}),"\n",(0,t.jsx)(n.p,{children:"DMSH are by no means limited to HPC clusters. Today, cloud-based VMs\nfrom major providers offer half a dozen or more storage options and\nmultiple interconnects. Since customers/users have the ability to\ncustomize the target system, it may seem that good I/O performance might\nbe a little easier to achieve. In practice, the picture is more\ncomplicated. For one, this is no longer just a technical decision, but\neconomic considerations (price and supply) play an important role. To\nwrite applications that perform well across a fleet of instance types\nand storage options is almost more challenging than to target a\nby-comparison stable HPC system. The concepts and techniques behind\nHermes are by no means specific to HPC systems and their suitability\nshould be examined in cloud-based environments."}),"\n",(0,t.jsx)(n.h2,{id:"resources",children:"Resources"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"https://par.nsf.gov/servlets/purl/10063843",children:"Hermes: a heterogeneous-aware multi-tiered distributed I/O\nbuffering system"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"https://drive.google.com/drive/u/0/folders/0ALuH0a_m3nGWUk9PVA",children:"Google\nDrive"})}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},5362:(e,n,s)=>{s.d(n,{Z:()=>t});const t=s.p+"assets/images/Hermes_Core_Lib_internals-75c6dbfaf190b4e42c765bee3c3dd82e.jpg"},2602:(e,n,s)=>{s.d(n,{Z:()=>t});const t=s.p+"assets/images/Hermes_hierachy-a8c0d5e9e044008fd19663a13df5bb02.jpg"},1151:(e,n,s)=>{s.d(n,{Z:()=>o,a:()=>a});var t=s(7294);const i={},r=t.createContext(i);function a(e){const n=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),t.createElement(r.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/14268422.82c2d7dc.js b/assets/js/14268422.82c2d7dc.js
deleted file mode 100644
index 4689c92d..00000000
--- a/assets/js/14268422.82c2d7dc.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkgrc=self.webpackChunkgrc||[]).push([[8893],{9121:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>o,contentTitle:()=>l,default:()=>h,frontMatter:()=>a,metadata:()=>t,toc:()=>d});var r=i(5893),s=i(1151);const a={},l=void 0,t={id:"hermes/deploying-hermes",title:"deploying-hermes",description:"Configuring + Deploying Hermes",source:"@site/docs/03-hermes/03-deploying-hermes.md",sourceDirName:"03-hermes",slug:"/hermes/deploying-hermes",permalink:"/docs/hermes/deploying-hermes",draft:!1,unlisted:!1,tags:[],version:"current",sidebarPosition:3,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"building-hermes",permalink:"/docs/hermes/building-hermes"},next:{title:"Configuration",permalink:"/docs/hermes/configuration"}},o={},d=[{value:"Configuring + Deploying Hermes",id:"configuring--deploying-hermes",level:2},{value:"Install Jarvis",id:"install-jarvis",level:3},{value:"Initialize Jarvis",id:"initialize-jarvis",level:3},{value:"Build a Resource Graph",id:"build-a-resource-graph",level:3},{value:"Bootstrapping from an existing machine",id:"bootstrapping-from-an-existing-machine",level:4},{value:"Building a new resource graph",id:"building-a-new-resource-graph",level:4},{value:"Building an Environment",id:"building-an-environment",level:3},{value:"Set the active Hostfile",id:"set-the-active-hostfile",level:3},{value:"Create an empty pipeline",id:"create-an-empty-pipeline",level:4},{value:"Copy the environment cache",id:"copy-the-environment-cache",level:4},{value:"Add Hermes runtime",id:"add-hermes-runtime",level:4},{value:"Starting + Stopping Hermes",id:"starting--stopping-hermes",level:2},{value:"Stopping and Killing Hermes",id:"stopping-and-killing-hermes",level:2},{value:"Cleanup",id:"cleanup",level:2},{value:"Configuring + Deploying Hermes with an Application",id:"configuring--deploying-hermes-with-an-application",level:2},{value:"Build an Environment",id:"build-an-environment",level:3},{value:"Create an empty pipeline",id:"create-an-empty-pipeline-1",level:3},{value:"Copy the environment cache",id:"copy-the-environment-cache-1",level:3},{value:"Set the active hostfile",id:"set-the-active-hostfile-1",level:3},{value:"Add Hermes runtime",id:"add-hermes-runtime-1",level:3},{value:"Add Hermes MPI-IO interceptor",id:"add-hermes-mpi-io-interceptor",level:3},{value:"Add IOR",id:"add-ior",level:3},{value:"Run the Pipeline",id:"run-the-pipeline",level:3},{value:"Cleanup",id:"cleanup-1",level:3}];function c(e){const n={a:"a",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,s.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h2,{id:"configuring--deploying-hermes",children:"Configuring + Deploying Hermes"}),"\n",(0,r.jsxs)(n.p,{children:["The Hermes daemon is responsible for tracking various metadata, and it is\nrequired to be launched before your application. There should only be\none Hermes daemon per node. We recommend\n",(0,r.jsx)(n.a,{href:"https://github.com/grc-iit/jarvis-cd.git",children:"Jarvis"})," for deploying Hermes.\nJarvis is a framework that configures and deploys complex applications and\nservices. Jarvis will automatically set various environment variables\nthat Hermes expects in order for applications to be deployed. We have\nalso integrated several applications into Jarvis that can be seamlessly\ndeployed with Hermes."]}),"\n",(0,r.jsx)(n.h3,{id:"install-jarvis",children:"Install Jarvis"}),"\n",(0,r.jsx)(n.p,{children:"To install jarvis, do the following:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"export JARVIS_PATH=${PWD}/jarvis-cd\ngit clone https://github.com/grc-iit/jarvis-cd.git ${JARVIS_PATH}\ncd ${JARVIS_PATH}\npip install -e .\n"})}),"\n",(0,r.jsx)(n.h3,{id:"initialize-jarvis",children:"Initialize Jarvis"}),"\n",(0,r.jsxs)(n.p,{children:["After installing, Jarvis MUST be configured for your specific system. The first\nstep is to define places for storing Jarvis configuration data. Note that large data\nobjects are ",(0,r.jsx)(n.strong,{children:"never"})," intended to be stored in these directories."]}),"\n",(0,r.jsx)(n.p,{children:"There are three places where configuration data is stored:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"CONFIG_DIR: A directory where jarvis metadata for pkgs and pipelines are stored. This\ndirectory can be anywhere that the current user can access."}),"\n",(0,r.jsx)(n.li,{children:"PRIVATE_DIR: A directory which is common across all machines, but stores data locally to the\nmachine. Some jarvis pkgs require certain data to be stored per-machine. /tmp\nwould be an example."}),"\n",(0,r.jsx)(n.li,{children:"SHARED_DIR: A directory which is common across all machines, where each machine has the same\nview of data in the directory. In a supercomputing site, this would typically be\nin your home directory."}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Make sure that all these paths are absolute paths."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"jarvis init [CONFIG_DIR] [PRIVATE_DIR] [SHARED_DIR]\n"})}),"\n",(0,r.jsx)(n.h3,{id:"build-a-resource-graph",children:"Build a Resource Graph"}),"\n",(0,r.jsx)(n.p,{children:"A resource graph contains the storage and networking configuration\nof the machines you intend to deploy Hermes on."}),"\n",(0,r.jsx)(n.h4,{id:"bootstrapping-from-an-existing-machine",children:"Bootstrapping from an existing machine"}),"\n",(0,r.jsxs)(n.p,{children:["We have several resource graphs for different machines, located under\n",(0,r.jsx)(n.code,{children:"${JARVIS_PATH}/builtin/resource_graph"}),". There are resource graphs\nfor different machines spanning IIT, PNNL, and Argonne. To view the\nset of preconfigured machines, run:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"ls ${JARVIS_PATH}/builtin/resource_graph\n"})}),"\n",(0,r.jsx)(n.p,{children:"If one of your machines is there, then do:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"jarvis bootstrap from [MY_MACHINE]\n"})}),"\n",(0,r.jsx)(n.p,{children:"For example, ares is one of the machines:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"jarvis bootstrap from ares\n"})}),"\n",(0,r.jsx)(n.h4,{id:"building-a-new-resource-graph",children:"Building a new resource graph"}),"\n",(0,r.jsx)(n.p,{children:"If a resource graph for your machine is not available, you will have to\ndefine one manually."}),"\n",(0,r.jsxs)(n.p,{children:["The resource graph ",(0,r.jsx)(n.strong,{children:"must"})," be created at exactly the following path:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"${JARVIS_PATH}/config/resource_graph.yaml\n"})}),"\n",(0,r.jsx)(n.p,{children:"For storage devices, the required parameters are as follows:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",children:"fs:\n - avail: 500G # Available capacity of the device (Suffix: K,G,T,P)\n dev_type: ssd # Type of storage hardware (hdd, ssd, nvme, pmem)\n mount: /mnt/ssd/${USER} # Where to place data on the device\n shared: false # Is this shared across nodes (e.g., a PFS?)\n"})}),"\n",(0,r.jsx)(n.p,{children:"For networks, the parameters are as follows:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",children:"net:\n - domain: lo # Domain of network. Can be null.\n fabric: 127.0.0.1/32\n provider: tcp;ofi_rxm\n shared: false # Is this network shared across nodes. E.g., localhost is not\n speed: 40G\n"})}),"\n",(0,r.jsxs)(n.p,{children:["This information can be discovered using tools such as ",(0,r.jsx)(n.code,{children:"fi_info"})," provided by libfabric. The fi_info tool is extremely verbose and requires some expertise to understand. fi_info outputs several networks -- most of which are irrelevant. Many networks printed may only function in single-node cases -- or not at all."]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"The most important information to determine a relevant network is domain, fabric, and provider."}),"\n",(0,r.jsxs)(n.li,{children:["Networks with the ",(0,r.jsx)(n.strong,{children:"lo"})," domain or with fabrics equivalent to 127.0.0.1 will only function in single-node cases."]}),"\n",(0,r.jsxs)(n.li,{children:["Fabrics ending with the format *.0.0.0 will ",(0,r.jsx)(n.strong,{children:"NOT"})," work. These are ",(0,r.jsx)(n.em,{children:"network"})," addresses, not ",(0,r.jsx)(n.em,{children:"host"})," addreses. For example, 127.0.0.0 comes up sometimes in the fi_info output."]}),"\n",(0,r.jsx)(n.li,{children:"Networks where the fabric is not a number are generally irrelevant and will not function when used. For example:"}),"\n"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",children:"# This provider is not relevant\nprovider: UDP\nfabric: UDP-IP\ndomain: udp\nversion: 1.1\ntype: FI_EP_DGRAM\nprotocol: FI_PROTO_UDP\n"})}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["One way to filter out dysfunctional fi_info outputs is to use ",(0,r.jsx)(n.code,{children:"ip addr show"})," (or ",(0,r.jsx)(n.code,{children:"fi_info | grep fabric"}),") to list available IP addresses. Do this on two separate machines, compare their output, and then look at only the IP addresses that are similar between the machines. If you can ssh between the machines using these IP addresses, then you should focus on only those fabrics matching their pattern in the fi_info output"]}),"\n",(0,r.jsx)(n.li,{children:"Be careful about the providers. It has come up plenty of times where a provider is listed, but doesn't actually work. Verbs, for example, may fail if your Hermes installation was not correctly configured to support RDMA. This is a guess-and-check game. TCP and Sockets are generally a safe bet. It may be of benefit to try just these providers and get a distributed deployment of Hermes functioning before moving on to verbs."}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"building-an-environment",children:"Building an Environment"}),"\n",(0,r.jsx)(n.p,{children:"We will now load all necessary environment variables and build a\nJarvis environment named hermes_env:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"spack load hermes\njarvis env build hermes_env\n"})}),"\n",(0,r.jsx)(n.p,{children:"hermes_env will store all important environment variables, including PATH,\nLD_LIBRARY_PATH, etc. in a YAML file. This will make it so that you do not\nneed to repeatedly run spack load and module load if the machine is broken."}),"\n",(0,r.jsx)(n.h3,{id:"set-the-active-hostfile",children:"Set the active Hostfile"}),"\n",(0,r.jsx)(n.p,{children:"The hostfile contains the set of nodes that the pipeline will run over.\nThis is structured the same way as a traditional MPI hostfile."}),"\n",(0,r.jsx)(n.p,{children:"An example hostfile:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-txt",children:"ares-comp-20\nares-comp-[21-25]\n"})}),"\n",(0,r.jsx)(n.p,{children:"To set the active hostfile, run:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"jarvis hostfile set /path/to/hostfile\n"})}),"\n",(0,r.jsx)(n.p,{children:"Note that every time you change the hostfile, you will need to update the\npipeline. Jarvis does not automatically detect changes to this file."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"jarvis pipeline update\n"})}),"\n",(0,r.jsx)(n.h4,{id:"create-an-empty-pipeline",children:"Create an empty pipeline"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"jarvis pipeline create hermes\n"})}),"\n",(0,r.jsx)(n.p,{children:"hermes is the name of the pipeline. It doesn't need to be hermes,\nit can be any name."}),"\n",(0,r.jsx)(n.h4,{id:"copy-the-environment-cache",children:"Copy the environment cache"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"jarvis pipeline env copy hermes_env\n"})}),"\n",(0,r.jsx)(n.p,{children:"This will use the hermes_env environment that was previously created in"}),"\n",(0,r.jsx)(n.h4,{id:"add-hermes-runtime",children:"Add Hermes runtime"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"jarvis pipeline append hermes_run\njarvis pkg configure hermes_run \\\nsleep=5 \\\ninclude=${HOME}/ior_data\n"})}),"\n",(0,r.jsx)(n.p,{children:"Jarvis will automatically produce a Hermes client and server configuration that\ncontains all storage devices and fastest available network defined in the\nresource graph. These configurations will be located in:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"$(jarvis path +shared)/hermes_run/hermes_server.yaml\n$(jarvis path +shared)/hermes_run/hermes_client.yaml\n"})}),"\n",(0,r.jsx)(n.h2,{id:"starting--stopping-hermes",children:"Starting + Stopping Hermes"}),"\n",(0,r.jsx)(n.p,{children:"To start Hermes:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"jarvis pipeline start\n"})}),"\n",(0,r.jsx)(n.h2,{id:"stopping-and-killing-hermes",children:"Stopping and Killing Hermes"}),"\n",(0,r.jsx)(n.p,{children:"To gracefully stop Hermes and flush data back to the PFS:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"jarvis pipeline stop\n"})}),"\n",(0,r.jsx)(n.p,{children:"To kill a Hermes deployment that isn't stopping gracefully:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"jarvis pipeline kill\n"})}),"\n",(0,r.jsx)(n.h2,{id:"cleanup",children:"Cleanup"}),"\n",(0,r.jsx)(n.p,{children:"To erase data produced by the pipeline:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"jarvis pipeline clean\n"})}),"\n",(0,r.jsx)(n.p,{children:"To destroy the pipeline:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"jarvis pipeline destroy\n"})}),"\n",(0,r.jsx)(n.h2,{id:"configuring--deploying-hermes-with-an-application",children:"Configuring + Deploying Hermes with an Application"}),"\n",(0,r.jsx)(n.p,{children:"As previously stated, Jarvis can be used to deploy and application\nwith Hermes. This will automatically set environment variables\n(e.g., LD_PRELOAD) that will be necessary for the application to\nrun."}),"\n",(0,r.jsx)(n.h3,{id:"build-an-environment",children:"Build an Environment"}),"\n",(0,r.jsx)(n.p,{children:"We will now load all necessary environment variables and build a\nJarvis environment named hermes_env:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"spack load hermes\nspack load ior\njarvis env build hermes_ior_env\n"})}),"\n",(0,r.jsx)(n.p,{children:"hermes_ior_env will store all important environment variables, including PATH,\nLD_LIBRARY_PATH, etc. in a YAML file."}),"\n",(0,r.jsx)(n.h3,{id:"create-an-empty-pipeline-1",children:"Create an empty pipeline"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"jarvis pipeline create hermes_ior\n"})}),"\n",(0,r.jsx)(n.h3,{id:"copy-the-environment-cache-1",children:"Copy the environment cache"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"jarvis pipeline env copy hermes_ior_env\n"})}),"\n",(0,r.jsx)(n.h3,{id:"set-the-active-hostfile-1",children:"Set the active hostfile"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"jarvis hostfile set /path/to/hostfile\n"})}),"\n",(0,r.jsx)(n.h3,{id:"add-hermes-runtime-1",children:"Add Hermes runtime"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"jarvis pipeline append hermes_run\njarvis pkg configure hermes_run \\\nsleep=5 \\\ninclude=${HOME}/ior_data\n"})}),"\n",(0,r.jsxs)(n.p,{children:["This will ensure that if a Hermes interceptor is used, it will intercept\nall paths in ",(0,r.jsx)(n.code,{children:"${HOME}/ior_data"}),"."]}),"\n",(0,r.jsx)(n.h3,{id:"add-hermes-mpi-io-interceptor",children:"Add Hermes MPI-IO interceptor"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"jarvis pipeline append hermes_api\njarvis pkg configure hermes_api +mpi\n"})}),"\n",(0,r.jsx)(n.p,{children:"This will automatically locate the interceptor library by\ntraversing various environment variables. This will ensure\nthat MPI-IO is intercepted by Hermes."}),"\n",(0,r.jsx)(n.h3,{id:"add-ior",children:"Add IOR"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"jarvis pipeline append ior\njarvis pkg configure ior \\\nxfer=1m \\\nblock=1g \\\nnprocs=64 \\\nppn=16 \\\n+write +read \\\nout=${HOME}/ior_data/ior.bin \\\napi=mpiio\n"})}),"\n",(0,r.jsxs)(n.p,{children:["This IOR will perform 1GB of I/O per-process (block) in units of 1m (xfer) and\nproduce a single output file ",(0,r.jsx)(n.code,{children:"${HOME}/ior_data/ior.bin"}),"(out) using MPI-IO\n(api). The total amount of I/O performed will be 64GB spread across 4 nodes."]}),"\n",(0,r.jsx)(n.h3,{id:"run-the-pipeline",children:"Run the Pipeline"}),"\n",(0,r.jsx)(n.p,{children:"To run the pipeline:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"jarvis pipeline run\n"})}),"\n",(0,r.jsx)(n.p,{children:"This will launch Hermes, execute IOR, and then stop Hermes. It is equivalent\nto:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"jarvis pipeline start\njarvis pipeline stop\n"})}),"\n",(0,r.jsx)(n.h3,{id:"cleanup-1",children:"Cleanup"}),"\n",(0,r.jsx)(n.p,{children:"The following will delete intermediate data generated by Hermes + IOR:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"jarvis pipeline clean\n"})})]})}function h(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},1151:(e,n,i)=>{i.d(n,{Z:()=>t,a:()=>l});var r=i(7294);const s={},a=r.createContext(s);function l(e){const n=r.useContext(a);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function t(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:l(e.components),r.createElement(a.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/14268422.9a02b932.js b/assets/js/14268422.9a02b932.js
new file mode 100644
index 00000000..6089bc56
--- /dev/null
+++ b/assets/js/14268422.9a02b932.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkgrc=self.webpackChunkgrc||[]).push([[8893],{9121:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>o,contentTitle:()=>l,default:()=>h,frontMatter:()=>a,metadata:()=>t,toc:()=>d});var r=i(5893),s=i(1151);const a={},l="Deploying Hermes",t={id:"hermes/deploying-hermes",title:"Deploying Hermes",description:"Configuring + Deploying Hermes",source:"@site/docs/03-hermes/03-deploying-hermes.md",sourceDirName:"03-hermes",slug:"/hermes/deploying-hermes",permalink:"/docs/hermes/deploying-hermes",draft:!1,unlisted:!1,tags:[],version:"current",sidebarPosition:3,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Building Hermes",permalink:"/docs/hermes/building-hermes"},next:{title:"Configuration",permalink:"/docs/hermes/configuration"}},o={},d=[{value:"Configuring + Deploying Hermes",id:"configuring--deploying-hermes",level:2},{value:"Install Jarvis",id:"install-jarvis",level:3},{value:"Initialize Jarvis",id:"initialize-jarvis",level:3},{value:"Build a Resource Graph",id:"build-a-resource-graph",level:3},{value:"Bootstrapping from an existing machine",id:"bootstrapping-from-an-existing-machine",level:4},{value:"Building a new resource graph",id:"building-a-new-resource-graph",level:4},{value:"Building an Environment",id:"building-an-environment",level:3},{value:"Set the active Hostfile",id:"set-the-active-hostfile",level:3},{value:"Create an empty pipeline",id:"create-an-empty-pipeline",level:4},{value:"Copy the environment cache",id:"copy-the-environment-cache",level:4},{value:"Add Hermes runtime",id:"add-hermes-runtime",level:4},{value:"Starting + Stopping Hermes",id:"starting--stopping-hermes",level:2},{value:"Stopping and Killing Hermes",id:"stopping-and-killing-hermes",level:2},{value:"Cleanup",id:"cleanup",level:2},{value:"Configuring + Deploying Hermes with an Application",id:"configuring--deploying-hermes-with-an-application",level:2},{value:"Build an Environment",id:"build-an-environment",level:3},{value:"Create an empty pipeline",id:"create-an-empty-pipeline-1",level:3},{value:"Copy the environment cache",id:"copy-the-environment-cache-1",level:3},{value:"Set the active hostfile",id:"set-the-active-hostfile-1",level:3},{value:"Add Hermes runtime",id:"add-hermes-runtime-1",level:3},{value:"Add Hermes MPI-IO interceptor",id:"add-hermes-mpi-io-interceptor",level:3},{value:"Add IOR",id:"add-ior",level:3},{value:"Run the Pipeline",id:"run-the-pipeline",level:3},{value:"Cleanup",id:"cleanup-1",level:3}];function c(e){const n={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,s.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h1,{id:"deploying-hermes",children:"Deploying Hermes"}),"\n",(0,r.jsx)(n.h2,{id:"configuring--deploying-hermes",children:"Configuring + Deploying Hermes"}),"\n",(0,r.jsxs)(n.p,{children:["The Hermes daemon is responsible for tracking various metadata, and it is\nrequired to be launched before your application. There should only be\none Hermes daemon per node. We recommend\n",(0,r.jsx)(n.a,{href:"https://github.com/grc-iit/jarvis-cd.git",children:"Jarvis"})," for deploying Hermes.\nJarvis is a framework that configures and deploys complex applications and\nservices. Jarvis will automatically set various environment variables\nthat Hermes expects in order for applications to be deployed. We have\nalso integrated several applications into Jarvis that can be seamlessly\ndeployed with Hermes."]}),"\n",(0,r.jsx)(n.h3,{id:"install-jarvis",children:"Install Jarvis"}),"\n",(0,r.jsx)(n.p,{children:"To install jarvis, do the following:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"export JARVIS_PATH=${PWD}/jarvis-cd\ngit clone https://github.com/grc-iit/jarvis-cd.git ${JARVIS_PATH}\ncd ${JARVIS_PATH}\npip install -e .\n"})}),"\n",(0,r.jsx)(n.h3,{id:"initialize-jarvis",children:"Initialize Jarvis"}),"\n",(0,r.jsxs)(n.p,{children:["After installing, Jarvis MUST be configured for your specific system. The first\nstep is to define places for storing Jarvis configuration data. Note that large data\nobjects are ",(0,r.jsx)(n.strong,{children:"never"})," intended to be stored in these directories."]}),"\n",(0,r.jsx)(n.p,{children:"There are three places where configuration data is stored:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"CONFIG_DIR: A directory where jarvis metadata for pkgs and pipelines are stored. This\ndirectory can be anywhere that the current user can access."}),"\n",(0,r.jsx)(n.li,{children:"PRIVATE_DIR: A directory which is common across all machines, but stores data locally to the\nmachine. Some jarvis pkgs require certain data to be stored per-machine. /tmp\nwould be an example."}),"\n",(0,r.jsx)(n.li,{children:"SHARED_DIR: A directory which is common across all machines, where each machine has the same\nview of data in the directory. In a supercomputing site, this would typically be\nin your home directory."}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Make sure that all these paths are absolute paths."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"jarvis init [CONFIG_DIR] [PRIVATE_DIR] [SHARED_DIR]\n"})}),"\n",(0,r.jsx)(n.h3,{id:"build-a-resource-graph",children:"Build a Resource Graph"}),"\n",(0,r.jsx)(n.p,{children:"A resource graph contains the storage and networking configuration\nof the machines you intend to deploy Hermes on."}),"\n",(0,r.jsx)(n.h4,{id:"bootstrapping-from-an-existing-machine",children:"Bootstrapping from an existing machine"}),"\n",(0,r.jsxs)(n.p,{children:["We have several resource graphs for different machines, located under\n",(0,r.jsx)(n.code,{children:"${JARVIS_PATH}/builtin/resource_graph"}),". There are resource graphs\nfor different machines spanning IIT, PNNL, and Argonne. To view the\nset of preconfigured machines, run:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"ls ${JARVIS_PATH}/builtin/resource_graph\n"})}),"\n",(0,r.jsx)(n.p,{children:"If one of your machines is there, then do:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"jarvis bootstrap from [MY_MACHINE]\n"})}),"\n",(0,r.jsx)(n.p,{children:"For example, ares is one of the machines:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"jarvis bootstrap from ares\n"})}),"\n",(0,r.jsx)(n.h4,{id:"building-a-new-resource-graph",children:"Building a new resource graph"}),"\n",(0,r.jsx)(n.p,{children:"If a resource graph for your machine is not available, you will have to\ndefine one manually."}),"\n",(0,r.jsxs)(n.p,{children:["The resource graph ",(0,r.jsx)(n.strong,{children:"must"})," be created at exactly the following path:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"${JARVIS_PATH}/config/resource_graph.yaml\n"})}),"\n",(0,r.jsx)(n.p,{children:"For storage devices, the required parameters are as follows:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",children:"fs:\n - avail: 500G # Available capacity of the device (Suffix: K,G,T,P)\n dev_type: ssd # Type of storage hardware (hdd, ssd, nvme, pmem)\n mount: /mnt/ssd/${USER} # Where to place data on the device\n shared: false # Is this shared across nodes (e.g., a PFS?)\n"})}),"\n",(0,r.jsx)(n.p,{children:"For networks, the parameters are as follows:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",children:"net:\n - domain: lo # Domain of network. Can be null.\n fabric: 127.0.0.1/32\n provider: tcp;ofi_rxm\n shared: false # Is this network shared across nodes. E.g., localhost is not\n speed: 40G\n"})}),"\n",(0,r.jsxs)(n.p,{children:["This information can be discovered using tools such as ",(0,r.jsx)(n.code,{children:"fi_info"})," provided by libfabric. The fi_info tool is extremely verbose and requires some expertise to understand. fi_info outputs several networks -- most of which are irrelevant. Many networks printed may only function in single-node cases -- or not at all."]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"The most important information to determine a relevant network is domain, fabric, and provider."}),"\n",(0,r.jsxs)(n.li,{children:["Networks with the ",(0,r.jsx)(n.strong,{children:"lo"})," domain or with fabrics equivalent to 127.0.0.1 will only function in single-node cases."]}),"\n",(0,r.jsxs)(n.li,{children:["Fabrics ending with the format *.0.0.0 will ",(0,r.jsx)(n.strong,{children:"NOT"})," work. These are ",(0,r.jsx)(n.em,{children:"network"})," addresses, not ",(0,r.jsx)(n.em,{children:"host"})," addreses. For example, 127.0.0.0 comes up sometimes in the fi_info output."]}),"\n",(0,r.jsx)(n.li,{children:"Networks where the fabric is not a number are generally irrelevant and will not function when used. For example:"}),"\n"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",children:"# This provider is not relevant\nprovider: UDP\nfabric: UDP-IP\ndomain: udp\nversion: 1.1\ntype: FI_EP_DGRAM\nprotocol: FI_PROTO_UDP\n"})}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["One way to filter out dysfunctional fi_info outputs is to use ",(0,r.jsx)(n.code,{children:"ip addr show"})," (or ",(0,r.jsx)(n.code,{children:"fi_info | grep fabric"}),") to list available IP addresses. Do this on two separate machines, compare their output, and then look at only the IP addresses that are similar between the machines. If you can ssh between the machines using these IP addresses, then you should focus on only those fabrics matching their pattern in the fi_info output"]}),"\n",(0,r.jsx)(n.li,{children:"Be careful about the providers. It has come up plenty of times where a provider is listed, but doesn't actually work. Verbs, for example, may fail if your Hermes installation was not correctly configured to support RDMA. This is a guess-and-check game. TCP and Sockets are generally a safe bet. It may be of benefit to try just these providers and get a distributed deployment of Hermes functioning before moving on to verbs."}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"building-an-environment",children:"Building an Environment"}),"\n",(0,r.jsx)(n.p,{children:"We will now load all necessary environment variables and build a\nJarvis environment named hermes_env:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"spack load hermes\njarvis env build hermes_env\n"})}),"\n",(0,r.jsx)(n.p,{children:"hermes_env will store all important environment variables, including PATH,\nLD_LIBRARY_PATH, etc. in a YAML file. This will make it so that you do not\nneed to repeatedly run spack load and module load if the machine is broken."}),"\n",(0,r.jsx)(n.h3,{id:"set-the-active-hostfile",children:"Set the active Hostfile"}),"\n",(0,r.jsx)(n.p,{children:"The hostfile contains the set of nodes that the pipeline will run over.\nThis is structured the same way as a traditional MPI hostfile."}),"\n",(0,r.jsx)(n.p,{children:"An example hostfile:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-txt",children:"ares-comp-20\nares-comp-[21-25]\n"})}),"\n",(0,r.jsx)(n.p,{children:"To set the active hostfile, run:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"jarvis hostfile set /path/to/hostfile\n"})}),"\n",(0,r.jsx)(n.p,{children:"Note that every time you change the hostfile, you will need to update the\npipeline. Jarvis does not automatically detect changes to this file."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"jarvis pipeline update\n"})}),"\n",(0,r.jsx)(n.h4,{id:"create-an-empty-pipeline",children:"Create an empty pipeline"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"jarvis pipeline create hermes\n"})}),"\n",(0,r.jsx)(n.p,{children:"hermes is the name of the pipeline. It doesn't need to be hermes,\nit can be any name."}),"\n",(0,r.jsx)(n.h4,{id:"copy-the-environment-cache",children:"Copy the environment cache"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"jarvis pipeline env copy hermes_env\n"})}),"\n",(0,r.jsx)(n.p,{children:"This will use the hermes_env environment that was previously created in"}),"\n",(0,r.jsx)(n.h4,{id:"add-hermes-runtime",children:"Add Hermes runtime"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"jarvis pipeline append hermes_run\njarvis pkg configure hermes_run \\\nsleep=5 \\\ninclude=${HOME}/ior_data\n"})}),"\n",(0,r.jsx)(n.p,{children:"Jarvis will automatically produce a Hermes client and server configuration that\ncontains all storage devices and fastest available network defined in the\nresource graph. These configurations will be located in:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"$(jarvis path +shared)/hermes_run/hermes_server.yaml\n$(jarvis path +shared)/hermes_run/hermes_client.yaml\n"})}),"\n",(0,r.jsx)(n.h2,{id:"starting--stopping-hermes",children:"Starting + Stopping Hermes"}),"\n",(0,r.jsx)(n.p,{children:"To start Hermes:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"jarvis pipeline start\n"})}),"\n",(0,r.jsx)(n.h2,{id:"stopping-and-killing-hermes",children:"Stopping and Killing Hermes"}),"\n",(0,r.jsx)(n.p,{children:"To gracefully stop Hermes and flush data back to the PFS:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"jarvis pipeline stop\n"})}),"\n",(0,r.jsx)(n.p,{children:"To kill a Hermes deployment that isn't stopping gracefully:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"jarvis pipeline kill\n"})}),"\n",(0,r.jsx)(n.h2,{id:"cleanup",children:"Cleanup"}),"\n",(0,r.jsx)(n.p,{children:"To erase data produced by the pipeline:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"jarvis pipeline clean\n"})}),"\n",(0,r.jsx)(n.p,{children:"To destroy the pipeline:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"jarvis pipeline destroy\n"})}),"\n",(0,r.jsx)(n.h2,{id:"configuring--deploying-hermes-with-an-application",children:"Configuring + Deploying Hermes with an Application"}),"\n",(0,r.jsx)(n.p,{children:"As previously stated, Jarvis can be used to deploy and application\nwith Hermes. This will automatically set environment variables\n(e.g., LD_PRELOAD) that will be necessary for the application to\nrun."}),"\n",(0,r.jsx)(n.h3,{id:"build-an-environment",children:"Build an Environment"}),"\n",(0,r.jsx)(n.p,{children:"We will now load all necessary environment variables and build a\nJarvis environment named hermes_env:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"spack load hermes\nspack load ior\njarvis env build hermes_ior_env\n"})}),"\n",(0,r.jsx)(n.p,{children:"hermes_ior_env will store all important environment variables, including PATH,\nLD_LIBRARY_PATH, etc. in a YAML file."}),"\n",(0,r.jsx)(n.h3,{id:"create-an-empty-pipeline-1",children:"Create an empty pipeline"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"jarvis pipeline create hermes_ior\n"})}),"\n",(0,r.jsx)(n.h3,{id:"copy-the-environment-cache-1",children:"Copy the environment cache"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"jarvis pipeline env copy hermes_ior_env\n"})}),"\n",(0,r.jsx)(n.h3,{id:"set-the-active-hostfile-1",children:"Set the active hostfile"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"jarvis hostfile set /path/to/hostfile\n"})}),"\n",(0,r.jsx)(n.h3,{id:"add-hermes-runtime-1",children:"Add Hermes runtime"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"jarvis pipeline append hermes_run\njarvis pkg configure hermes_run \\\nsleep=5 \\\ninclude=${HOME}/ior_data\n"})}),"\n",(0,r.jsxs)(n.p,{children:["This will ensure that if a Hermes interceptor is used, it will intercept\nall paths in ",(0,r.jsx)(n.code,{children:"${HOME}/ior_data"}),"."]}),"\n",(0,r.jsx)(n.h3,{id:"add-hermes-mpi-io-interceptor",children:"Add Hermes MPI-IO interceptor"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"jarvis pipeline append hermes_api\njarvis pkg configure hermes_api +mpi\n"})}),"\n",(0,r.jsx)(n.p,{children:"This will automatically locate the interceptor library by\ntraversing various environment variables. This will ensure\nthat MPI-IO is intercepted by Hermes."}),"\n",(0,r.jsx)(n.h3,{id:"add-ior",children:"Add IOR"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"jarvis pipeline append ior\njarvis pkg configure ior \\\nxfer=1m \\\nblock=1g \\\nnprocs=64 \\\nppn=16 \\\n+write +read \\\nout=${HOME}/ior_data/ior.bin \\\napi=mpiio\n"})}),"\n",(0,r.jsxs)(n.p,{children:["This IOR will perform 1GB of I/O per-process (block) in units of 1m (xfer) and\nproduce a single output file ",(0,r.jsx)(n.code,{children:"${HOME}/ior_data/ior.bin"}),"(out) using MPI-IO\n(api). The total amount of I/O performed will be 64GB spread across 4 nodes."]}),"\n",(0,r.jsx)(n.h3,{id:"run-the-pipeline",children:"Run the Pipeline"}),"\n",(0,r.jsx)(n.p,{children:"To run the pipeline:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"jarvis pipeline run\n"})}),"\n",(0,r.jsx)(n.p,{children:"This will launch Hermes, execute IOR, and then stop Hermes. It is equivalent\nto:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"jarvis pipeline start\njarvis pipeline stop\n"})}),"\n",(0,r.jsx)(n.h3,{id:"cleanup-1",children:"Cleanup"}),"\n",(0,r.jsx)(n.p,{children:"The following will delete intermediate data generated by Hermes + IOR:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"jarvis pipeline clean\n"})})]})}function h(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},1151:(e,n,i)=>{i.d(n,{Z:()=>t,a:()=>l});var r=i(7294);const s={},a=r.createContext(s);function l(e){const n=r.useContext(a);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function t(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:l(e.components),r.createElement(a.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/2638f36e.01c642ee.js b/assets/js/2638f36e.d2f92086.js
similarity index 99%
rename from assets/js/2638f36e.01c642ee.js
rename to assets/js/2638f36e.d2f92086.js
index d5a025dd..72541b8e 100644
--- a/assets/js/2638f36e.01c642ee.js
+++ b/assets/js/2638f36e.d2f92086.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkgrc=self.webpackChunkgrc||[]).push([[2777],{1421:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>l,contentTitle:()=>t,default:()=>d,frontMatter:()=>r,metadata:()=>o,toc:()=>c});var s=i(5893),a=i(1151);const r={},t="Configuration",o={id:"hermes/configuration",title:"Configuration",description:"Before deploying an application, you need to configure Hermes. Hermes has two types of configurations: server configuration and client configuration. They",source:"@site/docs/03-hermes/05-configuration.md",sourceDirName:"03-hermes",slug:"/hermes/configuration",permalink:"/docs/hermes/configuration",draft:!1,unlisted:!1,tags:[],version:"current",sidebarPosition:5,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"deploying-hermes",permalink:"/docs/hermes/deploying-hermes"},next:{title:"Buffer Organizer",permalink:"/docs/hermes/components/buffer-organizer"}},l={},c=[{value:"Server Configuration",id:"server-configuration",level:2},{value:"Defining Storage Targets",id:"defining-storage-targets",level:3},{value:"Device Names",id:"device-names",level:3},{value:"mount_point",id:"mount_point",level:3},{value:"capacity",id:"capacity",level:3},{value:"block_size",id:"block_size",level:3},{value:"slab_sizes",id:"slab_sizes",level:3},{value:"bandwidth, latency",id:"bandwidth-latency",level:3},{value:"is_shared_device",id:"is_shared_device",level:3},{value:"borg_capacity_thresh",id:"borg_capacity_thresh",level:3},{value:"Buffer Organizer (BORG)",id:"buffer-organizer-borg",level:2},{value:"Prefetcher",id:"prefetcher",level:2},{value:"Traits",id:"traits",level:2},{value:"Shared Memory",id:"shared-memory",level:2},{value:"System View State",id:"system-view-state",level:2},{value:"Bounding Memory Utilization",id:"bounding-memory-utilization",level:2},{value:"Using RAM as a buffering device",id:"using-ram-as-a-buffering-device",level:3},{value:"Hashtables for storing blobs + buckets",id:"hashtables-for-storing-blobs--buckets",level:3},{value:"Bounding Non-Buffering Tasks",id:"bounding-non-buffering-tasks",level:3},{value:"Calculating Total Amount of Memory",id:"calculating-total-amount-of-memory",level:3},{value:"Client Configuration",id:"client-configuration",level:2},{value:"Path Inclusion / Exclusion",id:"path-inclusion--exclusion",level:3},{value:"Adapter Mode",id:"adapter-mode",level:3},{value:"File Page Size",id:"file-page-size",level:3},{value:"Flushing Mode",id:"flushing-mode",level:3},{value:"Adapter Config",id:"adapter-config",level:3},{value:"Provided Configurations",id:"provided-configurations",level:2},{value:"How To Avoid Repeating the Default Configurations",id:"how-to-avoid-repeating-the-default-configurations",level:2}];function h(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,a.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h1,{id:"configuration",children:"Configuration"}),"\n",(0,s.jsx)(n.p,{children:"Before deploying an application, you need to configure Hermes. Hermes has two types of configurations: server configuration and client configuration. They\nare represented as YAML files. We will describe the contents of these YAML\nfiles here."}),"\n",(0,s.jsx)(n.h2,{id:"server-configuration",children:"Server Configuration"}),"\n",(0,s.jsx)(n.p,{children:"The server configuration is primarily used to initialize the daemon.\nClients also parse the server config to get the basic information needed\nto connect to the Hermes daemons."}),"\n",(0,s.jsx)(n.p,{children:"Technically, the server configuration\nis optional. However, the default configuration is more for just setting\nthings up. You do have to configure things like mount points manually\nat this time."}),"\n",(0,s.jsxs)(n.p,{children:["The default server configuration can be found\n",(0,s.jsx)(n.a,{href:"https://github.com/HDFGroup/hermes/blob/master/config/hermes_server_default.yaml",children:"here"}),"."]}),"\n",(0,s.jsx)(n.h3,{id:"defining-storage-targets",children:"Defining Storage Targets"}),"\n",(0,s.jsx)(n.p,{children:'The most important property in the configuration is defining where Hermes\nbuffers data. This is done under the "devices" entry.\nIn the default configuration, we have the following:'}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:'devices:\n ram:\n mount_point: ""\n capacity: 50MB\n block_size: 4KB\n slab_sizes: [ 4KB, 16KB, 64KB, 1MB ]\n bandwidth: 6000MBps\n latency: 15us\n is_shared_device: false\n borg_capacity_thresh: [0.0, 1.0]\n\n nvme:\n mount_point: "./"\n capacity: 100MB\n block_size: 4KB\n slab_sizes: [ 4KB, 16KB, 64KB, 1MB ]\n bandwidth: 1GBps\n latency: 600us\n is_shared_device: false\n borg_capacity_thresh: [ 0.0, 1.0 ]\n\n ssd:\n mount_point: "./"\n capacity: 100MB\n block_size: 4KB\n slab_sizes: [ 4KB, 16KB, 64KB, 1MB ]\n bandwidth: 500MBps\n latency: 1200us\n is_shared_device: false\n borg_capacity_thresh: [ 0.0, 1.0 ]\n\n pfs:\n mount_point: "./"\n capacity: 100MB\n block_size: 64KB\n slab_sizes: [ 4KB, 16KB, 64KB, 1MB ]\n bandwidth: 100MBps\n latency: 200ms\n is_shared_device: true\n borg_capacity_thresh: [ 0.0, 1.0 ]\n'})}),"\n",(0,s.jsx)(n.h3,{id:"device-names",children:"Device Names"}),"\n",(0,s.jsx)(n.p,{children:"In the above configuration, we have four unique devices: ram, nvme, ssd,\nand pfs. These names are for the ease of the user, and have no meaning\nto Hermes. In other words, these names can be anything. The following\nconfiguration would be effectively equivalent to the one above:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:'devices:\n dev1:\n mount_point: ""\n capacity: 50MB\n ...\n\n dev2:\n mount_point: "./"\n capacity: 100MB\n ...\n\n dev3:\n mount_point: "./"\n capacity: 100MB\n ...\n\n dev4:\n mount_point: "./"\n capacity: 100MB\n ...\n'})}),"\n",(0,s.jsx)(n.h3,{id:"mount_point",children:(0,s.jsx)(n.code,{children:"mount_point"})}),"\n",(0,s.jsx)(n.p,{children:"The mount point parameter is used to indicate which directory Hermes\nshould place data in, if the device has a filesystem."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:'ram:\n mount_point: ""\n\nnvme:\n mount_point: "./"\n'})}),"\n",(0,s.jsx)(n.p,{children:'In the default config, for example, we look at ram and nvme. nvme is mounted\nin the current working directory. Hermes will create a file called\n"./slab_nvme". It will create equivalent files for hdd, ssd, and pfs.'}),"\n",(0,s.jsx)(n.p,{children:'For ram, we set the mount point to "". This indicates that the device\nhas no mount point.'}),"\n",(0,s.jsx)(n.h3,{id:"capacity",children:(0,s.jsx)(n.code,{children:"capacity"})}),"\n",(0,s.jsx)(n.p,{children:'This variable implies the amount of capacity to use for buffering.\nThis parameter is a "size variable", which supports various suffixes:'}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"capacity: 100 # 100 bytes\ncapacity: 100k # 100 KB\ncapacity: 100kb # 100 KB\ncapacity: 100KB # 100 KB\ncapacity: 100m # 100 MB\ncapacity: 100mb # 100 MB\ncapacity: 100MB # 100 MB\ncapacity: 100g # 100 GB\ncapacity: 100gb # 100 GB\ncapacity: 100GB # 100 GB\ncapacity: 100T # 100 TB\ncapacity: 100tb # 100 TB\ncapacity: 100TB # 100 TB\n"})}),"\n",(0,s.jsx)(n.p,{children:"There cannot be spaces between the number and the suffix. For example,"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"capacity: 100 tb #NOT VALID\n"})}),"\n",(0,s.jsx)(n.h3,{id:"block_size",children:(0,s.jsx)(n.code,{children:"block_size"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"block_size: 64KB\n"})}),"\n",(0,s.jsx)(n.p,{children:"This is the amount of I/O that the physical block device supports.\nRAM, for example, generally sees data in units of 4KB because this is\nthe page size of the system. HDDs, NVMes, and SSDs generally have block\nsizes of 4KB as well. Generally, this parameter doesn't need to be changed."}),"\n",(0,s.jsx)(n.h3,{id:"slab_sizes",children:(0,s.jsx)(n.code,{children:"slab_sizes"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"slab_sizes: [4KB, 16KB, 64KB, 1MB]\n"})}),"\n",(0,s.jsx)(n.p,{children:"This parameter is important to performance and resource utilization. The slab sizes dictates the I/O patterns produced in Hermes. When Hermes wants to\nwrite a 16MB blob, how does this blob actually get mapped to storage?\nIt gets fragmented into buffers, where the size of a buffer is equivalent\nto the best-fitting slab size."}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"A 16MB blob will be placed as 16 1MB buffers."}),"\n",(0,s.jsx)(n.li,{children:"A 6KB blob will be placed as 2 4KB buffers"}),"\n",(0,s.jsx)(n.li,{children:"A 33KB blob will be placed as a single 64KB buffer"}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"You should decide the buffer sizes based on the characteristics of your\nprogram. If unsure, the default slab sizes generally have worked well\nin the workloads we've tried. However, if you're finding Hermes runs\nout of space, this parameter may be the culprit."}),"\n",(0,s.jsxs)(n.h3,{id:"bandwidth-latency",children:[(0,s.jsx)(n.code,{children:"bandwidth"}),", ",(0,s.jsx)(n.code,{children:"latency"})]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"bandwidth: 1GBps\nlatency: 600us\n"})}),"\n",(0,s.jsx)(n.p,{children:"These are properties of the storage device which are used by data placement\nalgorithms to decide where to buffer data."}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Acceptable suffixes for bandwidth (case doesn't matter):"}),"\n",(0,s.jsx)(n.li,{children:"Acceptable suffixes for latency (case doesn't matter): s, ms, us, ns."}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"is_shared_device",children:(0,s.jsx)(n.code,{children:"is_shared_device"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"is_shared_device: true\n"})}),"\n",(0,s.jsx)(n.p,{children:"This indicates whether or not the device provides a shared view of\ndata across nodes. For example, a PFS is a shared device, whereas\na single hard drive is not a shared device. This parameter is not\nreally used at this time, but you do need to define it."}),"\n",(0,s.jsx)(n.h3,{id:"borg_capacity_thresh",children:(0,s.jsx)(n.code,{children:"borg_capacity_thresh"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"borg_capacity_thresh: [0.0, 1.0]\n"})}),"\n",(0,s.jsx)(n.p,{children:"This parameter is used to trigger the buffer organizer (BORG). When a\ndevice is either really low on capacity (or high on capacity) BORG\nwill be triggered to shuffle content around."}),"\n",(0,s.jsx)(n.p,{children:"The first entry indicates how much space is too little space. In this\ncase if capacity falls below 0% (i.e., never), BORG will be triggered."}),"\n",(0,s.jsx)(n.p,{children:"The second entry indicates how mcuh space is too much space. In this\ncase if capacity grows beyone 100% (i.e., never), BORG will be triggered."}),"\n",(0,s.jsx)(n.p,{children:"In other words, this example, shows how to disable BORG."}),"\n",(0,s.jsx)(n.h2,{id:"buffer-organizer-borg",children:"Buffer Organizer (BORG)"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"buffer_organizer:\n num_threads: 1\n flush_period: 1024\n blob_reorg_period: 1024\n recency_min: 0\n recency_max: 60\n freq_max: 15\n freq_min: 0\n"})}),"\n",(0,s.jsx)(n.p,{children:'The BORG contains threads for reorganizing buffers in Hermes. The number\nof threads is indicated by "num_threads". The amount of time (in ms) to\nre-scan for blobs to reorganize is given by "flush_period".'}),"\n",(0,s.jsx)(n.p,{children:"receny_max is the amount of time (in seconds) when the score of a blob\nbecomes 0. recency_min is the amount of time for the blob to have a score\nof 1."}),"\n",(0,s.jsx)(n.p,{children:"freq_max is the minimum number of times a blob needs to be accessed in the\nflushing period for the score to be equal to one. freq_min is the maximum number of times a blob can be accessed before its score becomes larger than 0."}),"\n",(0,s.jsx)(n.p,{children:"The buffer organizer is only triggered when there are space constraints\nthat need to be met at this time. If you want the BORG extremely active,\nchange the borg_capacity_thresh variable."}),"\n",(0,s.jsx)(n.h2,{id:"prefetcher",children:"Prefetcher"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:'prefetch:\n enabled: false\n apriori_schema_path: ""\n epoch_ms: 50\n is_mpi: false\n'})}),"\n",(0,s.jsx)(n.p,{children:"These parameters dictate properties of the prefetcher."}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"enabled"}),": whether to turn prefetcher on"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"apriori_schema_path"}),": internally used by apriori prefetcher"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"epoch_ms"}),": how often to call the prefetcher thread"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"is_mpi"}),": whether the program is an MPI program so that clients\nsend their ranks to the daemon during prefetching."]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"For now, prefetching is only available to the native API, not the adapters."}),"\n",(0,s.jsx)(n.h2,{id:"traits",children:"Traits"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:'traits:\n - "hermes_posix_io_client"\n - "hermes_stdio_io_client"\n - "hermes_mpiio_io_client"\n - "hermes_example_trait"\n - "hermes_prefetcher_trait"\n'})}),"\n",(0,s.jsx)(n.p,{children:"The traits category lists the set of traits that Hermes searches for\nin the LD_LIBRARY_PATH and HERMES_TRAIT_PATH environment variables.\nIt will search each directory specified in those environment variables\nfor shared objects matching these names. For example, libhermes_posix_io_client.so will be searched for."}),"\n",(0,s.jsx)(n.p,{children:"Unless you are adding custom traits, this can be left as default."}),"\n",(0,s.jsx)(n.h2,{id:"shared-memory",children:"Shared Memory"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:'shmem_name: "/hermes_shm_"\n'})}),"\n",(0,s.jsx)(n.p,{children:"This is the name of the shared memory segment hermes will create. In order\nto make this unique across users (since shared memory can be used to\nshare memory across users), we append the name of the user to this key."}),"\n",(0,s.jsx)(n.p,{children:"This generally can be left as the default value."}),"\n",(0,s.jsx)(n.h2,{id:"system-view-state",children:"System View State"}),"\n",(0,s.jsx)(n.p,{children:"This parameter is unused for now, so no need to set it."}),"\n",(0,s.jsx)(n.h2,{id:"bounding-memory-utilization",children:"Bounding Memory Utilization"}),"\n",(0,s.jsx)(n.p,{children:'When running Hermes in a limited environment, ensuring that Hermes is not over-utilizing memory is necessary. It is possible to receive "Bus Error" messages due to the OS complaining that too many pages have been allocated. We find that this happens in Docker containers frequently since they have more limited memory constraints by default.'}),"\n",(0,s.jsx)(n.p,{children:"There are a few parameters which cause Hermes to utilize memory."}),"\n",(0,s.jsx)(n.h3,{id:"using-ram-as-a-buffering-device",children:"Using RAM as a buffering device"}),"\n",(0,s.jsx)(n.p,{children:"Hermes can be configured to use RAM as a buffering device."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:'devices:\n ram:\n mount_point: ""\n capacity: 1g\n'})}),"\n",(0,s.jsx)(n.p,{children:"In this case, Hermes will reserve up to 1GB of space to use for buffering."}),"\n",(0,s.jsx)(n.h3,{id:"hashtables-for-storing-blobs--buckets",children:"Hashtables for storing blobs + buckets"}),"\n",(0,s.jsx)(n.p,{children:"Hermes will reserve space for hashtables for blobs, buckets, and traits.\nThese parameters can be configured as follows:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"mdm:\n # This represents the number of blobs and buckets before collisions start\n # to happen in the unordered_map tables.\n est_blob_count: 100000\n est_bucket_count: 100000\n est_num_traits: 256\n"})}),"\n",(0,s.jsx)(n.p,{children:"You can set these to lower values if memory is over-utilized.\nThese values should be set to roughly the number of blobs and buckets the program creates to avoid collisions in the hashtables."}),"\n",(0,s.jsx)(n.h3,{id:"bounding-non-buffering-tasks",children:"Bounding Non-Buffering Tasks"}),"\n",(0,s.jsx)(n.p,{children:"You can set a maximum boundary on the amount of memory to use for non-buffering tasks, such as reserving space for the blob + bucket hashtables."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"# Define the maximum amount of memory Hermes can use for non-buffering tasks.\n# This includes metadata management and memory allocations.\n# This memory will not be preallocated, so if you don't know, 0 indicates\n# any amount of memory\nmax_memory: 0g\n"})}),"\n",(0,s.jsx)(n.p,{children:"0g indicates infinity. Non-zero values can be set to put a boundary here."}),"\n",(0,s.jsx)(n.h3,{id:"calculating-total-amount-of-memory",children:"Calculating Total Amount of Memory"}),"\n",(0,s.jsx)(n.p,{children:"The total amount of memory Hermes can use before an hshm::Error or Bus Error is thrown can be calculated as follows:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"RAM used for Buffering (3.1.7.1) + RAM used for Non-Buffering (3.1.7.3)\n"})}),"\n",(0,s.jsx)(n.h2,{id:"client-configuration",children:"Client Configuration"}),"\n",(0,s.jsxs)(n.p,{children:["The default client configuration can be found\n",(0,s.jsx)(n.a,{href:"https://github.com/HDFGroup/hermes/blob/master/config/hermes_client_default.yaml",children:"here"}),"."]}),"\n",(0,s.jsx)(n.p,{children:"The client configuration currently only contains parameters used by\nadapters."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:'stop_daemon: false\npath_inclusions: ["/tmp/test_hermes"]\npath_exclusions: ["/"]\nfile_page_size: 1024KB\nbase_adapter_mode: kDefault\nflushing_mode: kAsync\nfile_adapter_configs:\n - path: "/"\n page_size: 1MB\n mode: kDefault\n'})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"stop_daemon"}),": stop the daemon when adapters exit. Generally, leave\nthis false and stop the daemon using finalize_daemon script. Will likely\nbe removed in the near future."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"file_page_size"}),": The page size used to fragment files into blobs in\nHermes."]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"path-inclusion--exclusion",children:"Path Inclusion / Exclusion"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:'path_inclusions: ["/tmp/test_hermes"]\npath_exclusions: ["/"]\n'})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"path_inclusions"}),": Which paths to buffer? In this case, everything which\nis a child of /tmp/test_hermes."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"path_exclusions"}),": Which paths to ignore? In this case, everything which\nis a child of the root directory. Technically everything on the system."]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:'We prioritize paths in inclusions and exclusions depending on how\nspecific the path is. In other words, we sort the paths by the length\nof the path. For example, in this case, /tmp/test_hermes will be included\nsince it has a longer path than "/". Everything other than /tmp/test_hermes\nwill be excluded.'}),"\n",(0,s.jsx)(n.h3,{id:"adapter-mode",children:"Adapter Mode"}),"\n",(0,s.jsx)(n.p,{children:"The adapter mode determines how Hermes buffers adapter data by default.\nThere are three adapter modes:"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsx)(n.li,{children:"kDefault: Hermes will buffer data and then flush to the PFS eventually"}),"\n",(0,s.jsx)(n.li,{children:"kScratch: Hermes will buffer data, but never flush"}),"\n",(0,s.jsx)(n.li,{children:"kBypass: Hermes will never buffer data, and always flush to the PFS"}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"kDefault is the real use case of Hermes, the other two are for benchmarking\nand testing purposes."}),"\n",(0,s.jsx)(n.p,{children:"This parameter can also be set by an environment variable. The\nenvironment variable is prioritized."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"HERMES_ADAPTER_MODE=kDefault \\\n./myhermesapp\n"})}),"\n",(0,s.jsx)(n.h3,{id:"file-page-size",children:"File Page Size"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"file_page_size: 1024KB\n"})}),"\n",(0,s.jsx)(n.p,{children:"This parameter dictates how adapters convert files into blobs.\nBy default, files are divided into 1024KB (1MB) blobs. Setting\nthis parameter appropriately can have impacts on\nwrite and read amplification and metadata overhead."}),"\n",(0,s.jsx)(n.p,{children:"For workloads which perform 4KB reads to a large file, each read\nwill be amplified to 1MB unless the page size is reset."}),"\n",(0,s.jsx)(n.p,{children:"For the same workload, setting a file page size equal to 4KB may\nresult in a significant increase in metadata being stored in the\nmetadata manager."}),"\n",(0,s.jsx)(n.p,{children:"In other words, this parameter is worth tuning."}),"\n",(0,s.jsx)(n.p,{children:"This parameter can also be set using an environment variable. The\nenvironment variable is prioritized."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"HERMES_PAGE_SIZE=1024KB \\\n./myhermesapp\n"})}),"\n",(0,s.jsx)(n.h3,{id:"flushing-mode",children:"Flushing Mode"}),"\n",(0,s.jsx)(n.p,{children:"The flushing mode indicates how Hermes should flush data to the PFS.\nCurrently there are two modes provided:"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsx)(n.li,{children:"kAsync: Flush data asynchronously in a background thread"}),"\n",(0,s.jsx)(n.li,{children:"kSync: Flush data synchronously"}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"kAsync is recommended. kSync is used only in unit tests since it has\nlow performance."}),"\n",(0,s.jsx)(n.h3,{id:"adapter-config",children:"Adapter Config"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:'file_adapter_configs:\n - path: "/"\n page_size: 1MB\n mode: kDefault\n'})}),"\n",(0,s.jsx)(n.p,{children:"Contains file-specific overrides to the default adapter variables defined\nabove. You can modify the adapter mode (3.2.2) and file page size for each"}),"\n",(0,s.jsx)(n.h2,{id:"provided-configurations",children:"Provided Configurations"}),"\n",(0,s.jsx)(n.p,{children:"We also provide Hermes configurations we use with a few systems to which you\nmight have access:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://github.com/HDFGroup/hermes/blob/master/test/data/ares.yaml",children:"Ares (IIT)"})}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"https://github.com/HDFGroup/hermes/tree/master/test/data",children:"Frontera (TACC)"})," (Coming soon.)"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Bear in mind that a suitable Hermes configuration also depends on\napplications' I/O workload and not just the configuration of the\nunderlying machine."}),"\n",(0,s.jsx)(n.h2,{id:"how-to-avoid-repeating-the-default-configurations",children:"How To Avoid Repeating the Default Configurations"}),"\n",(0,s.jsx)(n.p,{children:"Many parameters in Hermes can be left as default. Any parameters which\nyou would like to leave as default can be removed from your configuration\nfile completely. Hermes will fill in missing values based on the values\nin our default configurations."})]})}function d(e={}){const{wrapper:n}={...(0,a.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},1151:(e,n,i)=>{i.d(n,{Z:()=>o,a:()=>t});var s=i(7294);const a={},r=s.createContext(a);function t(e){const n=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:t(e.components),s.createElement(r.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
+"use strict";(self.webpackChunkgrc=self.webpackChunkgrc||[]).push([[2777],{1421:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>l,contentTitle:()=>t,default:()=>d,frontMatter:()=>r,metadata:()=>o,toc:()=>c});var s=i(5893),a=i(1151);const r={},t="Configuration",o={id:"hermes/configuration",title:"Configuration",description:"Before deploying an application, you need to configure Hermes. Hermes has two types of configurations: server configuration and client configuration. They",source:"@site/docs/03-hermes/05-configuration.md",sourceDirName:"03-hermes",slug:"/hermes/configuration",permalink:"/docs/hermes/configuration",draft:!1,unlisted:!1,tags:[],version:"current",sidebarPosition:5,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Deploying Hermes",permalink:"/docs/hermes/deploying-hermes"},next:{title:"Buffer Organizer",permalink:"/docs/hermes/components/buffer-organizer"}},l={},c=[{value:"Server Configuration",id:"server-configuration",level:2},{value:"Defining Storage Targets",id:"defining-storage-targets",level:3},{value:"Device Names",id:"device-names",level:3},{value:"mount_point",id:"mount_point",level:3},{value:"capacity",id:"capacity",level:3},{value:"block_size",id:"block_size",level:3},{value:"slab_sizes",id:"slab_sizes",level:3},{value:"bandwidth, latency",id:"bandwidth-latency",level:3},{value:"is_shared_device",id:"is_shared_device",level:3},{value:"borg_capacity_thresh",id:"borg_capacity_thresh",level:3},{value:"Buffer Organizer (BORG)",id:"buffer-organizer-borg",level:2},{value:"Prefetcher",id:"prefetcher",level:2},{value:"Traits",id:"traits",level:2},{value:"Shared Memory",id:"shared-memory",level:2},{value:"System View State",id:"system-view-state",level:2},{value:"Bounding Memory Utilization",id:"bounding-memory-utilization",level:2},{value:"Using RAM as a buffering device",id:"using-ram-as-a-buffering-device",level:3},{value:"Hashtables for storing blobs + buckets",id:"hashtables-for-storing-blobs--buckets",level:3},{value:"Bounding Non-Buffering Tasks",id:"bounding-non-buffering-tasks",level:3},{value:"Calculating Total Amount of Memory",id:"calculating-total-amount-of-memory",level:3},{value:"Client Configuration",id:"client-configuration",level:2},{value:"Path Inclusion / Exclusion",id:"path-inclusion--exclusion",level:3},{value:"Adapter Mode",id:"adapter-mode",level:3},{value:"File Page Size",id:"file-page-size",level:3},{value:"Flushing Mode",id:"flushing-mode",level:3},{value:"Adapter Config",id:"adapter-config",level:3},{value:"Provided Configurations",id:"provided-configurations",level:2},{value:"How To Avoid Repeating the Default Configurations",id:"how-to-avoid-repeating-the-default-configurations",level:2}];function h(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,a.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h1,{id:"configuration",children:"Configuration"}),"\n",(0,s.jsx)(n.p,{children:"Before deploying an application, you need to configure Hermes. Hermes has two types of configurations: server configuration and client configuration. They\nare represented as YAML files. We will describe the contents of these YAML\nfiles here."}),"\n",(0,s.jsx)(n.h2,{id:"server-configuration",children:"Server Configuration"}),"\n",(0,s.jsx)(n.p,{children:"The server configuration is primarily used to initialize the daemon.\nClients also parse the server config to get the basic information needed\nto connect to the Hermes daemons."}),"\n",(0,s.jsx)(n.p,{children:"Technically, the server configuration\nis optional. However, the default configuration is more for just setting\nthings up. You do have to configure things like mount points manually\nat this time."}),"\n",(0,s.jsxs)(n.p,{children:["The default server configuration can be found\n",(0,s.jsx)(n.a,{href:"https://github.com/HDFGroup/hermes/blob/master/config/hermes_server_default.yaml",children:"here"}),"."]}),"\n",(0,s.jsx)(n.h3,{id:"defining-storage-targets",children:"Defining Storage Targets"}),"\n",(0,s.jsx)(n.p,{children:'The most important property in the configuration is defining where Hermes\nbuffers data. This is done under the "devices" entry.\nIn the default configuration, we have the following:'}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:'devices:\n ram:\n mount_point: ""\n capacity: 50MB\n block_size: 4KB\n slab_sizes: [ 4KB, 16KB, 64KB, 1MB ]\n bandwidth: 6000MBps\n latency: 15us\n is_shared_device: false\n borg_capacity_thresh: [0.0, 1.0]\n\n nvme:\n mount_point: "./"\n capacity: 100MB\n block_size: 4KB\n slab_sizes: [ 4KB, 16KB, 64KB, 1MB ]\n bandwidth: 1GBps\n latency: 600us\n is_shared_device: false\n borg_capacity_thresh: [ 0.0, 1.0 ]\n\n ssd:\n mount_point: "./"\n capacity: 100MB\n block_size: 4KB\n slab_sizes: [ 4KB, 16KB, 64KB, 1MB ]\n bandwidth: 500MBps\n latency: 1200us\n is_shared_device: false\n borg_capacity_thresh: [ 0.0, 1.0 ]\n\n pfs:\n mount_point: "./"\n capacity: 100MB\n block_size: 64KB\n slab_sizes: [ 4KB, 16KB, 64KB, 1MB ]\n bandwidth: 100MBps\n latency: 200ms\n is_shared_device: true\n borg_capacity_thresh: [ 0.0, 1.0 ]\n'})}),"\n",(0,s.jsx)(n.h3,{id:"device-names",children:"Device Names"}),"\n",(0,s.jsx)(n.p,{children:"In the above configuration, we have four unique devices: ram, nvme, ssd,\nand pfs. These names are for the ease of the user, and have no meaning\nto Hermes. In other words, these names can be anything. The following\nconfiguration would be effectively equivalent to the one above:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:'devices:\n dev1:\n mount_point: ""\n capacity: 50MB\n ...\n\n dev2:\n mount_point: "./"\n capacity: 100MB\n ...\n\n dev3:\n mount_point: "./"\n capacity: 100MB\n ...\n\n dev4:\n mount_point: "./"\n capacity: 100MB\n ...\n'})}),"\n",(0,s.jsx)(n.h3,{id:"mount_point",children:(0,s.jsx)(n.code,{children:"mount_point"})}),"\n",(0,s.jsx)(n.p,{children:"The mount point parameter is used to indicate which directory Hermes\nshould place data in, if the device has a filesystem."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:'ram:\n mount_point: ""\n\nnvme:\n mount_point: "./"\n'})}),"\n",(0,s.jsx)(n.p,{children:'In the default config, for example, we look at ram and nvme. nvme is mounted\nin the current working directory. Hermes will create a file called\n"./slab_nvme". It will create equivalent files for hdd, ssd, and pfs.'}),"\n",(0,s.jsx)(n.p,{children:'For ram, we set the mount point to "". This indicates that the device\nhas no mount point.'}),"\n",(0,s.jsx)(n.h3,{id:"capacity",children:(0,s.jsx)(n.code,{children:"capacity"})}),"\n",(0,s.jsx)(n.p,{children:'This variable implies the amount of capacity to use for buffering.\nThis parameter is a "size variable", which supports various suffixes:'}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"capacity: 100 # 100 bytes\ncapacity: 100k # 100 KB\ncapacity: 100kb # 100 KB\ncapacity: 100KB # 100 KB\ncapacity: 100m # 100 MB\ncapacity: 100mb # 100 MB\ncapacity: 100MB # 100 MB\ncapacity: 100g # 100 GB\ncapacity: 100gb # 100 GB\ncapacity: 100GB # 100 GB\ncapacity: 100T # 100 TB\ncapacity: 100tb # 100 TB\ncapacity: 100TB # 100 TB\n"})}),"\n",(0,s.jsx)(n.p,{children:"There cannot be spaces between the number and the suffix. For example,"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"capacity: 100 tb #NOT VALID\n"})}),"\n",(0,s.jsx)(n.h3,{id:"block_size",children:(0,s.jsx)(n.code,{children:"block_size"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"block_size: 64KB\n"})}),"\n",(0,s.jsx)(n.p,{children:"This is the amount of I/O that the physical block device supports.\nRAM, for example, generally sees data in units of 4KB because this is\nthe page size of the system. HDDs, NVMes, and SSDs generally have block\nsizes of 4KB as well. Generally, this parameter doesn't need to be changed."}),"\n",(0,s.jsx)(n.h3,{id:"slab_sizes",children:(0,s.jsx)(n.code,{children:"slab_sizes"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"slab_sizes: [4KB, 16KB, 64KB, 1MB]\n"})}),"\n",(0,s.jsx)(n.p,{children:"This parameter is important to performance and resource utilization. The slab sizes dictates the I/O patterns produced in Hermes. When Hermes wants to\nwrite a 16MB blob, how does this blob actually get mapped to storage?\nIt gets fragmented into buffers, where the size of a buffer is equivalent\nto the best-fitting slab size."}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"A 16MB blob will be placed as 16 1MB buffers."}),"\n",(0,s.jsx)(n.li,{children:"A 6KB blob will be placed as 2 4KB buffers"}),"\n",(0,s.jsx)(n.li,{children:"A 33KB blob will be placed as a single 64KB buffer"}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"You should decide the buffer sizes based on the characteristics of your\nprogram. If unsure, the default slab sizes generally have worked well\nin the workloads we've tried. However, if you're finding Hermes runs\nout of space, this parameter may be the culprit."}),"\n",(0,s.jsxs)(n.h3,{id:"bandwidth-latency",children:[(0,s.jsx)(n.code,{children:"bandwidth"}),", ",(0,s.jsx)(n.code,{children:"latency"})]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"bandwidth: 1GBps\nlatency: 600us\n"})}),"\n",(0,s.jsx)(n.p,{children:"These are properties of the storage device which are used by data placement\nalgorithms to decide where to buffer data."}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Acceptable suffixes for bandwidth (case doesn't matter):"}),"\n",(0,s.jsx)(n.li,{children:"Acceptable suffixes for latency (case doesn't matter): s, ms, us, ns."}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"is_shared_device",children:(0,s.jsx)(n.code,{children:"is_shared_device"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"is_shared_device: true\n"})}),"\n",(0,s.jsx)(n.p,{children:"This indicates whether or not the device provides a shared view of\ndata across nodes. For example, a PFS is a shared device, whereas\na single hard drive is not a shared device. This parameter is not\nreally used at this time, but you do need to define it."}),"\n",(0,s.jsx)(n.h3,{id:"borg_capacity_thresh",children:(0,s.jsx)(n.code,{children:"borg_capacity_thresh"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"borg_capacity_thresh: [0.0, 1.0]\n"})}),"\n",(0,s.jsx)(n.p,{children:"This parameter is used to trigger the buffer organizer (BORG). When a\ndevice is either really low on capacity (or high on capacity) BORG\nwill be triggered to shuffle content around."}),"\n",(0,s.jsx)(n.p,{children:"The first entry indicates how much space is too little space. In this\ncase if capacity falls below 0% (i.e., never), BORG will be triggered."}),"\n",(0,s.jsx)(n.p,{children:"The second entry indicates how mcuh space is too much space. In this\ncase if capacity grows beyone 100% (i.e., never), BORG will be triggered."}),"\n",(0,s.jsx)(n.p,{children:"In other words, this example, shows how to disable BORG."}),"\n",(0,s.jsx)(n.h2,{id:"buffer-organizer-borg",children:"Buffer Organizer (BORG)"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"buffer_organizer:\n num_threads: 1\n flush_period: 1024\n blob_reorg_period: 1024\n recency_min: 0\n recency_max: 60\n freq_max: 15\n freq_min: 0\n"})}),"\n",(0,s.jsx)(n.p,{children:'The BORG contains threads for reorganizing buffers in Hermes. The number\nof threads is indicated by "num_threads". The amount of time (in ms) to\nre-scan for blobs to reorganize is given by "flush_period".'}),"\n",(0,s.jsx)(n.p,{children:"receny_max is the amount of time (in seconds) when the score of a blob\nbecomes 0. recency_min is the amount of time for the blob to have a score\nof 1."}),"\n",(0,s.jsx)(n.p,{children:"freq_max is the minimum number of times a blob needs to be accessed in the\nflushing period for the score to be equal to one. freq_min is the maximum number of times a blob can be accessed before its score becomes larger than 0."}),"\n",(0,s.jsx)(n.p,{children:"The buffer organizer is only triggered when there are space constraints\nthat need to be met at this time. If you want the BORG extremely active,\nchange the borg_capacity_thresh variable."}),"\n",(0,s.jsx)(n.h2,{id:"prefetcher",children:"Prefetcher"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:'prefetch:\n enabled: false\n apriori_schema_path: ""\n epoch_ms: 50\n is_mpi: false\n'})}),"\n",(0,s.jsx)(n.p,{children:"These parameters dictate properties of the prefetcher."}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"enabled"}),": whether to turn prefetcher on"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"apriori_schema_path"}),": internally used by apriori prefetcher"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"epoch_ms"}),": how often to call the prefetcher thread"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"is_mpi"}),": whether the program is an MPI program so that clients\nsend their ranks to the daemon during prefetching."]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"For now, prefetching is only available to the native API, not the adapters."}),"\n",(0,s.jsx)(n.h2,{id:"traits",children:"Traits"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:'traits:\n - "hermes_posix_io_client"\n - "hermes_stdio_io_client"\n - "hermes_mpiio_io_client"\n - "hermes_example_trait"\n - "hermes_prefetcher_trait"\n'})}),"\n",(0,s.jsx)(n.p,{children:"The traits category lists the set of traits that Hermes searches for\nin the LD_LIBRARY_PATH and HERMES_TRAIT_PATH environment variables.\nIt will search each directory specified in those environment variables\nfor shared objects matching these names. For example, libhermes_posix_io_client.so will be searched for."}),"\n",(0,s.jsx)(n.p,{children:"Unless you are adding custom traits, this can be left as default."}),"\n",(0,s.jsx)(n.h2,{id:"shared-memory",children:"Shared Memory"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:'shmem_name: "/hermes_shm_"\n'})}),"\n",(0,s.jsx)(n.p,{children:"This is the name of the shared memory segment hermes will create. In order\nto make this unique across users (since shared memory can be used to\nshare memory across users), we append the name of the user to this key."}),"\n",(0,s.jsx)(n.p,{children:"This generally can be left as the default value."}),"\n",(0,s.jsx)(n.h2,{id:"system-view-state",children:"System View State"}),"\n",(0,s.jsx)(n.p,{children:"This parameter is unused for now, so no need to set it."}),"\n",(0,s.jsx)(n.h2,{id:"bounding-memory-utilization",children:"Bounding Memory Utilization"}),"\n",(0,s.jsx)(n.p,{children:'When running Hermes in a limited environment, ensuring that Hermes is not over-utilizing memory is necessary. It is possible to receive "Bus Error" messages due to the OS complaining that too many pages have been allocated. We find that this happens in Docker containers frequently since they have more limited memory constraints by default.'}),"\n",(0,s.jsx)(n.p,{children:"There are a few parameters which cause Hermes to utilize memory."}),"\n",(0,s.jsx)(n.h3,{id:"using-ram-as-a-buffering-device",children:"Using RAM as a buffering device"}),"\n",(0,s.jsx)(n.p,{children:"Hermes can be configured to use RAM as a buffering device."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:'devices:\n ram:\n mount_point: ""\n capacity: 1g\n'})}),"\n",(0,s.jsx)(n.p,{children:"In this case, Hermes will reserve up to 1GB of space to use for buffering."}),"\n",(0,s.jsx)(n.h3,{id:"hashtables-for-storing-blobs--buckets",children:"Hashtables for storing blobs + buckets"}),"\n",(0,s.jsx)(n.p,{children:"Hermes will reserve space for hashtables for blobs, buckets, and traits.\nThese parameters can be configured as follows:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"mdm:\n # This represents the number of blobs and buckets before collisions start\n # to happen in the unordered_map tables.\n est_blob_count: 100000\n est_bucket_count: 100000\n est_num_traits: 256\n"})}),"\n",(0,s.jsx)(n.p,{children:"You can set these to lower values if memory is over-utilized.\nThese values should be set to roughly the number of blobs and buckets the program creates to avoid collisions in the hashtables."}),"\n",(0,s.jsx)(n.h3,{id:"bounding-non-buffering-tasks",children:"Bounding Non-Buffering Tasks"}),"\n",(0,s.jsx)(n.p,{children:"You can set a maximum boundary on the amount of memory to use for non-buffering tasks, such as reserving space for the blob + bucket hashtables."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"# Define the maximum amount of memory Hermes can use for non-buffering tasks.\n# This includes metadata management and memory allocations.\n# This memory will not be preallocated, so if you don't know, 0 indicates\n# any amount of memory\nmax_memory: 0g\n"})}),"\n",(0,s.jsx)(n.p,{children:"0g indicates infinity. Non-zero values can be set to put a boundary here."}),"\n",(0,s.jsx)(n.h3,{id:"calculating-total-amount-of-memory",children:"Calculating Total Amount of Memory"}),"\n",(0,s.jsx)(n.p,{children:"The total amount of memory Hermes can use before an hshm::Error or Bus Error is thrown can be calculated as follows:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"RAM used for Buffering (3.1.7.1) + RAM used for Non-Buffering (3.1.7.3)\n"})}),"\n",(0,s.jsx)(n.h2,{id:"client-configuration",children:"Client Configuration"}),"\n",(0,s.jsxs)(n.p,{children:["The default client configuration can be found\n",(0,s.jsx)(n.a,{href:"https://github.com/HDFGroup/hermes/blob/master/config/hermes_client_default.yaml",children:"here"}),"."]}),"\n",(0,s.jsx)(n.p,{children:"The client configuration currently only contains parameters used by\nadapters."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:'stop_daemon: false\npath_inclusions: ["/tmp/test_hermes"]\npath_exclusions: ["/"]\nfile_page_size: 1024KB\nbase_adapter_mode: kDefault\nflushing_mode: kAsync\nfile_adapter_configs:\n - path: "/"\n page_size: 1MB\n mode: kDefault\n'})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"stop_daemon"}),": stop the daemon when adapters exit. Generally, leave\nthis false and stop the daemon using finalize_daemon script. Will likely\nbe removed in the near future."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"file_page_size"}),": The page size used to fragment files into blobs in\nHermes."]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"path-inclusion--exclusion",children:"Path Inclusion / Exclusion"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:'path_inclusions: ["/tmp/test_hermes"]\npath_exclusions: ["/"]\n'})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"path_inclusions"}),": Which paths to buffer? In this case, everything which\nis a child of /tmp/test_hermes."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"path_exclusions"}),": Which paths to ignore? In this case, everything which\nis a child of the root directory. Technically everything on the system."]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:'We prioritize paths in inclusions and exclusions depending on how\nspecific the path is. In other words, we sort the paths by the length\nof the path. For example, in this case, /tmp/test_hermes will be included\nsince it has a longer path than "/". Everything other than /tmp/test_hermes\nwill be excluded.'}),"\n",(0,s.jsx)(n.h3,{id:"adapter-mode",children:"Adapter Mode"}),"\n",(0,s.jsx)(n.p,{children:"The adapter mode determines how Hermes buffers adapter data by default.\nThere are three adapter modes:"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsx)(n.li,{children:"kDefault: Hermes will buffer data and then flush to the PFS eventually"}),"\n",(0,s.jsx)(n.li,{children:"kScratch: Hermes will buffer data, but never flush"}),"\n",(0,s.jsx)(n.li,{children:"kBypass: Hermes will never buffer data, and always flush to the PFS"}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"kDefault is the real use case of Hermes, the other two are for benchmarking\nand testing purposes."}),"\n",(0,s.jsx)(n.p,{children:"This parameter can also be set by an environment variable. The\nenvironment variable is prioritized."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"HERMES_ADAPTER_MODE=kDefault \\\n./myhermesapp\n"})}),"\n",(0,s.jsx)(n.h3,{id:"file-page-size",children:"File Page Size"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"file_page_size: 1024KB\n"})}),"\n",(0,s.jsx)(n.p,{children:"This parameter dictates how adapters convert files into blobs.\nBy default, files are divided into 1024KB (1MB) blobs. Setting\nthis parameter appropriately can have impacts on\nwrite and read amplification and metadata overhead."}),"\n",(0,s.jsx)(n.p,{children:"For workloads which perform 4KB reads to a large file, each read\nwill be amplified to 1MB unless the page size is reset."}),"\n",(0,s.jsx)(n.p,{children:"For the same workload, setting a file page size equal to 4KB may\nresult in a significant increase in metadata being stored in the\nmetadata manager."}),"\n",(0,s.jsx)(n.p,{children:"In other words, this parameter is worth tuning."}),"\n",(0,s.jsx)(n.p,{children:"This parameter can also be set using an environment variable. The\nenvironment variable is prioritized."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"HERMES_PAGE_SIZE=1024KB \\\n./myhermesapp\n"})}),"\n",(0,s.jsx)(n.h3,{id:"flushing-mode",children:"Flushing Mode"}),"\n",(0,s.jsx)(n.p,{children:"The flushing mode indicates how Hermes should flush data to the PFS.\nCurrently there are two modes provided:"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsx)(n.li,{children:"kAsync: Flush data asynchronously in a background thread"}),"\n",(0,s.jsx)(n.li,{children:"kSync: Flush data synchronously"}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"kAsync is recommended. kSync is used only in unit tests since it has\nlow performance."}),"\n",(0,s.jsx)(n.h3,{id:"adapter-config",children:"Adapter Config"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:'file_adapter_configs:\n - path: "/"\n page_size: 1MB\n mode: kDefault\n'})}),"\n",(0,s.jsx)(n.p,{children:"Contains file-specific overrides to the default adapter variables defined\nabove. You can modify the adapter mode (3.2.2) and file page size for each"}),"\n",(0,s.jsx)(n.h2,{id:"provided-configurations",children:"Provided Configurations"}),"\n",(0,s.jsx)(n.p,{children:"We also provide Hermes configurations we use with a few systems to which you\nmight have access:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://github.com/HDFGroup/hermes/blob/master/test/data/ares.yaml",children:"Ares (IIT)"})}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"https://github.com/HDFGroup/hermes/tree/master/test/data",children:"Frontera (TACC)"})," (Coming soon.)"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Bear in mind that a suitable Hermes configuration also depends on\napplications' I/O workload and not just the configuration of the\nunderlying machine."}),"\n",(0,s.jsx)(n.h2,{id:"how-to-avoid-repeating-the-default-configurations",children:"How To Avoid Repeating the Default Configurations"}),"\n",(0,s.jsx)(n.p,{children:"Many parameters in Hermes can be left as default. Any parameters which\nyou would like to leave as default can be removed from your configuration\nfile completely. Hermes will fill in missing values based on the values\nin our default configurations."})]})}function d(e={}){const{wrapper:n}={...(0,a.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},1151:(e,n,i)=>{i.d(n,{Z:()=>o,a:()=>t});var s=i(7294);const a={},r=s.createContext(a);function t(e){const n=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:t(e.components),s.createElement(r.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/57efaafb.47310bb9.js b/assets/js/57efaafb.47310bb9.js
new file mode 100644
index 00000000..55a56b1e
--- /dev/null
+++ b/assets/js/57efaafb.47310bb9.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkgrc=self.webpackChunkgrc||[]).push([[5674],{3628:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>o,contentTitle:()=>l,default:()=>h,frontMatter:()=>r,metadata:()=>t,toc:()=>c});var i=s(5893),a=s(1151);const r={},l="Building Hermes",t={id:"hermes/building-hermes",title:"Building Hermes",description:"Dependencies",source:"@site/docs/03-hermes/02-building-hermes.md",sourceDirName:"03-hermes",slug:"/hermes/building-hermes",permalink:"/docs/hermes/building-hermes",draft:!1,unlisted:!1,tags:[],version:"current",sidebarPosition:2,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Main Scenario",permalink:"/docs/hermes/main-scenario"},next:{title:"Deploying Hermes",permalink:"/docs/hermes/deploying-hermes"}},o={},c=[{value:"Dependencies",id:"dependencies",level:2},{value:"Bootstrapping Spack",id:"bootstrapping-spack",level:2},{value:"Installing Hermes on a new machine with Spack",id:"installing-hermes-on-a-new-machine-with-spack",level:2},{value:"Why is my spack installation failing?",id:"why-is-my-spack-installation-failing",level:3},{value:"Environment errors",id:"environment-errors",level:4},{value:"Dependency conflicts",id:"dependency-conflicts",level:4},{value:"Compilation errors",id:"compilation-errors",level:4},{value:"Fetcher errors",id:"fetcher-errors",level:4},{value:"Corruption",id:"corruption",level:4},{value:"Building Hermes with CMake",id:"building-hermes-with-cmake",level:2},{value:"Install Dependencies",id:"install-dependencies",level:3},{value:"Hermes",id:"hermes",level:4},{value:"(Optional) SCSPKG",id:"optional-scspkg",level:4},{value:"Build Hermes",id:"build-hermes",level:3},{value:"Load Hermes dependencies",id:"load-hermes-dependencies",level:4},{value:"(Optional) Create a Hermes SCSPKG repo",id:"optional-create-a-hermes-scspkg-repo",level:4},{value:"Compile and Install",id:"compile-and-install",level:4}];function d(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,a.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h1,{id:"building-hermes",children:"Building Hermes"}),"\n",(0,i.jsx)(n.h2,{id:"dependencies",children:"Dependencies"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"A C++ compiler that supports C++ 17. GCC 9.4 is the minimum version of GCC\nthat Hermes was tested with."}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"https://mochi.readthedocs.io/en/latest/installing.html",children:"Thallium"})," - RPC library for HPC. Use a version greater than ",(0,i.jsx)(n.code,{children:"0.5"})," for RoCE support."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"https://github.com/jbeder/yaml-cpp",children:"yaml-cpp"})," - YAML file parser"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"https://github.com/lukemartinlogan/hermes_shm",children:"hermes_shm"}),": A library containing shared-memory data structures, configuration parsing, and various helper utilities"]}),"\n",(0,i.jsx)(n.li,{children:"HDF5 1.14.0 if compiling with VFD"}),"\n",(0,i.jsx)(n.li,{children:"MPI-IO adapter only tested with MPICH and OpenMPI."}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"bootstrapping-spack",children:"Bootstrapping Spack"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.a,{href:"https://spack.io/",children:"Spack"})," is the easiest way to get Hermes and all its dependencies installed."]}),"\n",(0,i.jsx)(n.p,{children:"First, add the Hermes spack repo:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"git clone https://github.com/HDFGroup/hermes\ncd hermes\ngit submodule update --init --recursive\nspack repo add ci/hermes\n"})}),"\n",(0,i.jsx)(n.p,{children:"Second, introspect your machine to ensure that spack considers software already present on your machine. If there are modulefiles, make sure all relevant modulefiles have been loaded before executing this command.\nYou should ensure that any modules relating to networking (e.g., libfabric or UCX) and MPI are loaded, since they are likely specialized to your machine:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"spack external find\n"})}),"\n",(0,i.jsx)(n.p,{children:"Third, ensure that a recent compiler is added in spack. Hermes and some of its dependencies use the full C++17 feature set and require a compiler suitable of handling this:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"spack compiler add\nspack compiler list\n"})}),"\n",(0,i.jsx)("a",{id:"installing-hermes"}),"\n",(0,i.jsx)(n.h2,{id:"installing-hermes-on-a-new-machine-with-spack",children:"Installing Hermes on a new machine with Spack"}),"\n",(0,i.jsx)(n.p,{children:"Before installing, you may want to verify that spack is going to\ninstall Hermes with the correct dependencies."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"spack spec -I hermes@master\n"})}),"\n",(0,i.jsx)(n.p,{children:"Some questions you may want to ask yourself:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:"Is the correct MPI version being used?"}),"\n",(0,i.jsx)(n.li,{children:"Is the correct libfabric being used?"}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"To install the default Hermes:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"spack install hermes@master\n"})}),"\n",(0,i.jsx)(n.p,{children:"Hermes additionally has variants for intercepting MPI-IO and HDF5. They\ncan be installed as follows:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"spack install hermes+vfd+mpiio@master\n"})}),"\n",(0,i.jsx)(n.p,{children:"If you intend to use high-performance networks such as verbs,\nyou will need to have knowledge of your specific system. This step is highly dependent on the machine, and you may need to consult your machine's documentation or sysadmin to determine what kind of network you use. If your machine uses infiniband, libfabric+verbs is probably for you. Libfabric does not come preinstalled with verbs support in spack."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"spack install hermes@master ^ libfabric fabrics=rxm,sockets,tcp,udp,verbs\n"})}),"\n",(0,i.jsx)(n.h3,{id:"why-is-my-spack-installation-failing",children:"Why is my spack installation failing?"}),"\n",(0,i.jsx)(n.p,{children:"While spack automates the installation of most dependencies, it is under active development and by no means perfect. We have identified several situations that have caused difficulty when installing Hermes across HPC sites. These issues are not necessarily related to Hermes itself, rather spack in general."}),"\n",(0,i.jsx)(n.p,{children:"If Hermes fails to install use debug mode to get more information:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"spack -d install hermes@master\n"})}),"\n",(0,i.jsx)(n.h4,{id:"environment-errors",children:"Environment errors"}),"\n",(0,i.jsx)(n.p,{children:"Your machine may have specific expectations on certain dependencies.\nBy default, spack installs everything from scratch. However, if your\nmachine has software installed as modulefiles, spack will not see\nthese until explicitly told to."}),"\n",(0,i.jsx)(n.p,{children:"We have found several instances of users installing Hermes before adding relevant modulefiles on their machine to spack. Probably the most important modules are MPI installations and networking libraries (e.g., libfabric, UCX, etc). This is because they are installed and configured specifically by the sysadmin for the particular machine. When installing Hermes, make sure any modulefile that you would typically use to build software is loaded and then run:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"spack external find\n"})}),"\n",(0,i.jsx)(n.p,{children:"To view the set of external packages discovered, run:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"cat ~/.spack/packages.yaml\n"})}),"\n",(0,i.jsx)(n.p,{children:"Spack external is not by any means perfect. You may find that some\nmodules you intend to use have not been automatically discovered.\nIn this situation, you can edit the packages.yaml file manually\nto add the packages. The format of the yaml file is straightforward."}),"\n",(0,i.jsx)(n.h4,{id:"dependency-conflicts",children:"Dependency conflicts"}),"\n",(0,i.jsx)(n.p,{children:"There may be multiple versions of the same software installed at the\nsame time. To determine what dependencies Hermes will be using, run:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"spack spec -I hermes@master\n"})}),"\n",(0,i.jsxs)(n.p,{children:["You may find that some dependencies are not the ones you had intended.\nFor example, maybe you have both MPICH 3.3.2 and 3.4.3 installed.\nYou can choose a specific version of a dependency using ",(0,i.jsx)(n.code,{children:"^"}),". Below\nis an example of installing with mpich@3.3.2"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"spack install hermes@master ^ mpich@3.3.2\n"})}),"\n",(0,i.jsx)(n.h4,{id:"compilation-errors",children:"Compilation errors"}),"\n",(0,i.jsx)(n.p,{children:"Hermes and some of its dependencies (e.g., thallium) require C++17 support. Not all compilers support this -- even if they say they do.\nGCC 8.5.0, for example, has partial C++17 support, but does not have the full feature set. Many HPC sites have old compilers loaded by default.\nEnsure that a recent C++ compiler is used when compiling Hermes. As a guideline, GCC 9.4 is the earliest GCC version we have tested successfully on Hermes."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"spack compiler add\n"})}),"\n",(0,i.jsxs)(n.p,{children:["In order to ensure that spack uses the correct compiler, you can\nuse the ",(0,i.jsx)(n.code,{children:"%"})," symbol:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"spack install hermes@master%gcc@9.4\n"})}),"\n",(0,i.jsx)(n.h4,{id:"fetcher-errors",children:"Fetcher errors"}),"\n",(0,i.jsx)(n.p,{children:"A fetcher error occurs when a package fails to download. There are three reasons this may occur:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:"You lost internet connection when downloading. Ensure you are actually connected to the internet by pinging a well-known website such as google."}),"\n",(0,i.jsx)(n.li,{children:"You are running on a restricted network and your proxy is misconfigured. In this case, you must contact your sysadmins to resolve the issue."}),"\n",(0,i.jsx)(n.li,{children:"The spackage is outdated and contains a broken URL. Either contact the maintainers of the package or visit their documentation to make a custom installation."}),"\n"]}),"\n",(0,i.jsx)(n.h4,{id:"corruption",children:"Corruption"}),"\n",(0,i.jsx)(n.p,{children:"Spack can become corrupted if a package's installation is cutoff prematurely. There's not much that can be done here outside of reinstalling spack and the Hermes dependencies"}),"\n",(0,i.jsx)(n.p,{children:"To effectively uninstall spack:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"# remove the spack metadata files\nrm -rf ~/.spack\n# remove the cloned spack repo\nrm -rf /path/to/spack\n"})}),"\n",(0,i.jsx)(n.h2,{id:"building-hermes-with-cmake",children:"Building Hermes with CMake"}),"\n",(0,i.jsx)(n.p,{children:"For those developing Hermes, uninstalling and reinstalling from spack\nis extremely cumbersome. As an alternative to spack, Hermes can be\ninstalled manually with a combination of spack and CMake."}),"\n",(0,i.jsx)(n.h3,{id:"install-dependencies",children:"Install Dependencies"}),"\n",(0,i.jsx)(n.h4,{id:"hermes",children:"Hermes"}),"\n",(0,i.jsxs)(n.p,{children:["Install Hermes as you typically would following the instructrions\nin ",(0,i.jsx)(n.a,{href:"#installing-hermes",children:"Section 1"}),". While the Hermes version itself\nis not useful, the installation process will install all dependencies\nwhich will make life much easier for a manual Hermes build. To save\nsome time, you could choose to install ",(0,i.jsx)(n.code,{children:"hermes_shm"})," instead, which contains the same dependencies and variants as Hermes itself."]}),"\n",(0,i.jsx)(n.h4,{id:"optional-scspkg",children:"(Optional) SCSPKG"}),"\n",(0,i.jsxs)(n.p,{children:["To help with managing the organization of manually-built software, we created a tool called ",(0,i.jsx)(n.a,{href:"https://github.com/grc-iit/scspkg",children:"SCSPKG"})," that helps automate the construction of modulefiles."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:'git clone https://github.com/grc-iit/scspkg.git\ncd scspkg\npip install -e . --user\necho "module use $(scspkg module dir)" >> ~/.bashrc\nscspkg init False\n'})}),"\n",(0,i.jsx)(n.h3,{id:"build-hermes",children:"Build Hermes"}),"\n",(0,i.jsx)(n.h4,{id:"load-hermes-dependencies",children:"Load Hermes dependencies"}),"\n",(0,i.jsx)(n.p,{children:"First, load all Hermes dependencies. Hermes_shm is a spackage that\ncontains the same exact dependencies as the full Hermes code:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"spack load hermes_shm\n"})}),"\n",(0,i.jsx)(n.h4,{id:"optional-create-a-hermes-scspkg-repo",children:"(Optional) Create a Hermes SCSPKG repo"}),"\n",(0,i.jsx)(n.p,{children:"An SCSPKG repo for Hermes can be created as follows:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"scspkg create hermes_run\n"})}),"\n",(0,i.jsx)(n.p,{children:"This will do three things:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["Create the ",(0,i.jsx)(n.strong,{children:"source"})," directory, which is where uncompiled source code is stored. Hermes, for example, could be cloned in this directory -- ",(0,i.jsx)(n.strong,{children:"although this is not required"}),". This directory is created to help developers organize and prevent cluttering their home directory."]}),"\n",(0,i.jsxs)(n.li,{children:["Create the ",(0,i.jsx)(n.strong,{children:"root"})," directory, which is where compiled code is installed to. I.e., this is the directory CMAKE_INSTALL_PREFIX will point to."]}),"\n",(0,i.jsx)(n.li,{children:"Create a modulefile containing most relevant environment variables needed for building HPC software (PATH, LD_LIBRARY_PATH, etc.). The modulefile will contain the root directory."}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"The path to the source directory is given by the command:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"scspkg pkg src hermes_run\n"})}),"\n",(0,i.jsx)(n.p,{children:"The path to the root directory is given by the command:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"scspkg pkg root hermes_run\n"})}),"\n",(0,i.jsx)(n.p,{children:"To view the modulefile, run:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"module show hermes_run\n"})}),"\n",(0,i.jsx)(n.h4,{id:"compile-and-install",children:"Compile and Install"}),"\n",(0,i.jsx)(n.p,{children:"After this, the local installation can be created as follows:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"mkdir build\ncd build\ncmake ../ -DCMAKE_INSTALL_PREFIX=$(scspkg pkg root hermes_run)\nmake -j32 install\n"})}),"\n",(0,i.jsx)(n.p,{children:"To compile with MPI-IO and VFD interceptors:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"cmake ../ \\\n-DHERMES_ENABLE_MPIIO_ADAPTER=ON \\\n-DHERMES_ENABLE_VFD=ON \\\n-DCMAKE_INSTALL_PREFIX=$(scspkg pkg root hermes_run)\n"})}),"\n",(0,i.jsxs)(n.p,{children:["There are several options provided in the root Hermes ",(0,i.jsx)(n.a,{href:"https://github.com/HDFGroup/hermes/blob/master/CMakeLists.txt",children:"CMake"}),". To view these\noptions, one can run run:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"ccmake ../\n"})})]})}function h(e={}){const{wrapper:n}={...(0,a.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},1151:(e,n,s)=>{s.d(n,{Z:()=>t,a:()=>l});var i=s(7294);const a={},r=i.createContext(a);function l(e){const n=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function t(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:l(e.components),i.createElement(r.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/57efaafb.c54ae115.js b/assets/js/57efaafb.c54ae115.js
deleted file mode 100644
index 0fd0785a..00000000
--- a/assets/js/57efaafb.c54ae115.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkgrc=self.webpackChunkgrc||[]).push([[5674],{3628:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>o,contentTitle:()=>l,default:()=>h,frontMatter:()=>r,metadata:()=>t,toc:()=>c});var i=s(5893),a=s(1151);const r={},l=void 0,t={id:"hermes/building-hermes",title:"building-hermes",description:"Dependencies",source:"@site/docs/03-hermes/02-building-hermes.md",sourceDirName:"03-hermes",slug:"/hermes/building-hermes",permalink:"/docs/hermes/building-hermes",draft:!1,unlisted:!1,tags:[],version:"current",sidebarPosition:2,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Main Scenario",permalink:"/docs/hermes/main-scenario"},next:{title:"deploying-hermes",permalink:"/docs/hermes/deploying-hermes"}},o={},c=[{value:"Dependencies",id:"dependencies",level:2},{value:"Bootstrapping Spack",id:"bootstrapping-spack",level:2},{value:"Installing Hermes on a new machine with Spack",id:"installing-hermes-on-a-new-machine-with-spack",level:2},{value:"Why is my spack installation failing?",id:"why-is-my-spack-installation-failing",level:3},{value:"Environment errors",id:"environment-errors",level:4},{value:"Dependency conflicts",id:"dependency-conflicts",level:4},{value:"Compilation errors",id:"compilation-errors",level:4},{value:"Fetcher errors",id:"fetcher-errors",level:4},{value:"Corruption",id:"corruption",level:4},{value:"Building Hermes with CMake",id:"building-hermes-with-cmake",level:2},{value:"Install Dependencies",id:"install-dependencies",level:3},{value:"Hermes",id:"hermes",level:4},{value:"(Optional) SCSPKG",id:"optional-scspkg",level:4},{value:"Build Hermes",id:"build-hermes",level:3},{value:"Load Hermes dependencies",id:"load-hermes-dependencies",level:4},{value:"(Optional) Create a Hermes SCSPKG repo",id:"optional-create-a-hermes-scspkg-repo",level:4},{value:"Compile and Install",id:"compile-and-install",level:4}];function d(e){const n={a:"a",code:"code",h2:"h2",h3:"h3",h4:"h4",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,a.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h2,{id:"dependencies",children:"Dependencies"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"A C++ compiler that supports C++ 17. GCC 9.4 is the minimum version of GCC\nthat Hermes was tested with."}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"https://mochi.readthedocs.io/en/latest/installing.html",children:"Thallium"})," - RPC library for HPC. Use a version greater than ",(0,i.jsx)(n.code,{children:"0.5"})," for RoCE support."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"https://github.com/jbeder/yaml-cpp",children:"yaml-cpp"})," - YAML file parser"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"https://github.com/lukemartinlogan/hermes_shm",children:"hermes_shm"}),": A library containing shared-memory data structures, configuration parsing, and various helper utilities"]}),"\n",(0,i.jsx)(n.li,{children:"HDF5 1.14.0 if compiling with VFD"}),"\n",(0,i.jsx)(n.li,{children:"MPI-IO adapter only tested with MPICH and OpenMPI."}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"bootstrapping-spack",children:"Bootstrapping Spack"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.a,{href:"https://spack.io/",children:"Spack"})," is the easiest way to get Hermes and all its dependencies installed."]}),"\n",(0,i.jsx)(n.p,{children:"First, add the Hermes spack repo:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"git clone https://github.com/HDFGroup/hermes\ncd hermes\ngit submodule update --init --recursive\nspack repo add ci/hermes\n"})}),"\n",(0,i.jsx)(n.p,{children:"Second, introspect your machine to ensure that spack considers software already present on your machine. If there are modulefiles, make sure all relevant modulefiles have been loaded before executing this command.\nYou should ensure that any modules relating to networking (e.g., libfabric or UCX) and MPI are loaded, since they are likely specialized to your machine:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"spack external find\n"})}),"\n",(0,i.jsx)(n.p,{children:"Third, ensure that a recent compiler is added in spack. Hermes and some of its dependencies use the full C++17 feature set and require a compiler suitable of handling this:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"spack compiler add\nspack compiler list\n"})}),"\n",(0,i.jsx)("a",{id:"installing-hermes"}),"\n",(0,i.jsx)(n.h2,{id:"installing-hermes-on-a-new-machine-with-spack",children:"Installing Hermes on a new machine with Spack"}),"\n",(0,i.jsx)(n.p,{children:"Before installing, you may want to verify that spack is going to\ninstall Hermes with the correct dependencies."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"spack spec -I hermes@master\n"})}),"\n",(0,i.jsx)(n.p,{children:"Some questions you may want to ask yourself:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:"Is the correct MPI version being used?"}),"\n",(0,i.jsx)(n.li,{children:"Is the correct libfabric being used?"}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"To install the default Hermes:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"spack install hermes@master\n"})}),"\n",(0,i.jsx)(n.p,{children:"Hermes additionally has variants for intercepting MPI-IO and HDF5. They\ncan be installed as follows:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"spack install hermes+vfd+mpiio@master\n"})}),"\n",(0,i.jsx)(n.p,{children:"If you intend to use high-performance networks such as verbs,\nyou will need to have knowledge of your specific system. This step is highly dependent on the machine, and you may need to consult your machine's documentation or sysadmin to determine what kind of network you use. If your machine uses infiniband, libfabric+verbs is probably for you. Libfabric does not come preinstalled with verbs support in spack."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"spack install hermes@master ^ libfabric fabrics=rxm,sockets,tcp,udp,verbs\n"})}),"\n",(0,i.jsx)(n.h3,{id:"why-is-my-spack-installation-failing",children:"Why is my spack installation failing?"}),"\n",(0,i.jsx)(n.p,{children:"While spack automates the installation of most dependencies, it is under active development and by no means perfect. We have identified several situations that have caused difficulty when installing Hermes across HPC sites. These issues are not necessarily related to Hermes itself, rather spack in general."}),"\n",(0,i.jsx)(n.p,{children:"If Hermes fails to install use debug mode to get more information:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"spack -d install hermes@master\n"})}),"\n",(0,i.jsx)(n.h4,{id:"environment-errors",children:"Environment errors"}),"\n",(0,i.jsx)(n.p,{children:"Your machine may have specific expectations on certain dependencies.\nBy default, spack installs everything from scratch. However, if your\nmachine has software installed as modulefiles, spack will not see\nthese until explicitly told to."}),"\n",(0,i.jsx)(n.p,{children:"We have found several instances of users installing Hermes before adding relevant modulefiles on their machine to spack. Probably the most important modules are MPI installations and networking libraries (e.g., libfabric, UCX, etc). This is because they are installed and configured specifically by the sysadmin for the particular machine. When installing Hermes, make sure any modulefile that you would typically use to build software is loaded and then run:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"spack external find\n"})}),"\n",(0,i.jsx)(n.p,{children:"To view the set of external packages discovered, run:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"cat ~/.spack/packages.yaml\n"})}),"\n",(0,i.jsx)(n.p,{children:"Spack external is not by any means perfect. You may find that some\nmodules you intend to use have not been automatically discovered.\nIn this situation, you can edit the packages.yaml file manually\nto add the packages. The format of the yaml file is straightforward."}),"\n",(0,i.jsx)(n.h4,{id:"dependency-conflicts",children:"Dependency conflicts"}),"\n",(0,i.jsx)(n.p,{children:"There may be multiple versions of the same software installed at the\nsame time. To determine what dependencies Hermes will be using, run:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"spack spec -I hermes@master\n"})}),"\n",(0,i.jsxs)(n.p,{children:["You may find that some dependencies are not the ones you had intended.\nFor example, maybe you have both MPICH 3.3.2 and 3.4.3 installed.\nYou can choose a specific version of a dependency using ",(0,i.jsx)(n.code,{children:"^"}),". Below\nis an example of installing with mpich@3.3.2"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"spack install hermes@master ^ mpich@3.3.2\n"})}),"\n",(0,i.jsx)(n.h4,{id:"compilation-errors",children:"Compilation errors"}),"\n",(0,i.jsx)(n.p,{children:"Hermes and some of its dependencies (e.g., thallium) require C++17 support. Not all compilers support this -- even if they say they do.\nGCC 8.5.0, for example, has partial C++17 support, but does not have the full feature set. Many HPC sites have old compilers loaded by default.\nEnsure that a recent C++ compiler is used when compiling Hermes. As a guideline, GCC 9.4 is the earliest GCC version we have tested successfully on Hermes."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"spack compiler add\n"})}),"\n",(0,i.jsxs)(n.p,{children:["In order to ensure that spack uses the correct compiler, you can\nuse the ",(0,i.jsx)(n.code,{children:"%"})," symbol:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"spack install hermes@master%gcc@9.4\n"})}),"\n",(0,i.jsx)(n.h4,{id:"fetcher-errors",children:"Fetcher errors"}),"\n",(0,i.jsx)(n.p,{children:"A fetcher error occurs when a package fails to download. There are three reasons this may occur:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:"You lost internet connection when downloading. Ensure you are actually connected to the internet by pinging a well-known website such as google."}),"\n",(0,i.jsx)(n.li,{children:"You are running on a restricted network and your proxy is misconfigured. In this case, you must contact your sysadmins to resolve the issue."}),"\n",(0,i.jsx)(n.li,{children:"The spackage is outdated and contains a broken URL. Either contact the maintainers of the package or visit their documentation to make a custom installation."}),"\n"]}),"\n",(0,i.jsx)(n.h4,{id:"corruption",children:"Corruption"}),"\n",(0,i.jsx)(n.p,{children:"Spack can become corrupted if a package's installation is cutoff prematurely. There's not much that can be done here outside of reinstalling spack and the Hermes dependencies"}),"\n",(0,i.jsx)(n.p,{children:"To effectively uninstall spack:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"# remove the spack metadata files\nrm -rf ~/.spack\n# remove the cloned spack repo\nrm -rf /path/to/spack\n"})}),"\n",(0,i.jsx)(n.h2,{id:"building-hermes-with-cmake",children:"Building Hermes with CMake"}),"\n",(0,i.jsx)(n.p,{children:"For those developing Hermes, uninstalling and reinstalling from spack\nis extremely cumbersome. As an alternative to spack, Hermes can be\ninstalled manually with a combination of spack and CMake."}),"\n",(0,i.jsx)(n.h3,{id:"install-dependencies",children:"Install Dependencies"}),"\n",(0,i.jsx)(n.h4,{id:"hermes",children:"Hermes"}),"\n",(0,i.jsxs)(n.p,{children:["Install Hermes as you typically would following the instructrions\nin ",(0,i.jsx)(n.a,{href:"#installing-hermes",children:"Section 1"}),". While the Hermes version itself\nis not useful, the installation process will install all dependencies\nwhich will make life much easier for a manual Hermes build. To save\nsome time, you could choose to install ",(0,i.jsx)(n.code,{children:"hermes_shm"})," instead, which contains the same dependencies and variants as Hermes itself."]}),"\n",(0,i.jsx)(n.h4,{id:"optional-scspkg",children:"(Optional) SCSPKG"}),"\n",(0,i.jsxs)(n.p,{children:["To help with managing the organization of manually-built software, we created a tool called ",(0,i.jsx)(n.a,{href:"https://github.com/grc-iit/scspkg",children:"SCSPKG"})," that helps automate the construction of modulefiles."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:'git clone https://github.com/grc-iit/scspkg.git\ncd scspkg\npip install -e . --user\necho "module use $(scspkg module dir)" >> ~/.bashrc\nscspkg init False\n'})}),"\n",(0,i.jsx)(n.h3,{id:"build-hermes",children:"Build Hermes"}),"\n",(0,i.jsx)(n.h4,{id:"load-hermes-dependencies",children:"Load Hermes dependencies"}),"\n",(0,i.jsx)(n.p,{children:"First, load all Hermes dependencies. Hermes_shm is a spackage that\ncontains the same exact dependencies as the full Hermes code:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"spack load hermes_shm\n"})}),"\n",(0,i.jsx)(n.h4,{id:"optional-create-a-hermes-scspkg-repo",children:"(Optional) Create a Hermes SCSPKG repo"}),"\n",(0,i.jsx)(n.p,{children:"An SCSPKG repo for Hermes can be created as follows:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"scspkg create hermes_run\n"})}),"\n",(0,i.jsx)(n.p,{children:"This will do three things:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["Create the ",(0,i.jsx)(n.strong,{children:"source"})," directory, which is where uncompiled source code is stored. Hermes, for example, could be cloned in this directory -- ",(0,i.jsx)(n.strong,{children:"although this is not required"}),". This directory is created to help developers organize and prevent cluttering their home directory."]}),"\n",(0,i.jsxs)(n.li,{children:["Create the ",(0,i.jsx)(n.strong,{children:"root"})," directory, which is where compiled code is installed to. I.e., this is the directory CMAKE_INSTALL_PREFIX will point to."]}),"\n",(0,i.jsx)(n.li,{children:"Create a modulefile containing most relevant environment variables needed for building HPC software (PATH, LD_LIBRARY_PATH, etc.). The modulefile will contain the root directory."}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"The path to the source directory is given by the command:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"scspkg pkg src hermes_run\n"})}),"\n",(0,i.jsx)(n.p,{children:"The path to the root directory is given by the command:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"scspkg pkg root hermes_run\n"})}),"\n",(0,i.jsx)(n.p,{children:"To view the modulefile, run:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"module show hermes_run\n"})}),"\n",(0,i.jsx)(n.h4,{id:"compile-and-install",children:"Compile and Install"}),"\n",(0,i.jsx)(n.p,{children:"After this, the local installation can be created as follows:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"mkdir build\ncd build\ncmake ../ -DCMAKE_INSTALL_PREFIX=$(scspkg pkg root hermes_run)\nmake -j32 install\n"})}),"\n",(0,i.jsx)(n.p,{children:"To compile with MPI-IO and VFD interceptors:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"cmake ../ \\\n-DHERMES_ENABLE_MPIIO_ADAPTER=ON \\\n-DHERMES_ENABLE_VFD=ON \\\n-DCMAKE_INSTALL_PREFIX=$(scspkg pkg root hermes_run)\n"})}),"\n",(0,i.jsxs)(n.p,{children:["There are several options provided in the root Hermes ",(0,i.jsx)(n.a,{href:"https://github.com/HDFGroup/hermes/blob/master/CMakeLists.txt",children:"CMake"}),". To view these\noptions, one can run run:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"ccmake ../\n"})})]})}function h(e={}){const{wrapper:n}={...(0,a.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},1151:(e,n,s)=>{s.d(n,{Z:()=>t,a:()=>l});var i=s(7294);const a={},r=i.createContext(a);function l(e){const n=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function t(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:l(e.components),i.createElement(r.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/935f2afb.cdd2fb36.js b/assets/js/935f2afb.0a7348b3.js
similarity index 98%
rename from assets/js/935f2afb.cdd2fb36.js
rename to assets/js/935f2afb.0a7348b3.js
index 0d9a75c6..ab06fedb 100644
--- a/assets/js/935f2afb.cdd2fb36.js
+++ b/assets/js/935f2afb.0a7348b3.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkgrc=self.webpackChunkgrc||[]).push([[53],{1109:e=>{e.exports=JSON.parse('{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"tutorialSidebar":[{"type":"link","label":"Welcome","href":"/docs/index","docId":"index","unlisted":false},{"type":"category","label":"HPC Tutorials","collapsible":true,"collapsed":true,"items":[{"type":"category","label":"Linux Introduction","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Choosing an OS","href":"/docs/hpc-tutorials/linux-introduction/choosing-an-os","docId":"hpc-tutorials/linux-introduction/choosing-an-os","unlisted":false},{"type":"link","label":"Basics of using a Terminal","href":"/docs/hpc-tutorials/linux-introduction/using-a-terminal","docId":"hpc-tutorials/linux-introduction/using-a-terminal","unlisted":false},{"type":"link","label":"SSH","href":"/docs/hpc-tutorials/linux-introduction/ssh","docId":"hpc-tutorials/linux-introduction/ssh","unlisted":false}],"href":"/docs/category/linux-introduction"},{"type":"category","label":"Installing HPC Software","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Building With Spack","href":"/docs/hpc-tutorials/installing-hpc-software/building-with-spack","docId":"hpc-tutorials/installing-hpc-software/building-with-spack","unlisted":false},{"type":"link","label":"Building From Scratch","href":"/docs/hpc-tutorials/installing-hpc-software/building-from-scratch","docId":"hpc-tutorials/installing-hpc-software/building-from-scratch","unlisted":false}],"href":"/docs/category/installing-hpc-software"},{"type":"category","label":"Important Environment Variables","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"CMAKE_MODULE_PATH","href":"/docs/hpc-tutorials/important-environment-variables/cmake-module-path","docId":"hpc-tutorials/important-environment-variables/cmake-module-path","unlisted":false},{"type":"link","label":"CMAKE_PREFIX_PATH","href":"/docs/hpc-tutorials/important-environment-variables/cmake-prefix-path","docId":"hpc-tutorials/important-environment-variables/cmake-prefix-path","unlisted":false},{"type":"link","label":"CPATH","href":"/docs/hpc-tutorials/important-environment-variables/cpath","docId":"hpc-tutorials/important-environment-variables/cpath","unlisted":false},{"type":"link","label":"JAVA_HOME","href":"/docs/hpc-tutorials/important-environment-variables/java-home","docId":"hpc-tutorials/important-environment-variables/java-home","unlisted":false},{"type":"link","label":"LD_LIBRARY_PATH","href":"/docs/hpc-tutorials/important-environment-variables/ld-library-path","docId":"hpc-tutorials/important-environment-variables/ld-library-path","unlisted":false},{"type":"link","label":"LD_PRELOAD","href":"/docs/hpc-tutorials/important-environment-variables/ld-preload","docId":"hpc-tutorials/important-environment-variables/ld-preload","unlisted":false},{"type":"link","label":"LIBRARY_PATH","href":"/docs/hpc-tutorials/important-environment-variables/library-path","docId":"hpc-tutorials/important-environment-variables/library-path","unlisted":false},{"type":"link","label":"PATH","href":"/docs/hpc-tutorials/important-environment-variables/path","docId":"hpc-tutorials/important-environment-variables/path","unlisted":false},{"type":"link","label":"PYTHONPATH","href":"/docs/hpc-tutorials/important-environment-variables/pythonpath","docId":"hpc-tutorials/important-environment-variables/pythonpath","unlisted":false}],"href":"/docs/category/important-environment-variables"},{"type":"category","label":"C++ Introduction","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Hello World","href":"/docs/hpc-tutorials/cpp-introduction/hello-world","docId":"hpc-tutorials/cpp-introduction/hello-world","unlisted":false}],"href":"/docs/category/c-introduction"}]},{"type":"category","label":"Hermes","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Main Scenario","href":"/docs/hermes/main-scenario","docId":"hermes/main-scenario","unlisted":false},{"type":"link","label":"building-hermes","href":"/docs/hermes/building-hermes","docId":"hermes/building-hermes","unlisted":false},{"type":"link","label":"deploying-hermes","href":"/docs/hermes/deploying-hermes","docId":"hermes/deploying-hermes","unlisted":false},{"type":"link","label":"Configuration","href":"/docs/hermes/configuration","docId":"hermes/configuration","unlisted":false},{"type":"category","label":"Components","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Buffer Organizer","href":"/docs/hermes/components/buffer-organizer","docId":"hermes/components/buffer-organizer","unlisted":false},{"type":"link","label":"Buffer Pool","href":"/docs/hermes/components/buffer-pool","docId":"hermes/components/buffer-pool","unlisted":false},{"type":"link","label":"Buffering Target","href":"/docs/hermes/components/buffering-target","docId":"hermes/components/buffering-target","unlisted":false},{"type":"link","label":"Data Placement","href":"/docs/hermes/components/data-placement","docId":"hermes/components/data-placement","unlisted":false},{"type":"link","label":"Data Staging","href":"/docs/hermes/components/data-staging","docId":"hermes/components/data-staging","unlisted":false},{"type":"link","label":"Runtime","href":"/docs/hermes/components/runtime","docId":"hermes/components/runtime","unlisted":false},{"type":"link","label":"Distributed Metadata","href":"/docs/hermes/components/distributed-metadata","docId":"hermes/components/distributed-metadata","unlisted":false},{"type":"link","label":"Prefetcher","href":"/docs/hermes/components/prefetcher","docId":"hermes/components/prefetcher","unlisted":false},{"type":"link","label":"Examples","href":"/docs/hermes/components/examples","docId":"hermes/components/examples","unlisted":false},{"type":"link","label":"Tagging","href":"/docs/hermes/components/tagging","docId":"hermes/components/tagging","unlisted":false},{"type":"link","label":"Topology","href":"/docs/hermes/components/topology","docId":"hermes/components/topology","unlisted":false}]},{"type":"link","label":"Programming","href":"/docs/hermes/programming","docId":"hermes/programming","unlisted":false},{"type":"link","label":"Adapters","href":"/docs/hermes/adapters","docId":"hermes/adapters","unlisted":false},{"type":"link","label":"Quick Start Guide","href":"/docs/hermes/quick-start","docId":"hermes/quick-start","unlisted":false},{"type":"link","label":"Debugging","href":"/docs/hermes/debugging","docId":"hermes/debugging","unlisted":false},{"type":"link","label":"Doxygen","href":"/docs/hermes/doxygen","docId":"hermes/doxygen","unlisted":false},{"type":"link","label":"Frequently Asked Questions","href":"/docs/hermes/faq","docId":"hermes/faq","unlisted":false}],"href":"/docs/category/hermes"},{"type":"category","label":"ChronoLog","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Introduction","href":"/docs/chronolog/index","docId":"chronolog/index","unlisted":false}]},{"type":"category","label":"Jarvis","collapsible":true,"collapsed":true,"items":[{"type":"category","label":"jarvis-util","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Introduction","href":"/docs/jarvis/jarvis-util/index","docId":"jarvis/jarvis-util/index","unlisted":false},{"type":"link","label":"Program Execution","href":"/docs/jarvis/jarvis-util/program-execution","docId":"jarvis/jarvis-util/program-execution","unlisted":false},{"type":"link","label":"Built-in Wrappers","href":"/docs/jarvis/jarvis-util/builtin-wrappers","docId":"jarvis/jarvis-util/builtin-wrappers","unlisted":false},{"type":"link","label":"Argument Parsing","href":"/docs/jarvis/jarvis-util/argument-parsing","docId":"jarvis/jarvis-util/argument-parsing","unlisted":false},{"type":"link","label":"Hostfile","href":"/docs/jarvis/jarvis-util/hostfile","docId":"jarvis/jarvis-util/hostfile","unlisted":false}]},{"type":"category","label":"jarvis-cd","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Introduction","href":"/docs/jarvis/jarvis-cd/index","docId":"jarvis/jarvis-cd/index","unlisted":false},{"type":"link","label":"Getting Standard","href":"/docs/jarvis/jarvis-cd/getting-started","docId":"jarvis/jarvis-cd/getting-started","unlisted":false},{"type":"link","label":"Resource Graph","href":"/docs/jarvis/jarvis-cd/resource-graph","docId":"jarvis/jarvis-cd/resource-graph","unlisted":false},{"type":"link","label":"Design & Motivation","href":"/docs/jarvis/jarvis-cd/design-motivation","docId":"jarvis/jarvis-cd/design-motivation","unlisted":false},{"type":"link","label":"Custom Repos","href":"/docs/jarvis/jarvis-cd/custom-repos","docId":"jarvis/jarvis-cd/custom-repos","unlisted":false},{"type":"link","label":"Building a Package","href":"/docs/jarvis/jarvis-cd/building-package","docId":"jarvis/jarvis-cd/building-package","unlisted":false},{"type":"link","label":"Python API","href":"/docs/jarvis/jarvis-cd/python-api","docId":"jarvis/jarvis-cd/python-api","unlisted":false},{"type":"category","label":"Packages","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"CM1","href":"/docs/jarvis/jarvis-cd/packages/cm1","docId":"jarvis/jarvis-cd/packages/cm1","unlisted":false},{"type":"link","label":"DeepDriveMD","href":"/docs/jarvis/jarvis-cd/packages/deepdrivemd","docId":"jarvis/jarvis-cd/packages/deepdrivemd","unlisted":false},{"type":"link","label":"Gadget2","href":"/docs/jarvis/jarvis-cd/packages/gadget2","docId":"jarvis/jarvis-cd/packages/gadget2","unlisted":false},{"type":"link","label":"Gadget","href":"/docs/jarvis/jarvis-cd/packages/gadget4","docId":"jarvis/jarvis-cd/packages/gadget4","unlisted":false},{"type":"link","label":"Nyx","href":"/docs/jarvis/jarvis-cd/packages/nyx","docId":"jarvis/jarvis-cd/packages/nyx","unlisted":false},{"type":"link","label":"VPIC Kokkos","href":"/docs/jarvis/jarvis-cd/packages/vpic-kokkos","docId":"jarvis/jarvis-cd/packages/vpic-kokkos","unlisted":false},{"type":"link","label":"VPIC","href":"/docs/jarvis/jarvis-cd/packages/vpic","docId":"jarvis/jarvis-cd/packages/vpic","unlisted":false},{"type":"link","label":"WRF","href":"/docs/jarvis/jarvis-cd/packages/wrf","docId":"jarvis/jarvis-cd/packages/wrf","unlisted":false}]},{"type":"link","label":"Schedulers","href":"/docs/jarvis/jarvis-cd/schedulers","docId":"jarvis/jarvis-cd/schedulers","unlisted":false},{"type":"link","label":"Virtualization","href":"/docs/jarvis/jarvis-cd/virtualization","docId":"jarvis/jarvis-cd/virtualization","unlisted":false},{"type":"link","label":"Future Work","href":"/docs/jarvis/jarvis-cd/future-work","docId":"jarvis/jarvis-cd/future-work","unlisted":false}]}]}]},"docs":{"chronolog/index":{"id":"chronolog/index","title":"Introduction","description":"Synopsis","sidebar":"tutorialSidebar"},"hermes/adapters":{"id":"hermes/adapters","title":"Adapters","description":"Hermes Ecosystem","sidebar":"tutorialSidebar"},"hermes/building-hermes":{"id":"hermes/building-hermes","title":"building-hermes","description":"Dependencies","sidebar":"tutorialSidebar"},"hermes/components/buffer-organizer":{"id":"hermes/components/buffer-organizer","title":"Buffer Organizer","description":"The Buffer Organizer is the \\"corrector\\" half of our","sidebar":"tutorialSidebar"},"hermes/components/buffer-pool":{"id":"hermes/components/buffer-pool","title":"Buffer Pool","description":"The main idea behind the Buffer Pool is to avoid the runtime","sidebar":"tutorialSidebar"},"hermes/components/buffering-target":{"id":"hermes/components/buffering-target","title":"Buffering Target","description":"A buffering target represents a logical target of data placement, i.e.,","sidebar":"tutorialSidebar"},"hermes/components/data-placement":{"id":"hermes/components/data-placement","title":"Data Placement","description":"Every Hermes system instance includes one or more Hermes nodes.","sidebar":"tutorialSidebar"},"hermes/components/data-staging":{"id":"hermes/components/data-staging","title":"Data Staging","description":"Stage-in is the ability to load external datasets into Hermes.","sidebar":"tutorialSidebar"},"hermes/components/distributed-metadata":{"id":"hermes/components/distributed-metadata","title":"Distributed Metadata","description":"Metadata is stored in a distributed hash map. In each Hermes Daemon, we","sidebar":"tutorialSidebar"},"hermes/components/examples":{"id":"hermes/components/examples","title":"Examples","description":"Ares (IIT)","sidebar":"tutorialSidebar"},"hermes/components/prefetcher":{"id":"hermes/components/prefetcher","title":"Prefetcher","description":"The objective of the Prefetcher is to promote and demote content which is","sidebar":"tutorialSidebar"},"hermes/components/runtime":{"id":"hermes/components/runtime","title":"Runtime","description":"Hermes is built as a plugin to the Hermes Runtime, a distributed task processing framework","sidebar":"tutorialSidebar"},"hermes/components/tagging":{"id":"hermes/components/tagging","title":"Tagging","description":"Tags enable users to semantically define associations between blobs and provide","sidebar":"tutorialSidebar"},"hermes/components/topology":{"id":"hermes/components/topology","title":"Topology","description":"The TopologyManager is responsible for maintaining sets of Targets","sidebar":"tutorialSidebar"},"hermes/configuration":{"id":"hermes/configuration","title":"Configuration","description":"Before deploying an application, you need to configure Hermes. Hermes has two types of configurations: server configuration and client configuration. They","sidebar":"tutorialSidebar"},"hermes/debugging":{"id":"hermes/debugging","title":"Debugging","description":"Hermes can be complicated to debug due to its distributed and asynchronous","sidebar":"tutorialSidebar"},"hermes/deploying-hermes":{"id":"hermes/deploying-hermes","title":"deploying-hermes","description":"Configuring + Deploying Hermes","sidebar":"tutorialSidebar"},"hermes/doxygen":{"id":"hermes/doxygen","title":"Doxygen","description":"The Doxygen portion of the Hermes documentation can be built as follows:","sidebar":"tutorialSidebar"},"hermes/faq":{"id":"hermes/faq","title":"Frequently Asked Questions","description":"What is the minimum version for GCC?","sidebar":"tutorialSidebar"},"hermes/main-scenario":{"id":"hermes/main-scenario","title":"Main Scenario","description":"Hermes 1.1.0 is now available! [Download","sidebar":"tutorialSidebar"},"hermes/programming":{"id":"hermes/programming","title":"Programming","description":"In this section, we will discuss the general steps of building a program","sidebar":"tutorialSidebar"},"hermes/quick-start":{"id":"hermes/quick-start","title":"Quick Start Guide","description":"CAUTION: The image from DockerHub may throw Illegal Instruction for Spack-installed binaries.","sidebar":"tutorialSidebar"},"hpc-tutorials/cpp-introduction/hello-world":{"id":"hpc-tutorials/cpp-introduction/hello-world","title":"Hello World","description":"Choosing a Compiler","sidebar":"tutorialSidebar"},"hpc-tutorials/important-environment-variables/cmake-module-path":{"id":"hpc-tutorials/important-environment-variables/cmake-module-path","title":"CMAKE_MODULE_PATH","description":"CMAKEMODULEPATH is used by CMake to identify the location of CMake modules.","sidebar":"tutorialSidebar"},"hpc-tutorials/important-environment-variables/cmake-prefix-path":{"id":"hpc-tutorials/important-environment-variables/cmake-prefix-path","title":"CMAKE_PREFIX_PATH","description":"CMAKEPREFIXPATH is used by CMake to identify the location of CMake package configurations.","sidebar":"tutorialSidebar"},"hpc-tutorials/important-environment-variables/cpath":{"id":"hpc-tutorials/important-environment-variables/cpath","title":"CPATH","description":"GCC and Clang search each path in CPATH and sometimes INCLUDE_PATH for header files.","sidebar":"tutorialSidebar"},"hpc-tutorials/important-environment-variables/java-home":{"id":"hpc-tutorials/important-environment-variables/java-home","title":"JAVA_HOME","description":"JAVA_HOME is frequently used as the environment variable to specify the current java installation.","sidebar":"tutorialSidebar"},"hpc-tutorials/important-environment-variables/ld-library-path":{"id":"hpc-tutorials/important-environment-variables/ld-library-path","title":"LD_LIBRARY_PATH","description":"LDLIBRARYPATH is used by Linux to locate shared objects at runtime (as opposed to compile-time).","sidebar":"tutorialSidebar"},"hpc-tutorials/important-environment-variables/ld-preload":{"id":"hpc-tutorials/important-environment-variables/ld-preload","title":"LD_PRELOAD","description":"LD_PRELOAD is used by Linux to intercept functions in a program and replace their","sidebar":"tutorialSidebar"},"hpc-tutorials/important-environment-variables/library-path":{"id":"hpc-tutorials/important-environment-variables/library-path","title":"LIBRARY_PATH","description":"GCC and Clang search each path in LIBRARY_PATH for shared objects and archives.","sidebar":"tutorialSidebar"},"hpc-tutorials/important-environment-variables/path":{"id":"hpc-tutorials/important-environment-variables/path","title":"PATH","description":"The PATH variable is used to locate executable objects. For example:","sidebar":"tutorialSidebar"},"hpc-tutorials/important-environment-variables/pythonpath":{"id":"hpc-tutorials/important-environment-variables/pythonpath","title":"PYTHONPATH","description":"Python uses PYTHONPATH to specify directories where Python modules may be located.","sidebar":"tutorialSidebar"},"hpc-tutorials/installing-hpc-software/building-from-scratch":{"id":"hpc-tutorials/installing-hpc-software/building-from-scratch","title":"Building From Scratch","description":"When spack fails, there aren\'t many options but to build the code from scratch. This is typically an arduous,","sidebar":"tutorialSidebar"},"hpc-tutorials/installing-hpc-software/building-with-spack":{"id":"hpc-tutorials/installing-hpc-software/building-with-spack","title":"Building With Spack","description":"Spack is a system for installing packages for HPC centers. Spack","sidebar":"tutorialSidebar"},"hpc-tutorials/linux-introduction/choosing-an-os":{"id":"hpc-tutorials/linux-introduction/choosing-an-os","title":"Choosing an OS","description":"Which distro?","sidebar":"tutorialSidebar"},"hpc-tutorials/linux-introduction/ssh":{"id":"hpc-tutorials/linux-introduction/ssh","title":"SSH","description":"SSH is a secure way of connecting to a remote machine. SSH relies on public-private key cryptography to secure","sidebar":"tutorialSidebar"},"hpc-tutorials/linux-introduction/using-a-terminal":{"id":"hpc-tutorials/linux-introduction/using-a-terminal","title":"Basics of using a Terminal","description":"In this section, we will use Ubuntu 22.04 as our Linux distro. First, we will discuss the basic aspects of using a Linux terminal.","sidebar":"tutorialSidebar"},"index":{"id":"index","title":"Welcome","description":"Welcome to the Gnosis Research Center Knowledge Base, your source for insightful information on a diverse range of topics.","sidebar":"tutorialSidebar"},"jarvis/jarvis-cd/building-package":{"id":"jarvis/jarvis-cd/building-package","title":"Building a Package","description":"This guide documents how to extend the set of applications that Jarvis is","sidebar":"tutorialSidebar"},"jarvis/jarvis-cd/custom-repos":{"id":"jarvis/jarvis-cd/custom-repos","title":"Custom Repos","description":"There are cases where your organization may have packages used internally and","sidebar":"tutorialSidebar"},"jarvis/jarvis-cd/design-motivation":{"id":"jarvis/jarvis-cd/design-motivation","title":"Design & Motivation","description":"First we will describe how jarvis-cd is organized and the files that it creates.","sidebar":"tutorialSidebar"},"jarvis/jarvis-cd/future-work":{"id":"jarvis/jarvis-cd/future-work","title":"Future Work","description":"1. What if we aren\'t using SSH?","sidebar":"tutorialSidebar"},"jarvis/jarvis-cd/getting-started":{"id":"jarvis/jarvis-cd/getting-started","title":"Getting Standard","description":"In this section, we will discuss the jarvis command line interface.","sidebar":"tutorialSidebar"},"jarvis/jarvis-cd/index":{"id":"jarvis/jarvis-cd/index","title":"Introduction","description":"jarvis-cd is a unified platform for deploying various applications, including","sidebar":"tutorialSidebar"},"jarvis/jarvis-cd/packages/cm1":{"id":"jarvis/jarvis-cd/packages/cm1","title":"CM1","description":"Dependencies","sidebar":"tutorialSidebar"},"jarvis/jarvis-cd/packages/deepdrivemd":{"id":"jarvis/jarvis-cd/packages/deepdrivemd","title":"DeepDriveMD","description":"Dependencies","sidebar":"tutorialSidebar"},"jarvis/jarvis-cd/packages/gadget2":{"id":"jarvis/jarvis-cd/packages/gadget2","title":"Gadget2","description":"GADGET is a freely available code for cosmological N-body/SPH simulations on massively parallel computers with distributed memory. GADGET uses an explicit communication model that is implemented with the standardized MPI communication interface. The code can be run on essentially all supercomputer systems presently in use, including clusters of workstations or individual PCs.","sidebar":"tutorialSidebar"},"jarvis/jarvis-cd/packages/gadget4":{"id":"jarvis/jarvis-cd/packages/gadget4","title":"Gadget","description":"GADGET-4 is a massively parallel code for N-body/hydrodynamical cosmological","sidebar":"tutorialSidebar"},"jarvis/jarvis-cd/packages/nyx":{"id":"jarvis/jarvis-cd/packages/nyx","title":"Nyx","description":"https://amrex-astro.github.io/Nyx/","sidebar":"tutorialSidebar"},"jarvis/jarvis-cd/packages/vpic":{"id":"jarvis/jarvis-cd/packages/vpic","title":"VPIC","description":"Installation","sidebar":"tutorialSidebar"},"jarvis/jarvis-cd/packages/vpic-kokkos":{"id":"jarvis/jarvis-cd/packages/vpic-kokkos","title":"VPIC Kokkos","description":"Installation","sidebar":"tutorialSidebar"},"jarvis/jarvis-cd/packages/wrf":{"id":"jarvis/jarvis-cd/packages/wrf","title":"WRF","description":"Installation","sidebar":"tutorialSidebar"},"jarvis/jarvis-cd/python-api":{"id":"jarvis/jarvis-cd/python-api","title":"Python API","description":"This guide documents how to use Jarvis within a Python script. To this point,","sidebar":"tutorialSidebar"},"jarvis/jarvis-cd/resource-graph":{"id":"jarvis/jarvis-cd/resource-graph","title":"Resource Graph","description":"A resource graph contains a snapshot of the state of a cluster. This","sidebar":"tutorialSidebar"},"jarvis/jarvis-cd/schedulers":{"id":"jarvis/jarvis-cd/schedulers","title":"Schedulers","description":"Jarvis-CD provides native support for two popular job scheduling systems: SLURM and PBS. This documentation aims to guide users on how to utilize both schedulers through Jarvis-CD.","sidebar":"tutorialSidebar"},"jarvis/jarvis-cd/virtualization":{"id":"jarvis/jarvis-cd/virtualization","title":"Virtualization","description":"A future work could include deploying VMs and containers of storage systems.","sidebar":"tutorialSidebar"},"jarvis/jarvis-util/argument-parsing":{"id":"jarvis/jarvis-util/argument-parsing","title":"Argument Parsing","description":"We provide a custom argument parsing implementation. The main difference between","sidebar":"tutorialSidebar"},"jarvis/jarvis-util/builtin-wrappers":{"id":"jarvis/jarvis-util/builtin-wrappers","title":"Built-in Wrappers","description":"We have various wrappers to support much shell functionality. At this time, these have been built and tested for Linux. These codes inherit from the Exec class shown in Section 1. This way, they can be executed locally or in parallel.","sidebar":"tutorialSidebar"},"jarvis/jarvis-util/hostfile":{"id":"jarvis/jarvis-util/hostfile","title":"Hostfile","description":"Hostfiles contain a set of machines.","sidebar":"tutorialSidebar"},"jarvis/jarvis-util/index":{"id":"jarvis/jarvis-util/index","title":"Introduction","description":"jarvis-util contains various helpers which are useful for executing programs external to python within Python. We provide various wrappers to support parallel execution (MPI, PSSH), remote execution (SSH), and local execution (exec/fork). We also provide functions which wrap around various helpful commands, such as filesystem commands (ls, rm, pkill, mkdir).","sidebar":"tutorialSidebar"},"jarvis/jarvis-util/program-execution":{"id":"jarvis/jarvis-util/program-execution","title":"Program Execution","description":"Exec is used to execute a binary program as a subprocess in Python. Exec can be used for local, remote, or parallel execution of code. Exec is currently a wrapper around the following libraries:","sidebar":"tutorialSidebar"}}}')}}]);
\ No newline at end of file
+"use strict";(self.webpackChunkgrc=self.webpackChunkgrc||[]).push([[53],{1109:e=>{e.exports=JSON.parse('{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"tutorialSidebar":[{"type":"link","label":"Welcome","href":"/docs/index","docId":"index","unlisted":false},{"type":"category","label":"HPC Tutorials","collapsible":true,"collapsed":true,"items":[{"type":"category","label":"Linux Introduction","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Choosing an OS","href":"/docs/hpc-tutorials/linux-introduction/choosing-an-os","docId":"hpc-tutorials/linux-introduction/choosing-an-os","unlisted":false},{"type":"link","label":"Basics of using a Terminal","href":"/docs/hpc-tutorials/linux-introduction/using-a-terminal","docId":"hpc-tutorials/linux-introduction/using-a-terminal","unlisted":false},{"type":"link","label":"SSH","href":"/docs/hpc-tutorials/linux-introduction/ssh","docId":"hpc-tutorials/linux-introduction/ssh","unlisted":false}],"href":"/docs/category/linux-introduction"},{"type":"category","label":"Installing HPC Software","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Building With Spack","href":"/docs/hpc-tutorials/installing-hpc-software/building-with-spack","docId":"hpc-tutorials/installing-hpc-software/building-with-spack","unlisted":false},{"type":"link","label":"Building From Scratch","href":"/docs/hpc-tutorials/installing-hpc-software/building-from-scratch","docId":"hpc-tutorials/installing-hpc-software/building-from-scratch","unlisted":false}],"href":"/docs/category/installing-hpc-software"},{"type":"category","label":"Important Environment Variables","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"CMAKE_MODULE_PATH","href":"/docs/hpc-tutorials/important-environment-variables/cmake-module-path","docId":"hpc-tutorials/important-environment-variables/cmake-module-path","unlisted":false},{"type":"link","label":"CMAKE_PREFIX_PATH","href":"/docs/hpc-tutorials/important-environment-variables/cmake-prefix-path","docId":"hpc-tutorials/important-environment-variables/cmake-prefix-path","unlisted":false},{"type":"link","label":"CPATH","href":"/docs/hpc-tutorials/important-environment-variables/cpath","docId":"hpc-tutorials/important-environment-variables/cpath","unlisted":false},{"type":"link","label":"JAVA_HOME","href":"/docs/hpc-tutorials/important-environment-variables/java-home","docId":"hpc-tutorials/important-environment-variables/java-home","unlisted":false},{"type":"link","label":"LD_LIBRARY_PATH","href":"/docs/hpc-tutorials/important-environment-variables/ld-library-path","docId":"hpc-tutorials/important-environment-variables/ld-library-path","unlisted":false},{"type":"link","label":"LD_PRELOAD","href":"/docs/hpc-tutorials/important-environment-variables/ld-preload","docId":"hpc-tutorials/important-environment-variables/ld-preload","unlisted":false},{"type":"link","label":"LIBRARY_PATH","href":"/docs/hpc-tutorials/important-environment-variables/library-path","docId":"hpc-tutorials/important-environment-variables/library-path","unlisted":false},{"type":"link","label":"PATH","href":"/docs/hpc-tutorials/important-environment-variables/path","docId":"hpc-tutorials/important-environment-variables/path","unlisted":false},{"type":"link","label":"PYTHONPATH","href":"/docs/hpc-tutorials/important-environment-variables/pythonpath","docId":"hpc-tutorials/important-environment-variables/pythonpath","unlisted":false}],"href":"/docs/category/important-environment-variables"},{"type":"category","label":"C++ Introduction","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Hello World","href":"/docs/hpc-tutorials/cpp-introduction/hello-world","docId":"hpc-tutorials/cpp-introduction/hello-world","unlisted":false}],"href":"/docs/category/c-introduction"}]},{"type":"category","label":"Hermes","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Main Scenario","href":"/docs/hermes/main-scenario","docId":"hermes/main-scenario","unlisted":false},{"type":"link","label":"Building Hermes","href":"/docs/hermes/building-hermes","docId":"hermes/building-hermes","unlisted":false},{"type":"link","label":"Deploying Hermes","href":"/docs/hermes/deploying-hermes","docId":"hermes/deploying-hermes","unlisted":false},{"type":"link","label":"Configuration","href":"/docs/hermes/configuration","docId":"hermes/configuration","unlisted":false},{"type":"category","label":"Components","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Buffer Organizer","href":"/docs/hermes/components/buffer-organizer","docId":"hermes/components/buffer-organizer","unlisted":false},{"type":"link","label":"Buffer Pool","href":"/docs/hermes/components/buffer-pool","docId":"hermes/components/buffer-pool","unlisted":false},{"type":"link","label":"Buffering Target","href":"/docs/hermes/components/buffering-target","docId":"hermes/components/buffering-target","unlisted":false},{"type":"link","label":"Data Placement","href":"/docs/hermes/components/data-placement","docId":"hermes/components/data-placement","unlisted":false},{"type":"link","label":"Data Staging","href":"/docs/hermes/components/data-staging","docId":"hermes/components/data-staging","unlisted":false},{"type":"link","label":"Runtime","href":"/docs/hermes/components/runtime","docId":"hermes/components/runtime","unlisted":false},{"type":"link","label":"Distributed Metadata","href":"/docs/hermes/components/distributed-metadata","docId":"hermes/components/distributed-metadata","unlisted":false},{"type":"link","label":"Prefetcher","href":"/docs/hermes/components/prefetcher","docId":"hermes/components/prefetcher","unlisted":false},{"type":"link","label":"Examples","href":"/docs/hermes/components/examples","docId":"hermes/components/examples","unlisted":false},{"type":"link","label":"Tagging","href":"/docs/hermes/components/tagging","docId":"hermes/components/tagging","unlisted":false},{"type":"link","label":"Topology","href":"/docs/hermes/components/topology","docId":"hermes/components/topology","unlisted":false}]},{"type":"link","label":"Programming","href":"/docs/hermes/programming","docId":"hermes/programming","unlisted":false},{"type":"link","label":"Adapters","href":"/docs/hermes/adapters","docId":"hermes/adapters","unlisted":false},{"type":"link","label":"Quick Start Guide","href":"/docs/hermes/quick-start","docId":"hermes/quick-start","unlisted":false},{"type":"link","label":"Debugging","href":"/docs/hermes/debugging","docId":"hermes/debugging","unlisted":false},{"type":"link","label":"Doxygen","href":"/docs/hermes/doxygen","docId":"hermes/doxygen","unlisted":false},{"type":"link","label":"Frequently Asked Questions","href":"/docs/hermes/faq","docId":"hermes/faq","unlisted":false}],"href":"/docs/category/hermes"},{"type":"category","label":"ChronoLog","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Introduction","href":"/docs/chronolog/index","docId":"chronolog/index","unlisted":false}]},{"type":"category","label":"Jarvis","collapsible":true,"collapsed":true,"items":[{"type":"category","label":"jarvis-util","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Introduction","href":"/docs/jarvis/jarvis-util/index","docId":"jarvis/jarvis-util/index","unlisted":false},{"type":"link","label":"Program Execution","href":"/docs/jarvis/jarvis-util/program-execution","docId":"jarvis/jarvis-util/program-execution","unlisted":false},{"type":"link","label":"Built-in Wrappers","href":"/docs/jarvis/jarvis-util/builtin-wrappers","docId":"jarvis/jarvis-util/builtin-wrappers","unlisted":false},{"type":"link","label":"Argument Parsing","href":"/docs/jarvis/jarvis-util/argument-parsing","docId":"jarvis/jarvis-util/argument-parsing","unlisted":false},{"type":"link","label":"Hostfile","href":"/docs/jarvis/jarvis-util/hostfile","docId":"jarvis/jarvis-util/hostfile","unlisted":false}]},{"type":"category","label":"jarvis-cd","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Introduction","href":"/docs/jarvis/jarvis-cd/index","docId":"jarvis/jarvis-cd/index","unlisted":false},{"type":"link","label":"Getting Standard","href":"/docs/jarvis/jarvis-cd/getting-started","docId":"jarvis/jarvis-cd/getting-started","unlisted":false},{"type":"link","label":"Resource Graph","href":"/docs/jarvis/jarvis-cd/resource-graph","docId":"jarvis/jarvis-cd/resource-graph","unlisted":false},{"type":"link","label":"Design & Motivation","href":"/docs/jarvis/jarvis-cd/design-motivation","docId":"jarvis/jarvis-cd/design-motivation","unlisted":false},{"type":"link","label":"Custom Repos","href":"/docs/jarvis/jarvis-cd/custom-repos","docId":"jarvis/jarvis-cd/custom-repos","unlisted":false},{"type":"link","label":"Building a Package","href":"/docs/jarvis/jarvis-cd/building-package","docId":"jarvis/jarvis-cd/building-package","unlisted":false},{"type":"link","label":"Python API","href":"/docs/jarvis/jarvis-cd/python-api","docId":"jarvis/jarvis-cd/python-api","unlisted":false},{"type":"category","label":"Packages","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"CM1","href":"/docs/jarvis/jarvis-cd/packages/cm1","docId":"jarvis/jarvis-cd/packages/cm1","unlisted":false},{"type":"link","label":"DeepDriveMD","href":"/docs/jarvis/jarvis-cd/packages/deepdrivemd","docId":"jarvis/jarvis-cd/packages/deepdrivemd","unlisted":false},{"type":"link","label":"Gadget2","href":"/docs/jarvis/jarvis-cd/packages/gadget2","docId":"jarvis/jarvis-cd/packages/gadget2","unlisted":false},{"type":"link","label":"Gadget","href":"/docs/jarvis/jarvis-cd/packages/gadget4","docId":"jarvis/jarvis-cd/packages/gadget4","unlisted":false},{"type":"link","label":"Nyx","href":"/docs/jarvis/jarvis-cd/packages/nyx","docId":"jarvis/jarvis-cd/packages/nyx","unlisted":false},{"type":"link","label":"VPIC Kokkos","href":"/docs/jarvis/jarvis-cd/packages/vpic-kokkos","docId":"jarvis/jarvis-cd/packages/vpic-kokkos","unlisted":false},{"type":"link","label":"VPIC","href":"/docs/jarvis/jarvis-cd/packages/vpic","docId":"jarvis/jarvis-cd/packages/vpic","unlisted":false},{"type":"link","label":"WRF","href":"/docs/jarvis/jarvis-cd/packages/wrf","docId":"jarvis/jarvis-cd/packages/wrf","unlisted":false}]},{"type":"link","label":"Schedulers","href":"/docs/jarvis/jarvis-cd/schedulers","docId":"jarvis/jarvis-cd/schedulers","unlisted":false},{"type":"link","label":"Virtualization","href":"/docs/jarvis/jarvis-cd/virtualization","docId":"jarvis/jarvis-cd/virtualization","unlisted":false},{"type":"link","label":"Future Work","href":"/docs/jarvis/jarvis-cd/future-work","docId":"jarvis/jarvis-cd/future-work","unlisted":false}]}]}]},"docs":{"chronolog/index":{"id":"chronolog/index","title":"Introduction","description":"Synopsis","sidebar":"tutorialSidebar"},"hermes/adapters":{"id":"hermes/adapters","title":"Adapters","description":"Hermes Ecosystem","sidebar":"tutorialSidebar"},"hermes/building-hermes":{"id":"hermes/building-hermes","title":"Building Hermes","description":"Dependencies","sidebar":"tutorialSidebar"},"hermes/components/buffer-organizer":{"id":"hermes/components/buffer-organizer","title":"Buffer Organizer","description":"The Buffer Organizer is the \\"corrector\\" half of our","sidebar":"tutorialSidebar"},"hermes/components/buffer-pool":{"id":"hermes/components/buffer-pool","title":"Buffer Pool","description":"The main idea behind the Buffer Pool is to avoid the runtime","sidebar":"tutorialSidebar"},"hermes/components/buffering-target":{"id":"hermes/components/buffering-target","title":"Buffering Target","description":"A buffering target represents a logical target of data placement, i.e.,","sidebar":"tutorialSidebar"},"hermes/components/data-placement":{"id":"hermes/components/data-placement","title":"Data Placement","description":"Every Hermes system instance includes one or more Hermes nodes.","sidebar":"tutorialSidebar"},"hermes/components/data-staging":{"id":"hermes/components/data-staging","title":"Data Staging","description":"Stage-in is the ability to load external datasets into Hermes.","sidebar":"tutorialSidebar"},"hermes/components/distributed-metadata":{"id":"hermes/components/distributed-metadata","title":"Distributed Metadata","description":"Metadata is stored in a distributed hash map. In each Hermes Daemon, we","sidebar":"tutorialSidebar"},"hermes/components/examples":{"id":"hermes/components/examples","title":"Examples","description":"Ares (IIT)","sidebar":"tutorialSidebar"},"hermes/components/prefetcher":{"id":"hermes/components/prefetcher","title":"Prefetcher","description":"The objective of the Prefetcher is to promote and demote content which is","sidebar":"tutorialSidebar"},"hermes/components/runtime":{"id":"hermes/components/runtime","title":"Runtime","description":"Hermes is built as a plugin to the Hermes Runtime, a distributed task processing framework","sidebar":"tutorialSidebar"},"hermes/components/tagging":{"id":"hermes/components/tagging","title":"Tagging","description":"Tags enable users to semantically define associations between blobs and provide","sidebar":"tutorialSidebar"},"hermes/components/topology":{"id":"hermes/components/topology","title":"Topology","description":"The TopologyManager is responsible for maintaining sets of Targets","sidebar":"tutorialSidebar"},"hermes/configuration":{"id":"hermes/configuration","title":"Configuration","description":"Before deploying an application, you need to configure Hermes. Hermes has two types of configurations: server configuration and client configuration. They","sidebar":"tutorialSidebar"},"hermes/debugging":{"id":"hermes/debugging","title":"Debugging","description":"Hermes can be complicated to debug due to its distributed and asynchronous","sidebar":"tutorialSidebar"},"hermes/deploying-hermes":{"id":"hermes/deploying-hermes","title":"Deploying Hermes","description":"Configuring + Deploying Hermes","sidebar":"tutorialSidebar"},"hermes/doxygen":{"id":"hermes/doxygen","title":"Doxygen","description":"The Doxygen portion of the Hermes documentation can be built as follows:","sidebar":"tutorialSidebar"},"hermes/faq":{"id":"hermes/faq","title":"Frequently Asked Questions","description":"What is the minimum version for GCC?","sidebar":"tutorialSidebar"},"hermes/main-scenario":{"id":"hermes/main-scenario","title":"Main Scenario","description":"Hermes 1.1.0 is now available! [Download","sidebar":"tutorialSidebar"},"hermes/programming":{"id":"hermes/programming","title":"Programming","description":"In this section, we will discuss the general steps of building a program","sidebar":"tutorialSidebar"},"hermes/quick-start":{"id":"hermes/quick-start","title":"Quick Start Guide","description":"CAUTION: The image from DockerHub may throw Illegal Instruction for Spack-installed binaries.","sidebar":"tutorialSidebar"},"hpc-tutorials/cpp-introduction/hello-world":{"id":"hpc-tutorials/cpp-introduction/hello-world","title":"Hello World","description":"Choosing a Compiler","sidebar":"tutorialSidebar"},"hpc-tutorials/important-environment-variables/cmake-module-path":{"id":"hpc-tutorials/important-environment-variables/cmake-module-path","title":"CMAKE_MODULE_PATH","description":"CMAKEMODULEPATH is used by CMake to identify the location of CMake modules.","sidebar":"tutorialSidebar"},"hpc-tutorials/important-environment-variables/cmake-prefix-path":{"id":"hpc-tutorials/important-environment-variables/cmake-prefix-path","title":"CMAKE_PREFIX_PATH","description":"CMAKEPREFIXPATH is used by CMake to identify the location of CMake package configurations.","sidebar":"tutorialSidebar"},"hpc-tutorials/important-environment-variables/cpath":{"id":"hpc-tutorials/important-environment-variables/cpath","title":"CPATH","description":"GCC and Clang search each path in CPATH and sometimes INCLUDE_PATH for header files.","sidebar":"tutorialSidebar"},"hpc-tutorials/important-environment-variables/java-home":{"id":"hpc-tutorials/important-environment-variables/java-home","title":"JAVA_HOME","description":"JAVA_HOME is frequently used as the environment variable to specify the current java installation.","sidebar":"tutorialSidebar"},"hpc-tutorials/important-environment-variables/ld-library-path":{"id":"hpc-tutorials/important-environment-variables/ld-library-path","title":"LD_LIBRARY_PATH","description":"LDLIBRARYPATH is used by Linux to locate shared objects at runtime (as opposed to compile-time).","sidebar":"tutorialSidebar"},"hpc-tutorials/important-environment-variables/ld-preload":{"id":"hpc-tutorials/important-environment-variables/ld-preload","title":"LD_PRELOAD","description":"LD_PRELOAD is used by Linux to intercept functions in a program and replace their","sidebar":"tutorialSidebar"},"hpc-tutorials/important-environment-variables/library-path":{"id":"hpc-tutorials/important-environment-variables/library-path","title":"LIBRARY_PATH","description":"GCC and Clang search each path in LIBRARY_PATH for shared objects and archives.","sidebar":"tutorialSidebar"},"hpc-tutorials/important-environment-variables/path":{"id":"hpc-tutorials/important-environment-variables/path","title":"PATH","description":"The PATH variable is used to locate executable objects. For example:","sidebar":"tutorialSidebar"},"hpc-tutorials/important-environment-variables/pythonpath":{"id":"hpc-tutorials/important-environment-variables/pythonpath","title":"PYTHONPATH","description":"Python uses PYTHONPATH to specify directories where Python modules may be located.","sidebar":"tutorialSidebar"},"hpc-tutorials/installing-hpc-software/building-from-scratch":{"id":"hpc-tutorials/installing-hpc-software/building-from-scratch","title":"Building From Scratch","description":"When spack fails, there aren\'t many options but to build the code from scratch. This is typically an arduous,","sidebar":"tutorialSidebar"},"hpc-tutorials/installing-hpc-software/building-with-spack":{"id":"hpc-tutorials/installing-hpc-software/building-with-spack","title":"Building With Spack","description":"Spack is a system for installing packages for HPC centers. Spack","sidebar":"tutorialSidebar"},"hpc-tutorials/linux-introduction/choosing-an-os":{"id":"hpc-tutorials/linux-introduction/choosing-an-os","title":"Choosing an OS","description":"Which distro?","sidebar":"tutorialSidebar"},"hpc-tutorials/linux-introduction/ssh":{"id":"hpc-tutorials/linux-introduction/ssh","title":"SSH","description":"SSH is a secure way of connecting to a remote machine. SSH relies on public-private key cryptography to secure","sidebar":"tutorialSidebar"},"hpc-tutorials/linux-introduction/using-a-terminal":{"id":"hpc-tutorials/linux-introduction/using-a-terminal","title":"Basics of using a Terminal","description":"In this section, we will use Ubuntu 22.04 as our Linux distro. First, we will discuss the basic aspects of using a Linux terminal.","sidebar":"tutorialSidebar"},"index":{"id":"index","title":"Welcome","description":"Welcome to the Gnosis Research Center Knowledge Base, your source for insightful information on a diverse range of topics.","sidebar":"tutorialSidebar"},"jarvis/jarvis-cd/building-package":{"id":"jarvis/jarvis-cd/building-package","title":"Building a Package","description":"This guide documents how to extend the set of applications that Jarvis is","sidebar":"tutorialSidebar"},"jarvis/jarvis-cd/custom-repos":{"id":"jarvis/jarvis-cd/custom-repos","title":"Custom Repos","description":"There are cases where your organization may have packages used internally and","sidebar":"tutorialSidebar"},"jarvis/jarvis-cd/design-motivation":{"id":"jarvis/jarvis-cd/design-motivation","title":"Design & Motivation","description":"First we will describe how jarvis-cd is organized and the files that it creates.","sidebar":"tutorialSidebar"},"jarvis/jarvis-cd/future-work":{"id":"jarvis/jarvis-cd/future-work","title":"Future Work","description":"1. What if we aren\'t using SSH?","sidebar":"tutorialSidebar"},"jarvis/jarvis-cd/getting-started":{"id":"jarvis/jarvis-cd/getting-started","title":"Getting Standard","description":"In this section, we will discuss the jarvis command line interface.","sidebar":"tutorialSidebar"},"jarvis/jarvis-cd/index":{"id":"jarvis/jarvis-cd/index","title":"Introduction","description":"jarvis-cd is a unified platform for deploying various applications, including","sidebar":"tutorialSidebar"},"jarvis/jarvis-cd/packages/cm1":{"id":"jarvis/jarvis-cd/packages/cm1","title":"CM1","description":"Dependencies","sidebar":"tutorialSidebar"},"jarvis/jarvis-cd/packages/deepdrivemd":{"id":"jarvis/jarvis-cd/packages/deepdrivemd","title":"DeepDriveMD","description":"Dependencies","sidebar":"tutorialSidebar"},"jarvis/jarvis-cd/packages/gadget2":{"id":"jarvis/jarvis-cd/packages/gadget2","title":"Gadget2","description":"GADGET is a freely available code for cosmological N-body/SPH simulations on massively parallel computers with distributed memory. GADGET uses an explicit communication model that is implemented with the standardized MPI communication interface. The code can be run on essentially all supercomputer systems presently in use, including clusters of workstations or individual PCs.","sidebar":"tutorialSidebar"},"jarvis/jarvis-cd/packages/gadget4":{"id":"jarvis/jarvis-cd/packages/gadget4","title":"Gadget","description":"GADGET-4 is a massively parallel code for N-body/hydrodynamical cosmological","sidebar":"tutorialSidebar"},"jarvis/jarvis-cd/packages/nyx":{"id":"jarvis/jarvis-cd/packages/nyx","title":"Nyx","description":"https://amrex-astro.github.io/Nyx/","sidebar":"tutorialSidebar"},"jarvis/jarvis-cd/packages/vpic":{"id":"jarvis/jarvis-cd/packages/vpic","title":"VPIC","description":"Installation","sidebar":"tutorialSidebar"},"jarvis/jarvis-cd/packages/vpic-kokkos":{"id":"jarvis/jarvis-cd/packages/vpic-kokkos","title":"VPIC Kokkos","description":"Installation","sidebar":"tutorialSidebar"},"jarvis/jarvis-cd/packages/wrf":{"id":"jarvis/jarvis-cd/packages/wrf","title":"WRF","description":"Installation","sidebar":"tutorialSidebar"},"jarvis/jarvis-cd/python-api":{"id":"jarvis/jarvis-cd/python-api","title":"Python API","description":"This guide documents how to use Jarvis within a Python script. To this point,","sidebar":"tutorialSidebar"},"jarvis/jarvis-cd/resource-graph":{"id":"jarvis/jarvis-cd/resource-graph","title":"Resource Graph","description":"A resource graph contains a snapshot of the state of a cluster. This","sidebar":"tutorialSidebar"},"jarvis/jarvis-cd/schedulers":{"id":"jarvis/jarvis-cd/schedulers","title":"Schedulers","description":"Jarvis-CD provides native support for two popular job scheduling systems: SLURM and PBS. This documentation aims to guide users on how to utilize both schedulers through Jarvis-CD.","sidebar":"tutorialSidebar"},"jarvis/jarvis-cd/virtualization":{"id":"jarvis/jarvis-cd/virtualization","title":"Virtualization","description":"A future work could include deploying VMs and containers of storage systems.","sidebar":"tutorialSidebar"},"jarvis/jarvis-util/argument-parsing":{"id":"jarvis/jarvis-util/argument-parsing","title":"Argument Parsing","description":"We provide a custom argument parsing implementation. The main difference between","sidebar":"tutorialSidebar"},"jarvis/jarvis-util/builtin-wrappers":{"id":"jarvis/jarvis-util/builtin-wrappers","title":"Built-in Wrappers","description":"We have various wrappers to support much shell functionality. At this time, these have been built and tested for Linux. These codes inherit from the Exec class shown in Section 1. This way, they can be executed locally or in parallel.","sidebar":"tutorialSidebar"},"jarvis/jarvis-util/hostfile":{"id":"jarvis/jarvis-util/hostfile","title":"Hostfile","description":"Hostfiles contain a set of machines.","sidebar":"tutorialSidebar"},"jarvis/jarvis-util/index":{"id":"jarvis/jarvis-util/index","title":"Introduction","description":"jarvis-util contains various helpers which are useful for executing programs external to python within Python. We provide various wrappers to support parallel execution (MPI, PSSH), remote execution (SSH), and local execution (exec/fork). We also provide functions which wrap around various helpful commands, such as filesystem commands (ls, rm, pkill, mkdir).","sidebar":"tutorialSidebar"},"jarvis/jarvis-util/program-execution":{"id":"jarvis/jarvis-util/program-execution","title":"Program Execution","description":"Exec is used to execute a binary program as a subprocess in Python. Exec can be used for local, remote, or parallel execution of code. Exec is currently a wrapper around the following libraries:","sidebar":"tutorialSidebar"}}}')}}]);
\ No newline at end of file
diff --git a/assets/js/runtime~main.23da7b65.js b/assets/js/runtime~main.d3d63862.js
similarity index 69%
rename from assets/js/runtime~main.23da7b65.js
rename to assets/js/runtime~main.d3d63862.js
index bb6d249f..617a07b7 100644
--- a/assets/js/runtime~main.23da7b65.js
+++ b/assets/js/runtime~main.d3d63862.js
@@ -1 +1 @@
-(()=>{"use strict";var e,a,f,d,c,b={},t={};function r(e){var a=t[e];if(void 0!==a)return a.exports;var f=t[e]={id:e,loaded:!1,exports:{}};return b[e].call(f.exports,f,f.exports,r),f.loaded=!0,f.exports}r.m=b,r.c=t,e=[],r.O=(a,f,d,c)=>{if(!f){var b=1/0;for(i=0;i=c)&&Object.keys(r.O).every((e=>r.O[e](f[o])))?f.splice(o--,1):(t=!1,c0&&e[i-1][2]>c;i--)e[i]=e[i-1];e[i]=[f,d,c]},r.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return r.d(a,{a:a}),a},f=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,r.t=function(e,d){if(1&d&&(e=this(e)),8&d)return e;if("object"==typeof e&&e){if(4&d&&e.__esModule)return e;if(16&d&&"function"==typeof e.then)return e}var c=Object.create(null);r.r(c);var b={};a=a||[null,f({}),f([]),f(f)];for(var t=2&d&&e;"object"==typeof t&&!~a.indexOf(t);t=f(t))Object.getOwnPropertyNames(t).forEach((a=>b[a]=()=>e[a]));return b.default=()=>e,r.d(c,b),c},r.d=(e,a)=>{for(var f in a)r.o(a,f)&&!r.o(e,f)&&Object.defineProperty(e,f,{enumerable:!0,get:a[f]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce(((a,f)=>(r.f[f](e,a),a)),[])),r.u=e=>"assets/js/"+({53:"935f2afb",110:"66406991",252:"efcf2c8f",392:"b4232381",438:"effe9d22",453:"30a24c52",463:"18faaec4",527:"82cb9cb5",533:"b2b675dd",571:"904b44e2",893:"e5ceba65",948:"8717b14a",989:"3d700513",1177:"90873c47",1206:"697644c6",1249:"f5d46ffa",1477:"b2f554cd",1587:"ca37dda7",1620:"dda71f51",1633:"031793e1",1713:"a7023ddc",1815:"760a40a8",1849:"85755f43",1914:"d9f32620",1930:"79264c0c",1941:"d09c4fac",1982:"f55ff2a3",2114:"04559415",2225:"f5471bd6",2267:"59362658",2358:"e5f3d8ab",2362:"e273c56f",2497:"cb5a49d7",2535:"814f3328",2667:"747bc699",2777:"2638f36e",2957:"ab3a61e2",3085:"1f391b9e",3089:"a6aa9e1f",3205:"a80da1cf",3237:"1df93b7f",3394:"e14f0011",3514:"73664a40",3608:"9e4087bc",3708:"42fffeac",3837:"e5318f16",3839:"585f8265",4013:"01a85c17",4174:"134475a2",4249:"d81ffd3b",4308:"9f486ed0",4368:"a94703ab",4407:"7456221d",4413:"5b959513",4420:"049fe023",4503:"81dd3036",4530:"308d6444",4561:"57dcc027",4792:"24969e49",4956:"da1774b2",5e3:"eb563962",5105:"a5e346b8",5243:"d5c0da25",5378:"1b2dbbfc",5429:"b27c6475",5592:"3d9099ed",5674:"57efaafb",5857:"139e27b9",5945:"9bae1a86",6057:"3a4e307e",6086:"a14faa7b",6103:"ccc49370",6212:"ce0cce8a",6238:"6850c2d9",6466:"2f84c851",6687:"2bb297c4",6938:"608ae6a4",6939:"3d5be58c",7070:"96ff4131",7108:"02f92169",7178:"096bfee4",7250:"6af205be",7429:"189c5f94",7652:"49403d74",7666:"1de959af",7804:"efb990fe",7900:"06443b75",7918:"17896441",8187:"5c7d11d5",8221:"116b5cec",8257:"28636868",8344:"0b00b8d6",8518:"a7bd4aaa",8530:"2ede842c",8610:"6875c492",8626:"47e5ec9f",8636:"f4f34a3a",8847:"14512658",8858:"657a43b2",8893:"14268422",8912:"04c65fe0",8935:"bb9046c3",9003:"925b3f96",9035:"4c9e35b1",9076:"102bb9d9",9110:"2eca2ed0",9231:"dccb6fa9",9254:"9d78ffa8",9342:"3117b6fa",9423:"be839f51",9464:"8db11540",9636:"e3c2043f",9638:"71933e4b",9642:"7661071f",9661:"5e95c892",9700:"e16015ca",9817:"14eb3368",9856:"d1dd20e5",9864:"a139a58c",9893:"37d17434",9895:"c9f32de9",9975:"f2dd65ba"}[e]||e)+"."+{53:"cdd2fb36",110:"712025f7",252:"6e71bb54",392:"f7dfe205",438:"a18e3f43",453:"cadf939d",463:"95c09cdc",527:"c8189fcd",533:"9871a89a",571:"14ac8ffd",893:"241d6788",948:"07ce093c",989:"e5071e24",1177:"2d4767b7",1206:"f5e2565a",1249:"6548554b",1477:"23576965",1587:"f2f0ddcd",1620:"199badd7",1633:"5916ba50",1713:"a39683a4",1772:"7c64e97f",1815:"49d59bff",1849:"6acd5145",1914:"02e7cc31",1930:"5a90553f",1941:"42b4a384",1982:"cfd7004d",2114:"4525c5ec",2225:"c7021fe8",2267:"ebbb4efe",2358:"4fac24ed",2362:"4b7c935f",2497:"4f895231",2535:"a7ea484b",2667:"24df14a6",2777:"01c642ee",2854:"b2500044",2957:"df0057a6",3024:"aef85385",3085:"e300a692",3089:"90baf78d",3205:"fc794b8a",3237:"65387c18",3394:"af38feae",3514:"468ecfd2",3608:"6fcff1d3",3708:"0245cd10",3837:"cf6e9ebb",3839:"da0145fd",4013:"f1ec9ded",4094:"5b0776c2",4174:"491622dc",4249:"ab9f738c",4308:"b76d6365",4368:"59e6ea14",4407:"9a28792c",4413:"23314845",4420:"1f826bd9",4503:"9f30d07c",4530:"8f56c9e7",4561:"363a98e0",4792:"b4ce4ae6",4956:"4d96e184",5e3:"238d34e8",5105:"b1610c43",5243:"78811c87",5378:"bcce8997",5429:"9103adf0",5592:"785c61b8",5674:"c54ae115",5857:"63c95f33",5945:"91adb892",6057:"d2c8fc76",6086:"4d5f58a4",6103:"91691d0c",6212:"5d7c7f04",6238:"e5069361",6466:"f692c163",6687:"1b703540",6938:"8c70304e",6939:"cb709ddf",7070:"50c7f25d",7108:"3f7a4898",7178:"833b7a09",7250:"65e1c951",7429:"35187345",7652:"f22c99a1",7666:"bd69139b",7804:"36187d74",7900:"b34c5b6b",7918:"05c7b397",8187:"e5fe4432",8221:"ac1d607e",8257:"6e391afc",8289:"e30c3d19",8344:"fbf71f96",8518:"3f9571fd",8530:"f4bd36a9",8610:"a3ae5dc2",8626:"7088bbd5",8636:"7c4e08a3",8847:"b15e49de",8858:"212d3e80",8893:"82c2d7dc",8912:"baf55ce2",8935:"b7bdfe54",9003:"af64f433",9035:"e0115c9e",9076:"fc80b30f",9110:"45cd894e",9231:"6e611733",9254:"5440623e",9342:"fff1af62",9423:"4c0d6594",9464:"aefad381",9636:"6f97fbe7",9638:"18ca951b",9642:"0370a259",9661:"47837da5",9677:"1cb9b380",9700:"4771f59e",9817:"090a7f90",9856:"b25919cd",9864:"9899590b",9893:"2cfe9d5f",9895:"0058d5aa",9975:"88abc07d"}[e]+".js",r.miniCssF=e=>{},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),d={},c="grc:",r.l=(e,a,f,b)=>{if(d[e])d[e].push(a);else{var t,o;if(void 0!==f)for(var n=document.getElementsByTagName("script"),i=0;i{t.onerror=t.onload=null,clearTimeout(s);var c=d[e];if(delete d[e],t.parentNode&&t.parentNode.removeChild(t),c&&c.forEach((e=>e(f))),a)return a(f)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:t}),12e4);t.onerror=l.bind(null,t.onerror),t.onload=l.bind(null,t.onload),o&&document.head.appendChild(t)}},r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.p="/",r.gca=function(e){return e={14268422:"8893",14512658:"8847",17896441:"7918",28636868:"8257",59362658:"2267",66406991:"110","935f2afb":"53",efcf2c8f:"252",b4232381:"392",effe9d22:"438","30a24c52":"453","18faaec4":"463","82cb9cb5":"527",b2b675dd:"533","904b44e2":"571",e5ceba65:"893","8717b14a":"948","3d700513":"989","90873c47":"1177","697644c6":"1206",f5d46ffa:"1249",b2f554cd:"1477",ca37dda7:"1587",dda71f51:"1620","031793e1":"1633",a7023ddc:"1713","760a40a8":"1815","85755f43":"1849",d9f32620:"1914","79264c0c":"1930",d09c4fac:"1941",f55ff2a3:"1982","04559415":"2114",f5471bd6:"2225",e5f3d8ab:"2358",e273c56f:"2362",cb5a49d7:"2497","814f3328":"2535","747bc699":"2667","2638f36e":"2777",ab3a61e2:"2957","1f391b9e":"3085",a6aa9e1f:"3089",a80da1cf:"3205","1df93b7f":"3237",e14f0011:"3394","73664a40":"3514","9e4087bc":"3608","42fffeac":"3708",e5318f16:"3837","585f8265":"3839","01a85c17":"4013","134475a2":"4174",d81ffd3b:"4249","9f486ed0":"4308",a94703ab:"4368","7456221d":"4407","5b959513":"4413","049fe023":"4420","81dd3036":"4503","308d6444":"4530","57dcc027":"4561","24969e49":"4792",da1774b2:"4956",eb563962:"5000",a5e346b8:"5105",d5c0da25:"5243","1b2dbbfc":"5378",b27c6475:"5429","3d9099ed":"5592","57efaafb":"5674","139e27b9":"5857","9bae1a86":"5945","3a4e307e":"6057",a14faa7b:"6086",ccc49370:"6103",ce0cce8a:"6212","6850c2d9":"6238","2f84c851":"6466","2bb297c4":"6687","608ae6a4":"6938","3d5be58c":"6939","96ff4131":"7070","02f92169":"7108","096bfee4":"7178","6af205be":"7250","189c5f94":"7429","49403d74":"7652","1de959af":"7666",efb990fe:"7804","06443b75":"7900","5c7d11d5":"8187","116b5cec":"8221","0b00b8d6":"8344",a7bd4aaa:"8518","2ede842c":"8530","6875c492":"8610","47e5ec9f":"8626",f4f34a3a:"8636","657a43b2":"8858","04c65fe0":"8912",bb9046c3:"8935","925b3f96":"9003","4c9e35b1":"9035","102bb9d9":"9076","2eca2ed0":"9110",dccb6fa9:"9231","9d78ffa8":"9254","3117b6fa":"9342",be839f51:"9423","8db11540":"9464",e3c2043f:"9636","71933e4b":"9638","7661071f":"9642","5e95c892":"9661",e16015ca:"9700","14eb3368":"9817",d1dd20e5:"9856",a139a58c:"9864","37d17434":"9893",c9f32de9:"9895",f2dd65ba:"9975"}[e]||e,r.p+r.u(e)},(()=>{var e={1303:0,532:0};r.f.j=(a,f)=>{var d=r.o(e,a)?e[a]:void 0;if(0!==d)if(d)f.push(d[2]);else if(/^(1303|532)$/.test(a))e[a]=0;else{var c=new Promise(((f,c)=>d=e[a]=[f,c]));f.push(d[2]=c);var b=r.p+r.u(a),t=new Error;r.l(b,(f=>{if(r.o(e,a)&&(0!==(d=e[a])&&(e[a]=void 0),d)){var c=f&&("load"===f.type?"missing":f.type),b=f&&f.target&&f.target.src;t.message="Loading chunk "+a+" failed.\n("+c+": "+b+")",t.name="ChunkLoadError",t.type=c,t.request=b,d[1](t)}}),"chunk-"+a,a)}},r.O.j=a=>0===e[a];var a=(a,f)=>{var d,c,b=f[0],t=f[1],o=f[2],n=0;if(b.some((a=>0!==e[a]))){for(d in t)r.o(t,d)&&(r.m[d]=t[d]);if(o)var i=o(r)}for(a&&a(f);n{"use strict";var e,f,a,c,d,b={},t={};function r(e){var f=t[e];if(void 0!==f)return f.exports;var a=t[e]={id:e,loaded:!1,exports:{}};return b[e].call(a.exports,a,a.exports,r),a.loaded=!0,a.exports}r.m=b,r.c=t,e=[],r.O=(f,a,c,d)=>{if(!a){var b=1/0;for(i=0;i=d)&&Object.keys(r.O).every((e=>r.O[e](a[o])))?a.splice(o--,1):(t=!1,d0&&e[i-1][2]>d;i--)e[i]=e[i-1];e[i]=[a,c,d]},r.n=e=>{var f=e&&e.__esModule?()=>e.default:()=>e;return r.d(f,{a:f}),f},a=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,r.t=function(e,c){if(1&c&&(e=this(e)),8&c)return e;if("object"==typeof e&&e){if(4&c&&e.__esModule)return e;if(16&c&&"function"==typeof e.then)return e}var d=Object.create(null);r.r(d);var b={};f=f||[null,a({}),a([]),a(a)];for(var t=2&c&&e;"object"==typeof t&&!~f.indexOf(t);t=a(t))Object.getOwnPropertyNames(t).forEach((f=>b[f]=()=>e[f]));return b.default=()=>e,r.d(d,b),d},r.d=(e,f)=>{for(var a in f)r.o(f,a)&&!r.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:f[a]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce(((f,a)=>(r.f[a](e,f),f)),[])),r.u=e=>"assets/js/"+({53:"935f2afb",110:"66406991",252:"efcf2c8f",392:"b4232381",438:"effe9d22",453:"30a24c52",463:"18faaec4",527:"82cb9cb5",533:"b2b675dd",571:"904b44e2",893:"e5ceba65",948:"8717b14a",989:"3d700513",1177:"90873c47",1206:"697644c6",1249:"f5d46ffa",1477:"b2f554cd",1587:"ca37dda7",1620:"dda71f51",1633:"031793e1",1713:"a7023ddc",1815:"760a40a8",1849:"85755f43",1914:"d9f32620",1930:"79264c0c",1941:"d09c4fac",1982:"f55ff2a3",2114:"04559415",2225:"f5471bd6",2267:"59362658",2358:"e5f3d8ab",2362:"e273c56f",2497:"cb5a49d7",2535:"814f3328",2667:"747bc699",2777:"2638f36e",2957:"ab3a61e2",3085:"1f391b9e",3089:"a6aa9e1f",3205:"a80da1cf",3237:"1df93b7f",3394:"e14f0011",3514:"73664a40",3608:"9e4087bc",3708:"42fffeac",3837:"e5318f16",3839:"585f8265",4013:"01a85c17",4174:"134475a2",4249:"d81ffd3b",4308:"9f486ed0",4368:"a94703ab",4407:"7456221d",4413:"5b959513",4420:"049fe023",4503:"81dd3036",4530:"308d6444",4561:"57dcc027",4792:"24969e49",4956:"da1774b2",5e3:"eb563962",5105:"a5e346b8",5243:"d5c0da25",5378:"1b2dbbfc",5429:"b27c6475",5592:"3d9099ed",5674:"57efaafb",5857:"139e27b9",5945:"9bae1a86",6057:"3a4e307e",6086:"a14faa7b",6103:"ccc49370",6212:"ce0cce8a",6238:"6850c2d9",6466:"2f84c851",6687:"2bb297c4",6938:"608ae6a4",6939:"3d5be58c",7070:"96ff4131",7108:"02f92169",7178:"096bfee4",7250:"6af205be",7429:"189c5f94",7652:"49403d74",7666:"1de959af",7804:"efb990fe",7900:"06443b75",7918:"17896441",8187:"5c7d11d5",8221:"116b5cec",8257:"28636868",8344:"0b00b8d6",8518:"a7bd4aaa",8530:"2ede842c",8610:"6875c492",8626:"47e5ec9f",8636:"f4f34a3a",8847:"14512658",8858:"657a43b2",8893:"14268422",8912:"04c65fe0",8935:"bb9046c3",9003:"925b3f96",9035:"4c9e35b1",9076:"102bb9d9",9110:"2eca2ed0",9231:"dccb6fa9",9254:"9d78ffa8",9342:"3117b6fa",9423:"be839f51",9464:"8db11540",9636:"e3c2043f",9638:"71933e4b",9642:"7661071f",9661:"5e95c892",9700:"e16015ca",9817:"14eb3368",9856:"d1dd20e5",9864:"a139a58c",9893:"37d17434",9895:"c9f32de9",9975:"f2dd65ba"}[e]||e)+"."+{53:"0a7348b3",110:"712025f7",252:"6e71bb54",392:"f7dfe205",438:"a18e3f43",453:"cadf939d",463:"95c09cdc",527:"c8189fcd",533:"9871a89a",571:"14ac8ffd",893:"241d6788",948:"07ce093c",989:"e5071e24",1177:"2d4767b7",1206:"f5e2565a",1249:"6548554b",1477:"23576965",1587:"f2f0ddcd",1620:"199badd7",1633:"5916ba50",1713:"a39683a4",1772:"7c64e97f",1815:"49d59bff",1849:"6acd5145",1914:"02e7cc31",1930:"5a90553f",1941:"42b4a384",1982:"cfd7004d",2114:"4525c5ec",2225:"c7021fe8",2267:"ebbb4efe",2358:"4fac24ed",2362:"4b7c935f",2497:"4f895231",2535:"a7ea484b",2667:"24df14a6",2777:"d2f92086",2854:"b2500044",2957:"df0057a6",3024:"aef85385",3085:"e300a692",3089:"90baf78d",3205:"fc794b8a",3237:"65387c18",3394:"af38feae",3514:"468ecfd2",3608:"6fcff1d3",3708:"0245cd10",3837:"cf6e9ebb",3839:"da0145fd",4013:"f1ec9ded",4094:"5b0776c2",4174:"491622dc",4249:"ab9f738c",4308:"b76d6365",4368:"59e6ea14",4407:"9a28792c",4413:"23314845",4420:"1f826bd9",4503:"9f30d07c",4530:"8f56c9e7",4561:"363a98e0",4792:"b4ce4ae6",4956:"4d96e184",5e3:"238d34e8",5105:"b1610c43",5243:"78811c87",5378:"bcce8997",5429:"9103adf0",5592:"785c61b8",5674:"47310bb9",5857:"63c95f33",5945:"91adb892",6057:"d2c8fc76",6086:"4d5f58a4",6103:"91691d0c",6212:"5d7c7f04",6238:"e5069361",6466:"f692c163",6687:"1b703540",6938:"8c70304e",6939:"cb709ddf",7070:"50c7f25d",7108:"3f7a4898",7178:"833b7a09",7250:"65e1c951",7429:"35187345",7652:"f22c99a1",7666:"bd69139b",7804:"36187d74",7900:"b34c5b6b",7918:"05c7b397",8187:"e5fe4432",8221:"ac1d607e",8257:"6e391afc",8289:"e30c3d19",8344:"fbf71f96",8518:"3f9571fd",8530:"f4bd36a9",8610:"a3ae5dc2",8626:"7088bbd5",8636:"7c4e08a3",8847:"b15e49de",8858:"212d3e80",8893:"9a02b932",8912:"db5d8114",8935:"b7bdfe54",9003:"af64f433",9035:"e0115c9e",9076:"fc80b30f",9110:"45cd894e",9231:"6e611733",9254:"5440623e",9342:"fff1af62",9423:"4c0d6594",9464:"aefad381",9636:"6f97fbe7",9638:"18ca951b",9642:"0370a259",9661:"47837da5",9677:"1cb9b380",9700:"4771f59e",9817:"090a7f90",9856:"b25919cd",9864:"9899590b",9893:"2cfe9d5f",9895:"0058d5aa",9975:"88abc07d"}[e]+".js",r.miniCssF=e=>{},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,f)=>Object.prototype.hasOwnProperty.call(e,f),c={},d="grc:",r.l=(e,f,a,b)=>{if(c[e])c[e].push(f);else{var t,o;if(void 0!==a)for(var n=document.getElementsByTagName("script"),i=0;i{t.onerror=t.onload=null,clearTimeout(s);var d=c[e];if(delete c[e],t.parentNode&&t.parentNode.removeChild(t),d&&d.forEach((e=>e(a))),f)return f(a)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:t}),12e4);t.onerror=l.bind(null,t.onerror),t.onload=l.bind(null,t.onload),o&&document.head.appendChild(t)}},r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.p="/",r.gca=function(e){return e={14268422:"8893",14512658:"8847",17896441:"7918",28636868:"8257",59362658:"2267",66406991:"110","935f2afb":"53",efcf2c8f:"252",b4232381:"392",effe9d22:"438","30a24c52":"453","18faaec4":"463","82cb9cb5":"527",b2b675dd:"533","904b44e2":"571",e5ceba65:"893","8717b14a":"948","3d700513":"989","90873c47":"1177","697644c6":"1206",f5d46ffa:"1249",b2f554cd:"1477",ca37dda7:"1587",dda71f51:"1620","031793e1":"1633",a7023ddc:"1713","760a40a8":"1815","85755f43":"1849",d9f32620:"1914","79264c0c":"1930",d09c4fac:"1941",f55ff2a3:"1982","04559415":"2114",f5471bd6:"2225",e5f3d8ab:"2358",e273c56f:"2362",cb5a49d7:"2497","814f3328":"2535","747bc699":"2667","2638f36e":"2777",ab3a61e2:"2957","1f391b9e":"3085",a6aa9e1f:"3089",a80da1cf:"3205","1df93b7f":"3237",e14f0011:"3394","73664a40":"3514","9e4087bc":"3608","42fffeac":"3708",e5318f16:"3837","585f8265":"3839","01a85c17":"4013","134475a2":"4174",d81ffd3b:"4249","9f486ed0":"4308",a94703ab:"4368","7456221d":"4407","5b959513":"4413","049fe023":"4420","81dd3036":"4503","308d6444":"4530","57dcc027":"4561","24969e49":"4792",da1774b2:"4956",eb563962:"5000",a5e346b8:"5105",d5c0da25:"5243","1b2dbbfc":"5378",b27c6475:"5429","3d9099ed":"5592","57efaafb":"5674","139e27b9":"5857","9bae1a86":"5945","3a4e307e":"6057",a14faa7b:"6086",ccc49370:"6103",ce0cce8a:"6212","6850c2d9":"6238","2f84c851":"6466","2bb297c4":"6687","608ae6a4":"6938","3d5be58c":"6939","96ff4131":"7070","02f92169":"7108","096bfee4":"7178","6af205be":"7250","189c5f94":"7429","49403d74":"7652","1de959af":"7666",efb990fe:"7804","06443b75":"7900","5c7d11d5":"8187","116b5cec":"8221","0b00b8d6":"8344",a7bd4aaa:"8518","2ede842c":"8530","6875c492":"8610","47e5ec9f":"8626",f4f34a3a:"8636","657a43b2":"8858","04c65fe0":"8912",bb9046c3:"8935","925b3f96":"9003","4c9e35b1":"9035","102bb9d9":"9076","2eca2ed0":"9110",dccb6fa9:"9231","9d78ffa8":"9254","3117b6fa":"9342",be839f51:"9423","8db11540":"9464",e3c2043f:"9636","71933e4b":"9638","7661071f":"9642","5e95c892":"9661",e16015ca:"9700","14eb3368":"9817",d1dd20e5:"9856",a139a58c:"9864","37d17434":"9893",c9f32de9:"9895",f2dd65ba:"9975"}[e]||e,r.p+r.u(e)},(()=>{var e={1303:0,532:0};r.f.j=(f,a)=>{var c=r.o(e,f)?e[f]:void 0;if(0!==c)if(c)a.push(c[2]);else if(/^(1303|532)$/.test(f))e[f]=0;else{var d=new Promise(((a,d)=>c=e[f]=[a,d]));a.push(c[2]=d);var b=r.p+r.u(f),t=new Error;r.l(b,(a=>{if(r.o(e,f)&&(0!==(c=e[f])&&(e[f]=void 0),c)){var d=a&&("load"===a.type?"missing":a.type),b=a&&a.target&&a.target.src;t.message="Loading chunk "+f+" failed.\n("+d+": "+b+")",t.name="ChunkLoadError",t.type=d,t.request=b,c[1](t)}}),"chunk-"+f,f)}},r.O.j=f=>0===e[f];var f=(f,a)=>{var c,d,b=a[0],t=a[1],o=a[2],n=0;if(b.some((f=>0!==e[f]))){for(c in t)r.o(t,c)&&(r.m[c]=t[c]);if(o)var i=o(r)}for(f&&f(a);n
-
+
diff --git a/blog/first-blog-post/index.html b/blog/first-blog-post/index.html
index 656dc77e..3784615d 100644
--- a/blog/first-blog-post/index.html
+++ b/blog/first-blog-post/index.html
@@ -10,7 +10,7 @@
-
+
diff --git a/blog/index.html b/blog/index.html
index 4dfa5739..d62d8162 100644
--- a/blog/index.html
+++ b/blog/index.html
@@ -10,7 +10,7 @@
-
+
diff --git a/blog/long-blog-post/index.html b/blog/long-blog-post/index.html
index c91d68e3..18f91539 100644
--- a/blog/long-blog-post/index.html
+++ b/blog/long-blog-post/index.html
@@ -10,7 +10,7 @@
-
+
diff --git a/blog/mdx-blog-post/index.html b/blog/mdx-blog-post/index.html
index 7a557b48..5e1b394c 100644
--- a/blog/mdx-blog-post/index.html
+++ b/blog/mdx-blog-post/index.html
@@ -10,7 +10,7 @@
-
+
diff --git a/blog/tags/docusaurus/index.html b/blog/tags/docusaurus/index.html
index 87ee6eb9..1dde87dc 100644
--- a/blog/tags/docusaurus/index.html
+++ b/blog/tags/docusaurus/index.html
@@ -10,7 +10,7 @@
-
+
diff --git a/blog/tags/facebook/index.html b/blog/tags/facebook/index.html
index 52499121..3b96ecc5 100644
--- a/blog/tags/facebook/index.html
+++ b/blog/tags/facebook/index.html
@@ -10,7 +10,7 @@
-
+
diff --git a/blog/tags/hello/index.html b/blog/tags/hello/index.html
index 872a84c4..a10eecda 100644
--- a/blog/tags/hello/index.html
+++ b/blog/tags/hello/index.html
@@ -10,7 +10,7 @@
-
+
diff --git a/blog/tags/hola/index.html b/blog/tags/hola/index.html
index 3ac1c609..33d12dcd 100644
--- a/blog/tags/hola/index.html
+++ b/blog/tags/hola/index.html
@@ -10,7 +10,7 @@
-
+
diff --git a/blog/tags/index.html b/blog/tags/index.html
index bc7aeb00..a8ca39e9 100644
--- a/blog/tags/index.html
+++ b/blog/tags/index.html
@@ -10,7 +10,7 @@
-
+
diff --git a/blog/welcome/index.html b/blog/welcome/index.html
index a90b8510..651dc0b6 100644
--- a/blog/welcome/index.html
+++ b/blog/welcome/index.html
@@ -10,7 +10,7 @@
-
+
diff --git a/contact/index.html b/contact/index.html
index e6ae1bb7..58449fbc 100644
--- a/contact/index.html
+++ b/contact/index.html
@@ -10,7 +10,7 @@
-
+
diff --git a/docs/category/c-introduction/index.html b/docs/category/c-introduction/index.html
index a669f4e3..886a1f3e 100644
--- a/docs/category/c-introduction/index.html
+++ b/docs/category/c-introduction/index.html
@@ -10,7 +10,7 @@
-
+
diff --git a/docs/category/hermes/index.html b/docs/category/hermes/index.html
index f5a35968..eb28de51 100644
--- a/docs/category/hermes/index.html
+++ b/docs/category/hermes/index.html
@@ -10,11 +10,11 @@
-
+
-