{"id":308,"date":"2021-04-01T21:57:16","date_gmt":"2021-04-01T21:57:16","guid":{"rendered":"https:\/\/terrabioappdev.wpenginepowered.com\/reduce-computing-costs-by-tailoring-resource-allocations-in-workflows\/"},"modified":"2023-12-27T04:54:37","modified_gmt":"2023-12-27T04:54:37","slug":"reduce-computing-costs-by-tailoring-resource-allocations-in-workflows","status":"publish","type":"post","link":"https:\/\/terra.bio\/reduce-computing-costs-by-tailoring-resource-allocations-in-workflows\/","title":{"rendered":"One size doesn&#8217;t fit all: Reduce computing costs by tailoring resource allocations in workflows"},"content":{"rendered":"<p><i><span style=\"font-weight: 400;\">This is an updated version of a blog post written a few years ago by Jose Soto, formerly a Software Engineer in the Broad Institute&#8217;s Data Sciences Platform, who made major contributions to the original &#8220;<\/span><\/i><a href=\"https:\/\/github.com\/broadinstitute\/gatk-docs\/blob\/master\/blog-2012-to-2019\/2018-02-12-Run_the_germline_GATK_Best_Practices_Pipeline_for_%245_per_genome.md\"><i><span style=\"font-weight: 400;\">$5 Genome Analysis Pipeline<\/span><\/i><\/a><i><span style=\"font-weight: 400;\">&#8221; optimization project. We&#8217;ve updated the technical content to match WDL 1.0 syntax, and refreshed the context for current times.\u00a0\u00a0<\/span><\/i><\/p>\n<p>&nbsp;<\/p>\n<hr \/>\n<p>&nbsp;<\/p>\n<p><span style=\"font-weight: 400;\">On a pay-as-you-go platform like Google Cloud, the rate you pay for computing resources is based on the technical specifications of the virtual machines you use; the beefier the machine \u2014 in terms of processor power, memory and disk space \u2014 the higher the rate. To save money, you need to make sure you don&#8217;t use VMs that are beefier than you need. <\/span><\/p>\n<p><span style=\"font-weight: 400;\">However, this can be challenging when you&#8217;re running workflows that involve multiple different tasks \u2014 encapsulating different command line tools \u2014 which may all have very different needs. Imagine you&#8217;re starting with a simple format conversion task, where you have a big pile of data in one format and you need to rewrite basically the same information but represented in a different file structure. You can do that with a basic CPU, but you need a lot of disk space to accommodate the original input and the reformatted output. Now imagine the next thing you need to do is an analysis that distills the evidence you find in that big pile of data into a set of summary statistics. That probably involves running some complex algorithms that require a lot of processor power and memory, but not nearly as much disk space as the previous task, since the output is much smaller than the original input.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Fortunately the workflow execution system we use in Terra, <\/span><a href=\"https:\/\/cromwell.readthedocs.io\"><span style=\"font-weight: 400;\">Cromwell<\/span><\/a><span style=\"font-weight: 400;\">, allows you to allocate resources separately for each step in your workflow: each step will get executed on a separate VM with its own technical specs for processor power, memory and disk space. You &#8220;just&#8221; need to specify what those specs should be, either directly in the workflow script (written in <\/span><a href=\"https:\/\/openwdl.org\/\"><span style=\"font-weight: 400;\">WDL<\/span><\/a><span style=\"font-weight: 400;\">) or in the list of parameters you provide for a given submission.\u00a0<\/span><\/p>\n<p><img fetchpriority=\"high\" decoding=\"async\" class=\"alignnone size-large wp-image-870\" src=\"https:\/\/terra.bio\/wp-content\/uploads\/2023\/12\/workflow-execution-1024x339.png\" alt=\"\" width=\"800\" height=\"265\" \/><\/p>\n<p><span style=\"font-weight: 400;\">That allows you to tailor resource allocations based on what each task needs, which can substantially reduce your overall computing costs. Yet it raises the inevitable question&#8230;<\/span><\/p>\n<p>&nbsp;<\/p>\n<h3><span style=\"font-weight: 400;\">How do you determine what those resource allocations should be?\u00a0<\/span><\/h3>\n<p><span style=\"font-weight: 400;\">In practice, processor power and memory are typically things that you can set once for a particular tool, based on the tool developer&#8217;s recommendations, and have that setting apply to the majority of the work you plan to do. In contrast, how much disk space you need is much more variable, since it usually depends on the size of the input files that you&#8217;re feeding in. That can vary enormously when you&#8217;re dealing with data types like whole genome sequence; depending on how much sequence coverage you have, whether the data is split by chromosome or by even smaller intervals, and so on, file sizes can differ by hundreds of gigabytes from one batch of data to the next. So that&#8217;s typically something you&#8217;ll need to optimize over a few iterations when you&#8217;re writing or adapting a new workflow.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">To help you navigate this challenge, we pulled together some recommendations from our colleagues in the Broad&#8217;s Data Sciences Platform pipeline engineering team, who have a ton of experience optimizing workflows to be robust, efficient and economical. This is not the only approach you could take, but it&#8217;s one that has the benefit of breaking down the problem into distinct phases so you can focus on one part of the problem at a time.<\/span><\/p>\n<p><i><span style=\"font-weight: 400;\">These recommendations assume some basic familiarity with WDL syntax. If you are completely new to WDL, consider checking out the OpenWDL community&#8217;s <\/span><\/i><a href=\"https:\/\/github.com\/openwdl\/learn-wdl\"><i><span style=\"font-weight: 400;\">learn-wdl<\/span><\/i><\/a><i><span style=\"font-weight: 400;\"> project, which includes tutorials and a video-based course. For an introduction to running workflows with WDL and Cromwell in Terra, see the <\/span><\/i><a href=\"https:\/\/www.youtube.com\/watch?v=rUBrJNqLyfU\"><i><span style=\"font-weight: 400;\">Workflows Quickstart video<\/span><\/i><\/a><i><span style=\"font-weight: 400;\">.<\/span><\/i><\/p>\n<p>&nbsp;<\/p>\n<h3><span style=\"font-weight: 400;\">Step 1: Just get it to work with ballpark numbers<\/span><\/h3>\n<p><span style=\"font-weight: 400;\">When you start out working on a new workflow, don&#8217;t worry too much about optimizing anything. You&#8217;re probably running on some small-scale test data anyway, so any single run shouldn&#8217;t cost you much. In this phase, what matters is to see that you can get the tools running and producing expected outputs.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">So for each task, just put in an overestimated value for disk space allocation, hardcoding it directly into the disk runtime attribute of the task so you can get it to work and move on.<\/span><\/p>\n<pre><span style=\"font-weight: 400;\">\nruntime {<\/span>\n<span style=\"font-weight: 400;\">    docker: \"broadinstitute\/gatk:4.2.0.0\"<\/span>\n<span style=\"font-weight: 400;\"> \u00a0\u00a0\u00a0memory: \"3000 MB\"<\/span>\n<span style=\"font-weight: 400;\"> \u00a0\u00a0\u00a0disk: \"local-disk 500 HDD\"\u00a0<\/span>\n<span style=\"font-weight: 400;\"> \u00a0}<\/span>\n\n<\/pre>\n<p>Here, &#8220;<span style=\"font-weight: 400;\">local-disk 500 HDD&#8221; means &#8220;use a regular hard drive (HDD), 500 GB in size&#8221; (gigabytes are used by default unless another unit is specified).<\/span><\/p>\n<p>&nbsp;<\/p>\n<h3><span style=\"font-weight: 400;\">Step 2<\/span><span style=\"font-weight: 400;\">: Add in some flexibility with parameter variables<\/span><\/h3>\n<p><span style=\"font-weight: 400;\">Once you&#8217;re satisfied that the task works, you can start refining your WDL to give yourself more flexibility by parameterizing resource settings. You can put in a variable that is referenced in the disk runtime attribute; that way you can pass in a custom value for it, along with other inputs and parameters, whenever you launch the workflow. That allows you to try different values without having to edit the script itself each time.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">The task definition would look like this:<\/span><\/p>\n<pre><span style=\"font-weight: 400;\">\ntask ProcessSomeData {<\/span>\n\n<span style=\"font-weight: 400;\">    inputs {<\/span>\n<span style=\"font-weight: 400;\">        Int disk_for_my_task<\/span>\n<span style=\"font-weight: 400;\"> \u00a0\u00a0\u00a0    \u2026 # other inputs<\/span>\n<span style=\"font-weight: 400;\">    }<\/span>\n\n<span style=\"font-weight: 400;\">    runtime {<\/span>\n<span style=\"font-weight: 400;\">        docker: \"broadinstitute\/gatk:4.2.0.0\"<\/span>\n<span style=\"font-weight: 400;\"> \u00a0\u00a0\u00a0    memory: \"3000 MB\"<\/span>\n<span style=\"font-weight: 400;\">        disks: \"local-disk \" + disk_for_my_task + \" HDD\"  <\/span>\n<span style=\"font-weight: 400;\"> \u00a0    }<\/span>\n\n<span style=\"font-weight: 400;\"> \u00a0    \u2026 # command and output blocks<\/span>\n<span style=\"font-weight: 400;\">}<\/span><\/pre>\n<p>&nbsp;<\/p>\n<p>Now the disk size is passed in as an input to the task, using the <strong>disk_for_my_task <\/strong>variable.<\/p>\n<p><span style=\"font-weight: 400;\">One drawback to this formulation is that if you leave it at that, every time you call this task, you have to come up with some value for disk that should <\/span><i><span style=\"font-weight: 400;\">probably maybe<\/span><\/i><span style=\"font-weight: 400;\"> work for that specific set of inputs \u2014 and as we discussed above, this can vary wildly depending from run to run. If you guess too high, you&#8217;re going to spend money for nothing, and if you guess too low, your task is going to fail when it runs out of disk space, which is super annoying and a big waste of your time.\u00a0<\/span><\/p>\n<p>&nbsp;<\/p>\n<h3><span style=\"font-weight: 400;\">Step 3<\/span><span style=\"font-weight: 400;\">: Get the right size automagically\u00a0<\/span><\/h3>\n<p><span style=\"font-weight: 400;\">This is where it gets really cool: you can actually have the system to calculate how much disk size to use based on the size of the input files! That is, of course, assuming you have some insight into the ratio of input to output, which you can derive from a few test runs.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">At the start of each task, the system has access to information about the specific input files it&#8217;s going to need to localize and operate on. So you can tell it to query the storage system <\/span><i><span style=\"font-weight: 400;\">before<\/span><\/i><span style=\"font-weight: 400;\"> it starts requesting resources, retrieve that size information, and apply a calculation (that you provide in the script) to determine how much disk space is needed based on the input data.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">What calculation, you ask? Let&#8217;s run through an example. Say you&#8217;re doing that format conversion from earlier; you need to account for the input file (<strong>input_bam<\/strong>), the output file which is roughly the same size (so we multiply input size <strong>*2<\/strong>), probably some accessory files like a genome reference (<strong>ref_fasta<\/strong>) and its dictionary file (<strong>ref_dict<\/strong>), and finally add a bit of padding just to make sure the tool has enough headroom. For padding, let&#8217;s put in a <strong>disk_pad<\/strong> variable and an extra <strong>5<\/strong>\u00a0GB of hard-coded padding. Here&#8217;s what the calculation looks like:<\/span><\/p>\n<pre><span style=\"font-weight: 400;\">\nInt disk_for_my_task = ceil(size(input_bam, \"GB\")*2 + size(ref_fasta, \"GB\") + size(ref_dict, \"GB\")) + disk_pad + 5\n\n<\/span><\/pre>\n<p><span style=\"font-weight: 400;\">In this statement, we start by querying the file sizes with the aptly named <strong>size()<\/strong> function, requesting gigabytes (<strong>GB<\/strong>) as the unit. We then add up the sizes of the main input files, account for the output by multiplying the input size by a factor of two, round up the total with <strong>ceil()<\/strong> (which is short for &#8220;ceiling&#8221;) to return an integer value, and finally add the padding. The result is the amount of disk space we&#8217;re going to allocate to our task at runtime.<\/span><\/p>\n<p><i><span style=\"font-weight: 400;\">You can learn more about the functions used in this example in the <\/span><\/i><a href=\"https:\/\/github.com\/openwdl\/wdl\/blob\/main\/versions\/1.1\/SPEC.md\"><i><span style=\"font-weight: 400;\">WDL specification<\/span><\/i><\/a><i><span style=\"font-weight: 400;\">. Of particular interest, the <strong>size()<\/strong> function has some neat options that we don&#8217;t show here, like the ability to take an array of files as input and return the sum total of their sizes. That can help streamline the calculation statement for tasks that use multiple input files.<\/span><\/i><\/p>\n<p><span style=\"font-weight: 400;\">To fit the &#8220;autosize&#8221; trick into an actual workflow, you can simply add the calculation inside the task definition, replacing the original <strong>disk_for_my_task<\/strong> variable. Or, if you think you might want to use the result in other tasks that have equivalent requirements, you can do the calculation at the workflow level and just pass in the resulting variable to the task using the <strong>disk_for_my_task<\/strong> input we already wired up earlier.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Here&#8217;s what that second option would look like:<\/span><\/p>\n<pre><span style=\"font-weight: 400;\">\nworkflow MyOptimizedWorkflow {<\/span>\n\n<span style=\"font-weight: 400;\">    inputs {<\/span>\n<span style=\"font-weight: 400;\">        File ref_fasta<\/span>\n<span style=\"font-weight: 400;\">        File ref_dict<\/span>\n<span style=\"font-weight: 400;\">        File input_bam<\/span>\n<span style=\"font-weight: 400;\"> \u00a0  }<\/span>\n\n<span style=\"font-weight: 400;\"> \u00a0  # Plan on some adjustable disk padding <\/span>\n<span style=\"font-weight: 400;\"> \u00a0  Int disk_pad = 10<\/span>\n\n<span style=\"font-weight: 400;\"> \u00a0  # Calculate disk size based on inputs, padding and expected output<\/span>\n<span style=\"font-weight: 400;\"> \u00a0  Int disk_for_my_task = ceil(size(input_bam, \"GB\")*2 + size(ref_fasta, \"GB\") + size(ref_dict, \"GB\")) + disk_pad + 5<\/span>\n\n<span style=\"font-weight: 400;\"> \u00a0  call ProcessSomeData {<\/span>\n<span style=\"font-weight: 400;\">        input:<\/span>\n<span style=\"font-weight: 400;\"> \u00a0\u00a0\u00a0\u00a0\u00a0      input_bam = input_bam,<\/span>\n<span style=\"font-weight: 400;\">            ref_fasta = ref_fasta,<\/span>\n<span style=\"font-weight: 400;\">            ref_dict = ref_dict,<\/span>\n<span style=\"font-weight: 400;\">            disk_for_my_task = disk_for_my_task \n<\/span><span style=\"font-weight: 400;\">    }<\/span>\n<span style=\"font-weight: 400;\">}\n\n<\/span><\/pre>\n<p><span style=\"font-weight: 400;\">Out of all that, accounting for the output size is usually the trickiest part, since you need to have some prior knowledge of what to expect based on what the tool does. Running a few small-scale tests can be very helpful here.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">You might also find it useful to browse through the pipelines in the <\/span><a href=\"https:\/\/github.com\/broadinstitute\/warp\"><span style=\"font-weight: 400;\">WARP repository<\/span><\/a><span style=\"font-weight: 400;\">, which contains a variety of cloud-optimized workflows maintained by our pipeline engineering team. There&#8217;s a lot to learn just from looking at how those are set up, and you may find some inspiration for how to deal with specific challenges in your own workflows. Good luck!<\/span><\/p>\n","protected":false},"excerpt":{"rendered":"<p>On the cloud, the rate you pay for computing resources is based on the technical specifications of the virtual machines you use. Our pipeline engineering team offers some tips for cutting costs by adjusting workflow resource allocations dynamically.<\/p>\n","protected":false},"author":4,"featured_media":310,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[55,43,32],"tags":[85],"class_list":["post-308","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-cost-control","category-features","category-workflows","tag-wdl"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.0 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>One size doesn&#039;t fit all: Reduce computing costs by tailoring resource allocations in workflows - Terra<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/terra.bio\/reduce-computing-costs-by-tailoring-resource-allocations-in-workflows\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"One size doesn&#039;t fit all: Reduce computing costs by tailoring resource allocations in workflows - Terra\" \/>\n<meta property=\"og:description\" content=\"On the cloud, the rate you pay for computing resources is based on the technical specifications of the virtual machines you use. Our pipeline engineering team offers some tips for cutting costs by adjusting workflow resource allocations dynamically.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/terra.bio\/reduce-computing-costs-by-tailoring-resource-allocations-in-workflows\/\" \/>\n<meta property=\"og:site_name\" content=\"Terra\" \/>\n<meta property=\"article:published_time\" content=\"2021-04-01T21:57:16+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-12-27T04:54:37+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/terra.bio\/wp-content\/uploads\/2023\/12\/Cloud_Circuits_Binary_OG.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"627\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Geraldine Van der Auwera\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Geraldine Van der Auwera\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/terra.bio\/reduce-computing-costs-by-tailoring-resource-allocations-in-workflows\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/terra.bio\/reduce-computing-costs-by-tailoring-resource-allocations-in-workflows\/\"},\"author\":{\"name\":\"Geraldine Van der Auwera\",\"@id\":\"https:\/\/terra.bio\/#\/schema\/person\/ad0522d0b331a5e08fa1733f65086ee2\"},\"headline\":\"One size doesn&#8217;t fit all: Reduce computing costs by tailoring resource allocations in workflows\",\"datePublished\":\"2021-04-01T21:57:16+00:00\",\"dateModified\":\"2023-12-27T04:54:37+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/terra.bio\/reduce-computing-costs-by-tailoring-resource-allocations-in-workflows\/\"},\"wordCount\":1575,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/terra.bio\/#organization\"},\"image\":{\"@id\":\"https:\/\/terra.bio\/reduce-computing-costs-by-tailoring-resource-allocations-in-workflows\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/terra.bio\/wp-content\/uploads\/2023\/12\/Cloud_Circuits_Binary_OG.png\",\"keywords\":[\"wdl\"],\"articleSection\":[\"Cost Control\",\"Features\",\"Workflows\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/terra.bio\/reduce-computing-costs-by-tailoring-resource-allocations-in-workflows\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/terra.bio\/reduce-computing-costs-by-tailoring-resource-allocations-in-workflows\/\",\"url\":\"https:\/\/terra.bio\/reduce-computing-costs-by-tailoring-resource-allocations-in-workflows\/\",\"name\":\"One size doesn't fit all: Reduce computing costs by tailoring resource allocations in workflows - Terra\",\"isPartOf\":{\"@id\":\"https:\/\/terra.bio\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/terra.bio\/reduce-computing-costs-by-tailoring-resource-allocations-in-workflows\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/terra.bio\/reduce-computing-costs-by-tailoring-resource-allocations-in-workflows\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/terra.bio\/wp-content\/uploads\/2023\/12\/Cloud_Circuits_Binary_OG.png\",\"datePublished\":\"2021-04-01T21:57:16+00:00\",\"dateModified\":\"2023-12-27T04:54:37+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/terra.bio\/reduce-computing-costs-by-tailoring-resource-allocations-in-workflows\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/terra.bio\/reduce-computing-costs-by-tailoring-resource-allocations-in-workflows\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/terra.bio\/reduce-computing-costs-by-tailoring-resource-allocations-in-workflows\/#primaryimage\",\"url\":\"https:\/\/terra.bio\/wp-content\/uploads\/2023\/12\/Cloud_Circuits_Binary_OG.png\",\"contentUrl\":\"https:\/\/terra.bio\/wp-content\/uploads\/2023\/12\/Cloud_Circuits_Binary_OG.png\",\"width\":1200,\"height\":627,\"caption\":\"Cloud_Circuits_Binary_OG\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/terra.bio\/reduce-computing-costs-by-tailoring-resource-allocations-in-workflows\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/terra.bio\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"One size doesn&#8217;t fit all: Reduce computing costs by tailoring resource allocations in workflows\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/terra.bio\/#website\",\"url\":\"https:\/\/terra.bio\/\",\"name\":\"Terra\",\"description\":\"Science at Scale\",\"publisher\":{\"@id\":\"https:\/\/terra.bio\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/terra.bio\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/terra.bio\/#organization\",\"name\":\"Terra\",\"url\":\"https:\/\/terra.bio\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/terra.bio\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/terra.bio\/wp-content\/uploads\/2023\/12\/Terra-Bio-App@2x.webp\",\"contentUrl\":\"https:\/\/terra.bio\/wp-content\/uploads\/2023\/12\/Terra-Bio-App@2x.webp\",\"width\":287,\"height\":318,\"caption\":\"Terra\"},\"image\":{\"@id\":\"https:\/\/terra.bio\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/terra.bio\/#\/schema\/person\/ad0522d0b331a5e08fa1733f65086ee2\",\"name\":\"Geraldine Van der Auwera\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/terra.bio\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/d73bdaf6740465b385e0e3b290786d8cb9d9d548eadec23364254ba06c85204b?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/d73bdaf6740465b385e0e3b290786d8cb9d9d548eadec23364254ba06c85204b?s=96&d=mm&r=g\",\"caption\":\"Geraldine Van der Auwera\"},\"sameAs\":[\"https:\/\/app.terra.bio\/\"],\"url\":\"https:\/\/terra.bio\/author\/geraldinevanterra\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"One size doesn't fit all: Reduce computing costs by tailoring resource allocations in workflows - Terra","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/terra.bio\/reduce-computing-costs-by-tailoring-resource-allocations-in-workflows\/","og_locale":"en_US","og_type":"article","og_title":"One size doesn't fit all: Reduce computing costs by tailoring resource allocations in workflows - Terra","og_description":"On the cloud, the rate you pay for computing resources is based on the technical specifications of the virtual machines you use. Our pipeline engineering team offers some tips for cutting costs by adjusting workflow resource allocations dynamically.","og_url":"https:\/\/terra.bio\/reduce-computing-costs-by-tailoring-resource-allocations-in-workflows\/","og_site_name":"Terra","article_published_time":"2021-04-01T21:57:16+00:00","article_modified_time":"2023-12-27T04:54:37+00:00","og_image":[{"width":1200,"height":627,"url":"https:\/\/terra.bio\/wp-content\/uploads\/2023\/12\/Cloud_Circuits_Binary_OG.png","type":"image\/png"}],"author":"Geraldine Van der Auwera","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Geraldine Van der Auwera","Est. reading time":"8 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/terra.bio\/reduce-computing-costs-by-tailoring-resource-allocations-in-workflows\/#article","isPartOf":{"@id":"https:\/\/terra.bio\/reduce-computing-costs-by-tailoring-resource-allocations-in-workflows\/"},"author":{"name":"Geraldine Van der Auwera","@id":"https:\/\/terra.bio\/#\/schema\/person\/ad0522d0b331a5e08fa1733f65086ee2"},"headline":"One size doesn&#8217;t fit all: Reduce computing costs by tailoring resource allocations in workflows","datePublished":"2021-04-01T21:57:16+00:00","dateModified":"2023-12-27T04:54:37+00:00","mainEntityOfPage":{"@id":"https:\/\/terra.bio\/reduce-computing-costs-by-tailoring-resource-allocations-in-workflows\/"},"wordCount":1575,"commentCount":0,"publisher":{"@id":"https:\/\/terra.bio\/#organization"},"image":{"@id":"https:\/\/terra.bio\/reduce-computing-costs-by-tailoring-resource-allocations-in-workflows\/#primaryimage"},"thumbnailUrl":"https:\/\/terra.bio\/wp-content\/uploads\/2023\/12\/Cloud_Circuits_Binary_OG.png","keywords":["wdl"],"articleSection":["Cost Control","Features","Workflows"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/terra.bio\/reduce-computing-costs-by-tailoring-resource-allocations-in-workflows\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/terra.bio\/reduce-computing-costs-by-tailoring-resource-allocations-in-workflows\/","url":"https:\/\/terra.bio\/reduce-computing-costs-by-tailoring-resource-allocations-in-workflows\/","name":"One size doesn't fit all: Reduce computing costs by tailoring resource allocations in workflows - Terra","isPartOf":{"@id":"https:\/\/terra.bio\/#website"},"primaryImageOfPage":{"@id":"https:\/\/terra.bio\/reduce-computing-costs-by-tailoring-resource-allocations-in-workflows\/#primaryimage"},"image":{"@id":"https:\/\/terra.bio\/reduce-computing-costs-by-tailoring-resource-allocations-in-workflows\/#primaryimage"},"thumbnailUrl":"https:\/\/terra.bio\/wp-content\/uploads\/2023\/12\/Cloud_Circuits_Binary_OG.png","datePublished":"2021-04-01T21:57:16+00:00","dateModified":"2023-12-27T04:54:37+00:00","breadcrumb":{"@id":"https:\/\/terra.bio\/reduce-computing-costs-by-tailoring-resource-allocations-in-workflows\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/terra.bio\/reduce-computing-costs-by-tailoring-resource-allocations-in-workflows\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/terra.bio\/reduce-computing-costs-by-tailoring-resource-allocations-in-workflows\/#primaryimage","url":"https:\/\/terra.bio\/wp-content\/uploads\/2023\/12\/Cloud_Circuits_Binary_OG.png","contentUrl":"https:\/\/terra.bio\/wp-content\/uploads\/2023\/12\/Cloud_Circuits_Binary_OG.png","width":1200,"height":627,"caption":"Cloud_Circuits_Binary_OG"},{"@type":"BreadcrumbList","@id":"https:\/\/terra.bio\/reduce-computing-costs-by-tailoring-resource-allocations-in-workflows\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/terra.bio\/"},{"@type":"ListItem","position":2,"name":"One size doesn&#8217;t fit all: Reduce computing costs by tailoring resource allocations in workflows"}]},{"@type":"WebSite","@id":"https:\/\/terra.bio\/#website","url":"https:\/\/terra.bio\/","name":"Terra","description":"Science at Scale","publisher":{"@id":"https:\/\/terra.bio\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/terra.bio\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/terra.bio\/#organization","name":"Terra","url":"https:\/\/terra.bio\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/terra.bio\/#\/schema\/logo\/image\/","url":"https:\/\/terra.bio\/wp-content\/uploads\/2023\/12\/Terra-Bio-App@2x.webp","contentUrl":"https:\/\/terra.bio\/wp-content\/uploads\/2023\/12\/Terra-Bio-App@2x.webp","width":287,"height":318,"caption":"Terra"},"image":{"@id":"https:\/\/terra.bio\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/terra.bio\/#\/schema\/person\/ad0522d0b331a5e08fa1733f65086ee2","name":"Geraldine Van der Auwera","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/terra.bio\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/d73bdaf6740465b385e0e3b290786d8cb9d9d548eadec23364254ba06c85204b?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/d73bdaf6740465b385e0e3b290786d8cb9d9d548eadec23364254ba06c85204b?s=96&d=mm&r=g","caption":"Geraldine Van der Auwera"},"sameAs":["https:\/\/app.terra.bio\/"],"url":"https:\/\/terra.bio\/author\/geraldinevanterra\/"}]}},"_links":{"self":[{"href":"https:\/\/terra.bio\/wp-json\/wp\/v2\/posts\/308","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/terra.bio\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/terra.bio\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/terra.bio\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/terra.bio\/wp-json\/wp\/v2\/comments?post=308"}],"version-history":[{"count":0,"href":"https:\/\/terra.bio\/wp-json\/wp\/v2\/posts\/308\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/terra.bio\/wp-json\/wp\/v2\/media\/310"}],"wp:attachment":[{"href":"https:\/\/terra.bio\/wp-json\/wp\/v2\/media?parent=308"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/terra.bio\/wp-json\/wp\/v2\/categories?post=308"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/terra.bio\/wp-json\/wp\/v2\/tags?post=308"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}