{"templateName":"blog-page","cssClassNames":"blog-page page basicpage summit-page","allowedRenditionsWidth":["320","480","640","768","960","1200","1440","1920"],"description":"See how Snowflake Batch Inference Jobs deliver up to 6.5x higher throughput and up to 5.8x lower compute costs in our benchmarks compared to Databricks and cloud providers.","language":"en","title":"Batch Inference Performance: Cross-Platform Comparison","analyticsPageType":"homepage","analyticsCategory":"general","analyticsSubCategory":"","excludeFromAnalytics":false,":mappedPath":"/en/blog/engineering/snowflake-batch-inference-performance/",":type":"snowflake-site/components/structure/page",":items":{"root":{"columnCount":12,"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","columnClassNames":{"experiencefragment-banner":"aem-GridColumn aem-GridColumn--default--12","experiencefragment-sub-header":"aem-GridColumn aem-GridColumn--default--12","experiencefragment-pre-footer":"aem-GridColumn aem-GridColumn--default--12","experiencefragment-header":"aem-GridColumn aem-GridColumn--default--12","markup_editor-table":"aem-GridColumn aem-GridColumn--default--12","responsivegrid":"aem-GridColumn aem-GridColumn--default--12","experiencefragment-footer":"aem-GridColumn aem-GridColumn--default--12","markup_editor":"aem-GridColumn aem-GridColumn--default--12","container_47873732":"aem-GridColumn aem-GridColumn--default--12"},":items":{"experiencefragment-banner":{"id":"experiencefragment-0f4e6cf86b","localizedFragmentVariationPath":"/content/experience-fragments/snowflake-site/language-masters/en/site/pushdown-banner/pushdown-banner-blank/jcr:content","configured":true,":type":"snowflake-site/components/experiencefragment","xfModelPath":"/content/experience-fragments/snowflake-site/language-masters/en/site/pushdown-banner/pushdown-banner-blank.xfmodel.json"},"experiencefragment-header":{"id":"experiencefragment-bd4f35f861","localizedFragmentVariationPath":"/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/jcr:content","configured":true,":type":"snowflake-site/components/experiencefragment","xfModelPath":"/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master.xfmodel.json","appliedCssClassNames":"snowflake-sticky-nav-host"},"experiencefragment-sub-header":{"id":"experiencefragment-d1997ae52a","localizedFragmentVariationPath":"/content/experience-fragments/snowflake-site/language-masters/en/site/sub-navigation/engineering-blog-sub-nav/jcr:content","configured":true,":type":"snowflake-site/components/experiencefragment","xfModelPath":"/content/experience-fragments/snowflake-site/language-masters/en/site/sub-navigation/engineering-blog-sub-nav.xfmodel.json"},"responsivegrid":{"columnCount":12,"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","columnClassNames":{"container_breadcrumb":"aem-GridColumn aem-GridColumn--default--12","container_main_content":"aem-GridColumn aem-GridColumn--default--12"},":items":{"container_breadcrumb":{"layout":"RESPONSIVE_GRID","columnCount":12,"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","columnClassNames":{"breadcrumb":"aem-GridColumn aem-GridColumn--default--12"},"id":"blog-page-breadcrumb-indentation",":type":"snowflake-site/components/container",":items":{"breadcrumb":{"id":"breadcrumb-5f550e02e4","breadcrumbItems":[{"title":"Blog","path":"/en/blog/engineering/","active":false},{"title":"Core Platform","path":"/en/blog/engineering/core-platform/","active":false},{"title":"Batch Inference Performance: A Cross-Platform Comparison","path":"/en/blog/engineering/snowflake-batch-inference-performance/","active":false}],":type":"snowflake-site/components/blog/breadcrumb"}},":itemsOrder":["breadcrumb"],"appliedCssClassNames":"snowflake-container"},"container_main_content":{"layout":"RESPONSIVE_GRID","columnCount":12,"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","columnClassNames":{"flexible_column_container":"aem-GridColumn aem-GridColumn--default--12","related_content":"aem-GridColumn aem-GridColumn--default--12"},"id":"main-content",":type":"snowflake-site/components/container",":items":{"flexible_column_container":{"id":"flexible-column-container-f5e6585474","propertiesId":"snowflake-blog-template-main-container","type":"2-column-60-40","alignColumns":"top","containerMaxWidth":"extra-large","topPadding":"none","bottomPadding":"none","spaceBetween":"none","reverseOnMobile":true,"carouselOnMobile":false,"backgroundImageOption":"none","flexible_column_content_container_1":{"layout":"SIMPLE","id":"container-0c589bbf74",":type":"snowflake-site/components/flexible-column-container/flexible-column-content-container",":items":{"container_hero":{"layout":"RESPONSIVE_GRID","columnCount":12,"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","columnClassNames":{"blog_hero":"aem-GridColumn aem-GridColumn--default--12"},"id":"container-9cddcdd83a",":type":"snowflake-site/components/container",":items":{"blog_hero":{"id":"blog-hero-354b5f019f","linkedInShareUrl":"https://www.linkedin.com/shareArticle?mini=true&url=https%3A%2F%2Fwww.snowflake.com%2Fcontent%2Fsnowflake-site%2Fglobal%2Fen%2Fblog%2Fengineering%2Fsnowflake-batch-inference-performance&title=Batch+Inference+Performance%3A+A+Cross-Platform+Comparison","twitterShareUrl":"https://x.com/intent/post?url=https%3A%2F%2Fwww.snowflake.com%2Fcontent%2Fsnowflake-site%2Fglobal%2Fen%2Fblog%2Fengineering%2Fsnowflake-batch-inference-performance&text=Batch+Inference+Performance%3A+A+Cross-Platform+Comparison","facebookShareUrl":"https://www.facebook.com/sharer/sharer.php?u=https%3A%2F%2Fwww.snowflake.com%2Fcontent%2Fsnowflake-site%2Fglobal%2Fen%2Fblog%2Fengineering%2Fsnowflake-batch-inference-performance","authors":[{"authorImage":{"id":"image-ac2d55c803","height":"410","src":"https://www.snowflake.com/adobe/dynamicmedia/deliver/dm-aid--99ca17f6-522c-4a05-bcfa-f00c24aa1683/kaleb-dickerson.png?preferwebp=true&quality=85","lazyEnabled":true,"width":"410",":type":"snowflake-site/components/image"},"authorCta":{"id":"button-2ceadbc281","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/blog/authors/kaleb-dickerson/"},"linkTargetContentType":"DOCUMENT_LEARN",":type":"snowflake-site/components/button","linkType":"SNOWFLAKE_INTERNAL","text":"Kaleb Dickerson"}},{"authorImage":{"id":"image-0c9c5dba05","height":"512","src":"https://www.snowflake.com/adobe/dynamicmedia/deliver/dm-aid--ba5aeadd-b3fe-4fec-9869-8185c5b9fea3/goutam-murlidhar.png?preferwebp=true&quality=85","lazyEnabled":true,"width":"512",":type":"snowflake-site/components/image"},"authorCta":{"id":"button-428fd3591a","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/blog/authors/goutam-murlidhar/"},"linkTargetContentType":"DOCUMENT_LEARN",":type":"snowflake-site/components/button","linkType":"SNOWFLAKE_INTERNAL","text":"Goutam Murlidhar"}},{"authorImage":{"id":"image-6761cff06c","height":"512","alt":"/content/snowflake-site/global/en","src":"https://www.snowflake.com/adobe/dynamicmedia/deliver/dm-aid--74b3afde-eb9b-440e-985a-252eea0fff61/jiewen-huang.png?preferwebp=true&quality=85","lazyEnabled":true,"width":"512",":type":"snowflake-site/components/image"},"authorCta":{"id":"button-229b7d6be7","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/blog/authors/jiewen-huang-/"},"linkTargetContentType":"DOCUMENT_LEARN",":type":"snowflake-site/components/button","linkType":"SNOWFLAKE_INTERNAL","text":"Jiewen Huang "}},{"authorImage":{"id":"image-c9075a8730","height":"399","src":"https://www.snowflake.com/adobe/dynamicmedia/deliver/dm-aid--10b1e6d5-b8f3-4c93-a341-da5b01ad74ac/haoran-yu.png?preferwebp=true&quality=85","lazyEnabled":true,"width":"399",":type":"snowflake-site/components/image"},"authorCta":{"id":"button-6e6004cc2d","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/blog/authors/haoran-yu/"},"linkTargetContentType":"DOCUMENT_LEARN",":type":"snowflake-site/components/button","linkType":"SNOWFLAKE_INTERNAL","text":"Haoran Yu"}}],"image":{"id":"image-5ed0be007b","height":"720","src":"https://www.snowflake.com/adobe/dynamicmedia/deliver/dm-aid--8356a77b-79b0-4938-b4c2-dc928b4ace8d/sf-eng-blog-ml-4-1.png?preferwebp=true&quality=85","lazyEnabled":true,"width":"1680",":type":"snowflake-site/components/image"},"timeToRead":"10","publicationDate":"JUL 16, 2026","tag":{"tagText":"Core Platform","tagColor":"#29B5E8"},"title":{"lines":["Batch Inference Performance: A Cross-Platform Comparison"],"type":"heading2",":type":"snowflake-site/components/title-v2"},":type":"snowflake-site/components/blog/blog-hero"}},":itemsOrder":["blog_hero"]},"responsivegrid_content":{"columnCount":12,"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","columnClassNames":{"image":"aem-GridColumn aem-GridColumn--default--12","blog_text_1921724275":"aem-GridColumn aem-GridColumn--default--12","image_454645251":"aem-GridColumn aem-GridColumn--default--12","blog_text_380694665":"aem-GridColumn aem-GridColumn--default--12","blog_text_693732955":"aem-GridColumn aem-GridColumn--default--12","blog_text_1669152516":"aem-GridColumn aem-GridColumn--default--12","blog_text_1850280362":"aem-GridColumn aem-GridColumn--default--12","blog_text_2128139327":"aem-GridColumn aem-GridColumn--default--12","blog_text_1269165093":"aem-GridColumn aem-GridColumn--default--12","code_snippet":"aem-GridColumn aem-GridColumn--default--12","image_1921274464":"aem-GridColumn aem-GridColumn--default--12","blog_text":"aem-GridColumn aem-GridColumn--default--12","blog_text_591421429":"aem-GridColumn aem-GridColumn--default--12","blog_text_217841603":"aem-GridColumn aem-GridColumn--default--12","blog_text_1342186081":"aem-GridColumn aem-GridColumn--default--12","image_1239388485":"aem-GridColumn aem-GridColumn--default--12"},"appliedCssClassNames":"snowflake-layout-container-inner-padding-small",":items":{"blog_text":{"id":"blog-text-f2965edf90","text":"\u003Cp\u003EBatch inference, while conceptually straightforward—involving the execution of a model over a data set to generate results—presents significant engineering challenges when implemented at scale. Typically, the primary bottleneck resides not within the model itself, but in the surrounding infrastructure, encompassing data movement, serialization, scheduling and resource management. These elements determine both the efficiency of the job's execution and its associated computational costs. Ultimately, maximizing throughput — defined as the volume of rows processed per second — is essential for optimizing performance and cost-efficiency.\u003C/p\u003E\r\n\u003Cp\u003E\u003Ca rel=\"noopener noreferrer\" target=\"_blank\" href=\"https://www.snowflake.com/en/blog/engineering/snowflake-batch-inference-jobs-spcs/\"\u003EBatch Inference Jobs\u003C/a\u003E in \u003Ca rel=\"noopener noreferrer\" target=\"_blank\" href=\"http://www.snowflake.com/ml\"\u003ESnowflake ML\u003C/a\u003E solves exactly that with a simple managed API:\u003C/p\u003E\r\n","richText":true,":type":"snowflake-site/components/blog/blog-text"},"code_snippet":{"id":"code-snippet-42bf75d019","language":"python","codeSnippet":"registry = Registry(session=session, database_name=DATABASE, schema_name=REGISTRY_SCHEMA)\r\nmv = registry.get_model('my_model').version('my_version')  # returns ModelVersion\r\n\r\n# how to run a batch job\r\njob = mv.run_batch(\r\n    compute_pool = \"my_compute_pool\",\r\n    X = session.table(\"my_table\"),\r\n    output_spec = OutputSpec(stage_location=\"@my_db.my_schema.my_stage/path/\"),\r\n)\r\n\r\njob.wait() # Optional: Blocking until the job finishes","multiLine":true,":type":"snowflake-site/components/code-snippet"},"blog_text_1850280362":{"id":"blog-text-18b472bef4","text":"\u003Cp\u003E&nbsp;\u003C/p\u003E\r\n\u003Cp\u003EThis solution is decoupled from traditional SQL constraints, engineered to optimize the large-scale processing of unstructured data and file-based data sets. The platform facilitates fully automated distributed execution—encompassing partitioning, scheduling, resource management and automated teardown. For inline predictions within SQL pipelines, users should use native batch inference functions, while real-time application backends should leverage \u003Ca rel=\"noopener noreferrer\" target=\"_blank\" href=\"https://docs.snowflake.com/en/developer-guide/snowflake-ml/inference/real-time-inference-rest-api\"\u003Eservice endpoints\u003C/a\u003E.\u003C/p\u003E\r\n\u003Cp\u003EWe conducted a comparative analysis of Batch Inference Jobs against Databricks Spark UDF and Amazon SageMaker Batch Transform using equivalent CPU configurations (RAM differed but was not a bottleneck; see Methodology). Our results indicate that on the tested workloads, Snowflake's \u003Ccode\u003Erun_batch()\u003C/code\u003E API delivered up to 6.5x higher throughput and up to 5.8x lower compute cost per million rows compared to SageMaker Batch Transform and Databricks Spark UDF.\u003C/p\u003E\r\n\u003Ch2\u003EWhat we tested\u003C/h2\u003E\r\n\u003Cp\u003EThe evaluation encompassed two distinct categories of models, selected to represent divergent workload profiles:\u003C/p\u003E\r\n\u003Cul\u003E\r\n\u003Cli\u003E\u003Cb\u003EStructured Models (XGBoost)\u003C/b\u003E: Characterized by structured input and output formats, these models are CPU-intensive and facilitate rapid per-row inference. The primary engineering objective involves optimizing raw throughput and ensuring the system provides data at a rate sufficient to sustain the model's processing capacity.\u003C/li\u003E\r\n\u003Cli\u003E\u003Cb\u003EEmbedding Models (Sentence Transformer)\u003C/b\u003E: These models transform unstructured text into structured embedding vectors. They are GPU-intensive and exhibit comparatively slower per-row inference. The central challenge lies in achieving and maintaining effective GPU utilization rather than mere saturation.\u003C/li\u003E\r\n\u003C/ul\u003E\r\n\u003Cp\u003EWe compared three platforms, each with a different architecture for batch inference:\u003C/p\u003E\r\n\u003Cul\u003E\r\n\u003Cli\u003E\u003Cb\u003ESnowflake Batch Inference Jobs\u003C/b\u003E — Managed batch inference on Snowpark Container Services (SPCS). Specify compute pool and model; scheduling, partitioning and teardown are handled automatically.\u003C/li\u003E\r\n\u003Cli\u003E\u003Cb\u003EDatabricks Spark UDF\u003C/b\u003E — Apply a Python UDF containing inference logic to a Spark DataFrame. Requires managing a Spark cluster and submitting a job to it.\u003C/li\u003E\r\n\u003Cli\u003E\u003Cb\u003EAmazon SageMaker Batch Transform\u003C/b\u003E — Send batched S3 payloads to a dedicated offline inference container via a SageMaker transform job.\u003C/li\u003E\r\n\u003C/ul\u003E\r\n\u003Ch2\u003EBenchmarks\u003C/h2\u003E\r\n\u003Ch3\u003EMethodology and evaluation framework\u003C/h3\u003E\r\n\u003Cul\u003E\r\n\u003Cli\u003EAll fiscal evaluations utilize public on-demand pricing models:\u003Cul\u003E\r\n\u003Cli\u003E\u003Cb\u003ESnowflake\u003C/b\u003E — SPCS compute credits per hour\u003C/li\u003E\r\n\u003Cli\u003E\u003Cb\u003EDatabricks\u003C/b\u003E — VM instance cost + Databricks Unit (DBU) markup per hour\u003C/li\u003E\r\n\u003Cli\u003E\u003Cb\u003ESageMaker\u003C/b\u003E — Hourly per-instance pricing\u003C/li\u003E\r\n\u003C/ul\u003E\r\n\u003C/li\u003E\r\n\u003Cli\u003EThe reported findings represent \u003Cb\u003Emedian values\u003C/b\u003E derived from three independent experimental iterations.\u003C/li\u003E\r\n\u003Cli\u003EXGBoost needs 10 billion rows because its near-zero cost per row requires massive volume to expose platform overhead. Conversely, the compute-bound Sentence Transformer stabilizes throughput and cost metrics at 10 million rows. Scaling embedding data sets further only increases execution time—already approximately one hour on the slowest platform—without altering per-row metrics.\u003C/li\u003E\r\n\u003Cli\u003ECPU configurations were systematically \u003Ca href=\"#pricing-reference\"\u003Estandardized across all evaluated platforms\u003C/a\u003E. RAM was not standardized as it was not a bottleneck on the specific workloads and platforms evaluated. Additionally, execution runtimes were quantified server-side to eliminate confounding variables associated with client-side latency.\u003C/li\u003E\r\n\u003Cli\u003EThe financial evaluation is strictly confined to computational resource consumption, explicitly excluding expenditures associated with data storage, orchestration, or egress operations.\u003C/li\u003E\r\n\u003C/ul\u003E\r\n\u003Ch2\u003EComparative performance analysis\u003C/h2\u003E\r\n\u003Ch3\u003EXGBoost\u003C/h3\u003E\r\n","richText":true,":type":"snowflake-site/components/blog/blog-text"},"image":{"id":"image-7fb463698c","height":"464","alt":"Figure 1: XGBoost Throughput and Cost Comparison on 10B Rows.","src":"https://www.snowflake.com/adobe/dynamicmedia/deliver/dm-aid--db5bccc2-e515-455f-b18e-5ad05c9dad8b/figure-1.-batch-inference-performance--a-cross-platform-comparison.png?preferwebp=true&quality=85","lazyEnabled":true,"width":"1009","title":"Figure 1: XGBoost Throughput and Cost Comparison on 10B Rows.",":type":"snowflake-site/components/image"},"blog_text_2128139327":{"id":"blog-text-9f8cfa0d07","text":"\u003Cp\u003E\u003Ci\u003ECost calculation included in the appendix below - \u003Ca href=\"#cost-derivations\"\u003Esection A\u003C/a\u003E\u003C/i\u003E\u003C/p\u003E\r\n","richText":true,":type":"snowflake-site/components/blog/blog-text"},"image_1239388485":{"id":"image-79711b81df","height":"473","alt":"Figure 2: Sentence Transformer Throughput and Cost Comparison on 10M Rows.","src":"https://www.snowflake.com/adobe/dynamicmedia/deliver/dm-aid--d7a36362-3ffc-4497-9d09-ca203f82a3ac/figure-2.-batch-inference-performance--a-cross-platform-comparison.png?preferwebp=true&quality=85","lazyEnabled":true,"width":"1029","title":"Figure 2: Sentence Transformer Throughput and Cost Comparison on 10M Rows.",":type":"snowflake-site/components/image"},"blog_text_1342186081":{"id":"blog-text-82875b539b","text":"\u003Cp\u003E\u003Ci\u003ECost calculation included in the appendix below - \u003Ca href=\"#cost-derivations\"\u003Esection B\u003C/a\u003E\u003C/i\u003E\u003C/p\u003E\r\n\u003Cp\u003E&nbsp;\u003C/p\u003E\r\n","richText":true,":type":"snowflake-site/components/blog/blog-text"},"blog_text_1921724275":{"id":"blog-text-218ca8c691","text":"\u003Cp\u003EThese benchmarks evaluate distinct system performance drivers. The XGBoost test, conducted at extreme scale, highlights the importance of efficient data handling: Arrow-native processing, directed acyclic graph (DAG) fusion, and optimized batching minimize overhead. Conversely, the Sentence Transformer test demonstrates that GPU utilization determines performance when compute is the primary constraint; success requires decoupling I/O from inference and sizing batches to VRAM capacity. On matched CPU configurations, Snowflake Batch Inference Jobs achieved up to 6.5x higher throughput and up to 5.8x lower compute cost per million rows in our benchmarks, compared to SageMaker Batch Transform and Databricks Spark UDF. The following analysis details these performance optimizations.\u003C/p\u003E\r\n\u003Ch2\u003EUnder the hood: What drives the performance\u003C/h2\u003E\r\n\u003Cp\u003EContinuous profiling of our batch inference execution enabled significant pipeline optimizations. We increased XGBoost throughput from 1.4M rows/s on 1B rows to 5.68M rows/s on 10B rows, primarily through the amortization of fixed startup costs. These improvements leverage the \u003Ca href=\"https://docs.ray.io/en/latest/data/data.html\" target=\"_blank\" rel=\"noopener noreferrer\"\u003ERay Data\u003C/a\u003E execution architecture, which optimizes throughput by fusing adjacent logical operators into single physical units, thereby minimizing intermediate data materialization.\u003C/p\u003E\r\n\u003Ch3\u003EDAG compression and fusion\u003C/h3\u003E\r\n\u003Cp\u003ERay Data uses operator fusion to optimize execution, though achieving maximum efficiency requires an intentionally architected DAG. To ensure an optimal streaming pipeline and prevent the introduction of materialization barriers, we employ two primary optimization techniques:\u003C/p\u003E\r\n\u003Col\u003E\r\n\u003Cli\u003E\u003Cb\u003EData Processing Consolidation\u003C/b\u003E: By performing signature normalization and column mapping directly within the actor's batch function, we eliminate standalone operators. This ensures transformations remain within the execution context, preventing fusion boundary breaks that stall the pipeline.\u003C/li\u003E\r\n\u003Cli\u003E\u003Cb\u003EResource Requirement Alignment\u003C/b\u003E: Adjacent operators must share identical resource requests (e.g., \u003Ccode\u003Enum_cpus\u003C/code\u003E). Divergent resource declarations preclude Ray from merging logical units into a single physical operator, thereby disrupting the fusion chain.\u003C/li\u003E\r\n\u003C/ol\u003E\r\n\u003Cp\u003EImplementing these methods maintains a fully fused pipeline, reducing the architecture from five stages with four object-store boundaries to three streaming stages with zero full-dataset materialization barriers.\u003C/p\u003E\r\n\u003Ch3\u003EResource tuning\u003C/h3\u003E\r\n\u003Cp\u003ERay's resource declarations function as scheduling constraints rather than strict capacity limits. To optimize performance, we implement a two-part resource management strategy:\u003C/p\u003E\r\n\u003Col\u003E\r\n\u003Cli\u003E\u003Cb\u003EMaximize I/O Concurrency\u003C/b\u003E: For I/O-bound operations (e.g., stage read/write), we declare minimal CPU requirements (e.g., \u003Ccode\u003Enum_cpus=0.01\u003C/code\u003E). This prevents the scheduler from throttling I/O, allowing full saturation of network bandwidth and continuous data availability.\u003C/li\u003E\r\n\u003Cli\u003E\u003Cb\u003EOptimize Inference Allocation\u003C/b\u003E: Inference actors require precise compute allocations to ensure efficient batch processing. Under-declaring throttles parallelism, while over-declaring risks resource contention and out-of-memory (OOM) errors. We align resource definitions with the model's actual footprint to maintain consistent throughput and prevent contention.\u003C/li\u003E\r\n\u003C/ol\u003E\r\n\u003Ch3\u003EArrow-native processing\u003C/h3\u003E\r\n\u003Cp\u003EMachine learning frameworks, such as XGBoost and Scikit-Learn, typically require inputs as Pandas DataFrames. However, a technical mismatch exists between Pandas' single-machine, in-memory orientation and Ray Data's distributed, high-throughput architecture, which utilizes \u003Ca href=\"https://arrow.apache.org/\" target=\"_blank\" rel=\"noopener noreferrer\"\u003EApache Arrow\u003C/a\u003E's columnar memory format. Automated Arrow-to-Pandas conversion—specifically via standard \u003Ccode\u003Emap_batches(batch_format=&quot;pandas&quot;)\u003C/code\u003E configurations—introduces significant overhead. Executing structural operations, such as column renaming, type casting, and subset selection, within the Pandas environment triggers redundant memory allocations and data copies.\u003C/p\u003E\r\n\u003Cp\u003ETo mitigate this, we implemented an &quot;Arrow-native&quot; approach. We perform all structural transformations within the Arrow memory space, leveraging zero-copy operations to avoid unnecessary overhead. The conversion to Pandas is deferred until the final execution step, restricted strictly to the columns required by the model.\u003C/p\u003E\r\n","richText":true,":type":"snowflake-site/components/blog/blog-text"},"image_1921274464":{"id":"image-b4ed331aea","height":"462","alt":"Figure 3: Pandas vs Arrow Inference Actor Flow.","src":"https://www.snowflake.com/adobe/dynamicmedia/deliver/dm-aid--013bbef3-c465-4346-97d7-de4ea9c1ed65/figure-3.-batch-inference-performance--a-cross-platform-comparison.png?preferwebp=true&quality=85","lazyEnabled":true,"width":"1698","title":"Figure 3: Pandas vs Arrow Inference Actor Flow.",":type":"snowflake-site/components/image"},"blog_text_693732955":{"id":"blog-text-745597447c","text":"\u003Cp\u003E&nbsp;\u003C/p\u003E\r\n\u003Cp\u003EArrow tables are metadata wrappers around independent column buffers. &quot;Concatenating&quot; two tables horizontally just creates a new metadata object whose column list points to the original buffers — no bytes move. Pandas DataFrames, by contrast, typically allocate new memory and copy column buffers into the result. For a pipeline doing millions of these merge operations, the difference compounds fast.\u003C/p\u003E\r\n\u003Ch3\u003EOptimal batch sizes\u003C/h3\u003E\r\n\u003Cp\u003EInference actors process data in batches, necessitating normalization and conversion for each subset. Amortizing the fixed overhead per batch is essential for performance; processing thousands of rows in a single batch is significantly more efficient than performing the same operations sequentially. The relationship between overhead and batch size is defined as:\u003C/p\u003E\r\n\u003Cp\u003E\u003Ci\u003ETotal Overhead\u003C/i\u003E ≈ (\u003Ci\u003ETotal Rows\u003C/i\u003E / \u003Ci\u003EBatch Size\u003C/i\u003E) × \u003Ci\u003EFixed Batch Overhead\u003C/i\u003E\u003C/p\u003E\r\n\u003Cp\u003EIncreasing the batch size reduces the total number of batches, thereby minimizing overhead. This principle applies to both data preprocessing and model inference, where larger batches improve throughput by distributing fixed costs across more rows. The primary constraint for increasing batch size is peak memory utilization (RAM and VRAM). As demonstrated in the XGBoost case study, where per-row inference latency is minimal, establishing a sufficient batch size is critical to amortize platform overhead effectively.\u003C/p\u003E\r\n","richText":true,":type":"snowflake-site/components/blog/blog-text"},"image_454645251":{"id":"image-c1cd389ca1","height":"468","alt":"Figure 4: Inference Actor Time Breakdown","src":"https://www.snowflake.com/adobe/dynamicmedia/deliver/dm-aid--4d09a79b-57f7-453a-9d5e-9aad4ba10b58/figure-4.-batch-inference-performance-a-cross-platform-comparison.png?preferwebp=true&quality=85","lazyEnabled":true,"width":"1954","title":"Figure 4: Inference Actor Time Breakdown",":type":"snowflake-site/components/image"},"blog_text_380694665":{"id":"blog-text-89844998da","text":"\u003Cp\u003E\u003Ci\u003E1B XGBoost rows, eight replicas, five workers. Same workload — only batch size changes. Read/write time is excluded.\u003C/i\u003E\u003C/p\u003E\r\n\u003Cp\u003E&nbsp;\u003C/p\u003E\r\n\u003Cp\u003EAt a batch size of 1,024, Inference Actor execution time is predominantly consumed by pre- and post-processing rather than model inference. Scaling to a batch size of 16,384 prioritizes inference compute, maximizing throughput. However, throughput gains eventually plateau as memory consumption scales linearly.\u003C/p\u003E\r\n\u003Cp\u003EOptimal batch sizing is inherently workload-dependent. Structured models, characterized by minimal per-row footprints, accommodate large batch sizes. Conversely, GPU-accelerated models (e.g., embedding, vision) are constrained by activation memory and token limits, necessitating moderate batching.\u003C/p\u003E\r\n","richText":true,":type":"snowflake-site/components/blog/blog-text"},"blog_text_1669152516":{"id":"blog-text-84367588e7","text":"\u003Ctable\u003E\r\n\u003Cthead\u003E\u003Ctr\u003E\u003Cth\u003EModel Type\u003C/th\u003E\r\n\u003Cth\u003EBatch Size\u003C/th\u003E\r\n\u003Cth\u003EOrder of Magnitude\u003C/th\u003E\r\n\u003C/tr\u003E\u003C/thead\u003E\u003Ctbody\u003E\u003Ctr\u003E\u003Ctd\u003EStructured\u003C/td\u003E\r\n\u003Ctd\u003ELarger\u003C/td\u003E\r\n\u003Ctd\u003E10k-50k rows\u003C/td\u003E\r\n\u003C/tr\u003E\u003Ctr\u003E\u003Ctd\u003EUnstructured\u003C/td\u003E\r\n\u003Ctd\u003ESmaller\u003C/td\u003E\r\n\u003Ctd\u003E1k-10k rows\u003C/td\u003E\r\n\u003C/tr\u003E\u003C/tbody\u003E\u003C/table\u003E\r\n","richText":true,":type":"snowflake-site/components/blog/blog-text"},"blog_text_217841603":{"id":"blog-text-96e9e22795","text":"\u003Cp\u003E\u003Cb\u003ETable 1: Optimal batch sizes by Model Type\u003C/b\u003E\u003C/p\u003E\r\n\u003Ch3\u003ECombined effect\u003C/h3\u003E\r\n\u003Cp\u003EThe platform achieves superior throughput through four integrated optimizations that are designed to eliminate processing bottlenecks:\u003C/p\u003E\r\n\u003Cul\u003E\r\n\u003Cli\u003E\u003Cb\u003EDAG Fusion\u003C/b\u003E: Merges logical operators into a single physical execution unit, eliminating intermediate materialization barriers and preventing pipeline stalls.\u003C/li\u003E\r\n\u003Cli\u003E\u003Cb\u003EResource Tuning\u003C/b\u003E: Decouples I/O from inference requirements, enabling concurrent execution without artificial scheduler throttling.\u003C/li\u003E\r\n\u003Cli\u003E\u003Cb\u003EArrow-Native Processing\u003C/b\u003E: Leverages Apache Arrow to perform structural transformations via zero-copy operations, significantly reducing invocation overhead compared to Pandas-based workflows.\u003C/li\u003E\r\n\u003Cli\u003E\u003Cb\u003EOptimal Batch Sizing\u003C/b\u003E: Amortizes fixed execution costs by increasing batch sizes to maximize compute utilization, reducing the total number of required actor invocations.\u003C/li\u003E\r\n\u003C/ul\u003E\r\n\u003Cp\u003EThe benchmarks reported above include all four optimizations, and we continue to profile and push throughput further.\u003C/p\u003E\r\n\u003Ch2\u003EGet started\u003C/h2\u003E\r\n\u003Cp\u003ETo implement batch inference workloads in \u003Ca href=\"http://www.snowflake.com/ml\" target=\"_blank\" rel=\"noopener noreferrer\"\u003ESnowflake ML\u003C/a\u003E, consult the \u003Ca href=\"https://docs.snowflake.com/en/developer-guide/snowflake-ml/inference/batch-inference-jobs\" target=\"_blank\" rel=\"noopener noreferrer\"\u003EBatch Inference Jobs documentation\u003C/a\u003E. Configure the \u003Ccode\u003Erun_batch\u003C/code\u003E operation by specifying the target model and compute pool; the platform manages the remaining infrastructure. To begin, execute the benchmarks using our reference notebooks: \u003Ca href=\"https://github.com/Snowflake-Labs/sf-samples/blob/main/samples/ml/model_serving/batch_inference_benchmarking/run_batch_xgboost_10b.ipynb\" target=\"_blank\" rel=\"noopener noreferrer\"\u003EXGBoost\u003C/a\u003E and \u003Ca href=\"https://github.com/Snowflake-Labs/sf-samples/blob/main/samples/ml/model_serving/batch_inference_benchmarking/run_batch_st_10m.ipynb\" target=\"_blank\" rel=\"noopener noreferrer\"\u003ESentence Transformer\u003C/a\u003E.\u003C/p\u003E\r\n\u003Ch2\u003EAppendix\u003C/h2\u003E\r\n\u003Ch3 id=\"pricing-reference\"\u003EPricing reference\u003C/h3\u003E\r\n\u003Cp\u003EAll costs use public on-demand pricing. Credit-to-dollar conversion: \u003Ccode\u003E$2.36/credit\u003C/code\u003E.\u003C/p\u003E\r\n","richText":true,":type":"snowflake-site/components/blog/blog-text"},"blog_text_591421429":{"id":"blog-text-25c1b8683e","text":"\u003Ctable\u003E\r\n\u003Cthead\u003E\u003Ctr\u003E\u003Cth\u003EBenchmark\u003C/th\u003E\r\n\u003Cth\u003EPlatform\u003C/th\u003E\r\n\u003Cth\u003EInstance Type\u003C/th\u003E\r\n\u003Cth\u003ENodes\u003C/th\u003E\r\n\u003Cth\u003EHourly Rate\u003C/th\u003E\r\n\u003C/tr\u003E\u003C/thead\u003E\u003Ctbody\u003E\u003Ctr\u003E\u003Ctd\u003EXGBoost\u003C/td\u003E\r\n\u003Ctd\u003ESnowflake\u003C/td\u003E\r\n\u003Ctd\u003ECPU_X64_M (4 of 6 vCPU, 28 GiB)\u003C/td\u003E\r\n\u003Ctd\u003E8\u003C/td\u003E\r\n\u003Ctd\u003E0.22 credits/node\u003C/td\u003E\r\n\u003C/tr\u003E\u003Ctr\u003E\u003Ctd\u003EXGBoost\u003C/td\u003E\r\n\u003Ctd\u003EDatabricks\u003C/td\u003E\r\n\u003Ctd\u003EStandard_D4ds_v5 (4 vCPU, 16 GiB)\u003C/td\u003E\r\n\u003Ctd\u003E8\u003C/td\u003E\r\n\u003Ctd\u003E$0.376/node\u003C/td\u003E\r\n\u003C/tr\u003E\u003Ctr\u003E\u003Ctd\u003EXGBoost\u003C/td\u003E\r\n\u003Ctd\u003ESageMaker\u003C/td\u003E\r\n\u003Ctd\u003Eml.m5.xlarge (4 vCPU, 16 GiB)\u003C/td\u003E\r\n\u003Ctd\u003E8\u003C/td\u003E\r\n\u003Ctd\u003E$0.23/node\u003C/td\u003E\r\n\u003C/tr\u003E\u003Ctr\u003E\u003Ctd\u003ESentence Transformer\u003C/td\u003E\r\n\u003Ctd\u003ESnowflake\u003C/td\u003E\r\n\u003Ctd\u003EGPU_NV_XS (T4, 16 GiB GPU)\u003C/td\u003E\r\n\u003Ctd\u003E2\u003C/td\u003E\r\n\u003Ctd\u003E0.25 credits/node\u003C/td\u003E\r\n\u003C/tr\u003E\u003Ctr\u003E\u003Ctd\u003ESentence Transformer\u003C/td\u003E\r\n\u003Ctd\u003EDatabricks\u003C/td\u003E\r\n\u003Ctd\u003EStandard_NC4as_T4_v3 (T4, 16 GiB GPU)\u003C/td\u003E\r\n\u003Ctd\u003E2\u003C/td\u003E\r\n\u003Ctd\u003E$0.676/node\u003C/td\u003E\r\n\u003C/tr\u003E\u003Ctr\u003E\u003Ctd\u003ESentence Transformer\u003C/td\u003E\r\n\u003Ctd\u003ESageMaker\u003C/td\u003E\r\n\u003Ctd\u003Eml.g4dn.xlarge (T4, 16 GiB GPU)\u003C/td\u003E\r\n\u003Ctd\u003E2\u003C/td\u003E\r\n\u003Ctd\u003E$0.7364/node\u003C/td\u003E\r\n\u003C/tr\u003E\u003C/tbody\u003E\u003C/table\u003E\r\n","richText":true,":type":"snowflake-site/components/blog/blog-text"},"blog_text_1269165093":{"id":"blog-text-f3840330aa","text":"\u003Ch3\u003E\u003Cb\u003ETable 2: Hardware and Rates\u003C/b\u003E\u003C/h3\u003E\r\n\u003Ch3 id=\"cost-derivations\"\u003ECost derivations\u003C/h3\u003E\r\n\u003Col\u003E\r\n\u003Cli\u003EXGBoost comparison\u003Col\u003E\r\n\u003Cli\u003E\u003Cb\u003ESnowflake:\u003C/b\u003E \u003Ccode\u003E8 nodes × 0.22 credits/hr × 4/6 × 1,759.37s / 3,600 = 0.573 credits\u003C/code\u003E; at \u003Ccode\u003E$2.36/credit\u003C/code\u003E → \u003Ccode\u003E$1.35\u003C/code\u003E total. We limited each node to 4 of its 6 available vCPUs to match the 4-vCPU instances used by SageMaker and Databricks. Cost is prorated accordingly (4/6).\u003C/li\u003E\r\n\u003Cli\u003E\u003Cb\u003ESageMaker:\u003C/b\u003E \u003Ccode\u003E8 × $0.23/hr × 11,520.95s / 3,600\u003C/code\u003E → \u003Ccode\u003E$5.89\u003C/code\u003E total.\u003C/li\u003E\r\n\u003Cli\u003E\u003Cb\u003EDatabricks:\u003C/b\u003E \u003Ccode\u003E8 × $0.376/hr × 2,460.39s / 3,600\u003C/code\u003E → \u003Ccode\u003E$2.06\u003C/code\u003E total.\u003C/li\u003E\r\n\u003C/ol\u003E\r\n\u003C/li\u003E\r\n\u003Cli\u003ESentence Transformer comparison\u003Col\u003E\r\n\u003Cli\u003E\u003Cb\u003ESnowflake:\u003C/b\u003E \u003Ccode\u003E2 nodes × 0.25 credits/hr × 792.58s / 3,600 = 0.110 credits\u003C/code\u003E; at \u003Ccode\u003E$2.36/credit\u003C/code\u003E → \u003Ccode\u003E$0.26\u003C/code\u003E total.\u003C/li\u003E\r\n\u003Cli\u003E\u003Cb\u003ESageMaker:\u003C/b\u003E \u003Ccode\u003E2 × $0.7364/hr × 3,670.82s / 3,600\u003C/code\u003E → \u003Ccode\u003E$1.50\u003C/code\u003E total.\u003C/li\u003E\r\n\u003Cli\u003E\u003Cb\u003EDatabricks:\u003C/b\u003E \u003Ccode\u003E2 × $0.676/hr × 1,319.26s / 3,600\u003C/code\u003E → \u003Ccode\u003E$0.50\u003C/code\u003E total.\u003C/li\u003E\r\n\u003C/ol\u003E\r\n\u003C/li\u003E\r\n\u003C/ol\u003E\r\n","richText":true,":type":"snowflake-site/components/blog/blog-text"}},":itemsOrder":["blog_text","code_snippet","blog_text_1850280362","image","blog_text_2128139327","image_1239388485","blog_text_1342186081","blog_text_1921724275","image_1921274464","blog_text_693732955","image_454645251","blog_text_380694665","blog_text_1669152516","blog_text_217841603","blog_text_591421429","blog_text_1269165093"],":type":"wcm/foundation/components/responsivegrid"},"responsivegrid_premium_content_banner":{"columnCount":12,"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","columnClassNames":{},"appliedCssClassNames":"snowflake-responsive-component-top-padding-medium",":items":{},":itemsOrder":[],":type":"wcm/foundation/components/responsivegrid"},"container_author_chip":{"layout":"RESPONSIVE_GRID","columnCount":12,"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","columnClassNames":{"author_chip":"aem-GridColumn aem-GridColumn--default--12"},"id":"container-ba9b748392",":type":"snowflake-site/components/container",":items":{"author_chip":{"id":"author-chip-0901c4a423","title":{"id":"title","type":"heading2","lines":["Learn more about the authors"],":type":"snowflake-site/components/title-v2"},"authors":[{"authorImage":{"id":"image-ac2d55c803","height":"410","src":"https://www.snowflake.com/adobe/dynamicmedia/deliver/dm-aid--99ca17f6-522c-4a05-bcfa-f00c24aa1683/kaleb-dickerson.png?preferwebp=true&quality=85","lazyEnabled":true,"width":"410",":type":"snowflake-site/components/image"},"authorCta":{"id":"button-2ceadbc281","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/blog/authors/kaleb-dickerson/"},"linkTargetContentType":"DOCUMENT_LEARN",":type":"snowflake-site/components/button","linkType":"SNOWFLAKE_INTERNAL","text":"Kaleb Dickerson"},"authorTitle":"Software Engineer"},{"authorImage":{"id":"image-0c9c5dba05","height":"512","src":"https://www.snowflake.com/adobe/dynamicmedia/deliver/dm-aid--ba5aeadd-b3fe-4fec-9869-8185c5b9fea3/goutam-murlidhar.png?preferwebp=true&quality=85","lazyEnabled":true,"width":"512",":type":"snowflake-site/components/image"},"authorCta":{"id":"button-428fd3591a","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/blog/authors/goutam-murlidhar/"},"linkTargetContentType":"DOCUMENT_LEARN",":type":"snowflake-site/components/button","linkType":"SNOWFLAKE_INTERNAL","text":"Goutam Murlidhar"},"authorTitle":"Senior Software Engineer"},{"authorImage":{"id":"image-6761cff06c","height":"512","alt":"/content/snowflake-site/global/en","src":"https://www.snowflake.com/adobe/dynamicmedia/deliver/dm-aid--74b3afde-eb9b-440e-985a-252eea0fff61/jiewen-huang.png?preferwebp=true&quality=85","lazyEnabled":true,"width":"512",":type":"snowflake-site/components/image"},"authorCta":{"id":"button-229b7d6be7","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/blog/authors/jiewen-huang-/"},"linkTargetContentType":"DOCUMENT_LEARN",":type":"snowflake-site/components/button","linkType":"SNOWFLAKE_INTERNAL","text":"Jiewen Huang "},"authorTitle":"Staff Software Engineer"},{"authorImage":{"id":"image-c9075a8730","height":"399","src":"https://www.snowflake.com/adobe/dynamicmedia/deliver/dm-aid--10b1e6d5-b8f3-4c93-a341-da5b01ad74ac/haoran-yu.png?preferwebp=true&quality=85","lazyEnabled":true,"width":"399",":type":"snowflake-site/components/image"},"authorCta":{"id":"button-6e6004cc2d","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/blog/authors/haoran-yu/"},"linkTargetContentType":"DOCUMENT_LEARN",":type":"snowflake-site/components/button","linkType":"SNOWFLAKE_INTERNAL","text":"Haoran Yu"},"authorTitle":"Software Engineer"}],":type":"snowflake-site/components/blog/author-chip"}},":itemsOrder":["author_chip"],"appliedCssClassNames":"snowflake-responsive-component-top-padding-medium"}},":itemsOrder":["container_hero","responsivegrid_content","responsivegrid_premium_content_banner","container_author_chip"]},"flexible_column_content_container_2":{"layout":"SIMPLE","id":"container-dbe8cfa5e7",":type":"snowflake-site/components/flexible-column-container/flexible-column-content-container",":items":{"blog_table_of_content":{"id":"blog-table-of-content-44f133edb0",":type":"snowflake-site/components/blog/blog-table-of-content","tableOfContents":[]}},":itemsOrder":["blog_table_of_content"]},":type":"snowflake-site/components/flexible-column-container","isBlogPage":true,"isActiveTOC":false},"related_content":{"id":"related-content-78f16890a2","relatedContent":[],":type":"snowflake-site/components/blog/related-content","isBlogPage":true}},":itemsOrder":["flexible_column_container","related_content"],"appliedCssClassNames":"snowflake-container"}},":itemsOrder":["container_breadcrumb","container_main_content"],":type":"wcm/foundation/components/responsivegrid"},"container_47873732":{"additionalClasses":"section--blog-newsletter","layout":"RESPONSIVE_GRID","columnCount":12,"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","columnClassNames":{"flexible_column_cont":"aem-GridColumn aem-GridColumn--default--12"},"id":"container-c346cdf629",":type":"snowflake-site/components/container",":items":{"flexible_column_cont":{"id":"flexible-column-container-72fbc7ac5e","type":"1-column","alignColumns":"top","containerMaxWidth":"extra-large","topPadding":"small","bottomPadding":"none","spaceBetween":"small","reverseOnMobile":false,"carouselOnMobile":false,"propertiesCSSClasses":"section--blog-newsletter","backgroundImageOption":"none","flexible_column_content_container_1":{"layout":"SIMPLE","id":"container-147fb7d587",":type":"snowflake-site/components/flexible-column-container/flexible-column-content-container",":items":{"marketo_v2":{"id":"marketo-v2-5371a153e7","marketoForm":{"hidden":null,"edit":false,"formId":"3320","successUrl":null,"script":null,"values":null},"title":{"id":"title","type":"heading3","lines":["Subscribe to our blog newsletter","Get the best, coolest and latest delivered to your inbox each week"],":type":"snowflake-site/components/title-v2"},"munchkinId":"252-RFO-227","serverInstance":"252-RFO-227.mktoweb.com","formConfigured":true,"marketoConfigured":true,":type":"snowflake-site/components/form/marketo-v2"},"text":{"id":"text-9fda966a1e","additionalClasses":"newsletter-disclaimer","text":"\u003Cp\u003EBy submitting this form, I understand Snowflake will process my personal information in accordance with their Privacy Notice.\u003C/p\u003E\r\n","richText":true,":type":"snowflake-site/components/text"}},":itemsOrder":["marketo_v2","text"]},":type":"snowflake-site/components/flexible-column-container","isBlogPage":true,"isActiveTOC":false}},":itemsOrder":["flexible_column_cont"],"appliedCssClassNames":"snowflake-container"},"experiencefragment-pre-footer":{"id":"experiencefragment-12267b214a","localizedFragmentVariationPath":"/content/experience-fragments/snowflake-site/language-masters/en/site/get-started-pre-footer/get-started-pre-footer/jcr:content","configured":true,":type":"snowflake-site/components/experiencefragment","xfModelPath":"/content/experience-fragments/snowflake-site/language-masters/en/site/get-started-pre-footer/get-started-pre-footer.xfmodel.json"},"markup_editor":{"id":"markup-editor-0c592db22d","title":"Page CSS","cssContent":"@media screen and (min-width:768px){.snowflake-blog-author-chip-wrapper{justify-content:flex-start}.snowflake-blog-related-content-on-blog-page{max-width:1408px;margin-left:auto;margin-right:auto}.snowflake-text{font-family:Lato,sans-serif;font-weight:400;font-size:16px;line-height:24px}}.section--blog-newsletter{max-width:none;width:100%;padding-left:0;padding-right:0;margin-left:0;margin-right:0;margin-bottom:0}.section--blog-newsletter .mktoField{background-color:transparent !important}.section--blog-newsletter\u003E.container{padding-left:0;padding-right:0}@media screen and (min-width:768px){.section--blog-newsletter\u003E.container{padding-left:0;padding-right:0}}.newsletter-disclaimer p{font-size:14px !important}.section--blog-newsletter .snowflake-marketo-form-container{margin-bottom:24px;background-color:#f6f9fa;gap:48px;box-shadow:none}.section--blog-newsletter .snowflake-title p.snowflake-title-line:first-child{font-family:Texta;font-size:24px;line-height:26px;font-weight:700;margin-bottom:4px}.section--blog-newsletter .snowflake-title p.snowflake-title-line{text-transform:none;font-family:\"Lato\",sans-serif;font-size:16px;line-height:24px;font-weight:normal}@media screen and (min-width:1024px){.section--blog-newsletter .snowflake-marketo-form-container{display:flex;justify-content:center}.section--blog-newsletter .snowflake-title .snowflake-title-line{text-align:left}.section--blog-newsletter .snowflake-marketo-form .mktoFormRow:has(\u003E input[type=\"hidden\"]){flex-grow:0}.section--blog-newsletter .snowflake-marketo-form{display:flex;width:50% !important}.section--blog-newsletter .snowflake-marketo-form .mktoButtonRow{flex-grow:0;width:auto !important;margin-left:0;margin-right:0}.section--blog-newsletter .snowflake-marketo-form .mktoFormRow{flex-grow:1}.section--blog-newsletter\u003E.container{padding-left:0;padding-right:0}.section--blog-newsletter .snowflake-marketo-form-title{width:50%;margin-bottom:0 !important}.section--blog-newsletter .center .snowflake-title{align-items:flex-start}}.snowflake-sub-navigation a.snowflake-sub-navigation-primary-link{width:auto !important}.snowflake-blog-hero{align-items:stretch !important}",":type":"snowflake-site/components/markup-editor","isGSAPEnabled":false},"markup_editor-table":{"id":"markup-editor-28e268c020","title":"Table Styling CSS","cssContent":"#snowflake-blog-template-main-container table{width:100%;background-color:var(--ui-background-01);border-collapse:collapse;border:2px solid var(--ui-background-09);font-family:'Lato',sans-serif;color:var(--ui-background-09)}#snowflake-blog-template-main-container table thead{background-color:var(--ui-01)}#snowflake-blog-template-main-container table th,#snowflake-blog-template-main-container table td{border:2px solid var(--ui-background-09);padding:var(--spacing-01)}",":type":"snowflake-site/components/markup-editor","isGSAPEnabled":false},"experiencefragment-footer":{"id":"experiencefragment-54b5aee020","localizedFragmentVariationPath":"/content/experience-fragments/snowflake-site/language-masters/en/site/footer/master/jcr:content","configured":true,":type":"snowflake-site/components/experiencefragment","xfModelPath":"/content/experience-fragments/snowflake-site/language-masters/en/site/footer/master.xfmodel.json"}},":itemsOrder":["experiencefragment-banner","experiencefragment-header","experiencefragment-sub-header","responsivegrid","container_47873732","experiencefragment-pre-footer","markup_editor","markup_editor-table","experiencefragment-footer"],":type":"wcm/foundation/components/responsivegrid"}},":itemsOrder":["root"],":path":"/content/snowflake-site/global/en/blog/engineering/snowflake-batch-inference-performance",":hierarchyType":"page","isPasswordProtected":false,"analyticsContentTags":["snowflake-site:taxonomy/blog/engineering-blog/data-engineering","snowflake-site:taxonomy/blog/engineering-blog/core-platform"],"analyticsEnabled":true,"coveoConfig":{"pipeline":"snowflake.com","apiKey":"xx335921a6-2a0a-40f2-a167-e390b4766c3d","organizationId":"snowflakecomputingproduction8neljofn","searchHub":"snowflake.com"},"analyticsDebugMode":false,"analyticsData":{"excludeFromAnalytics":false,"subCategory":"","pageType":"homepage","templateName":"blog-page","siteName":"snowflake","pageUrl":"/content/snowflake-site/global/en/blog/engineering/snowflake-batch-inference-performance","language":"en","category":"general","pageName":"Batch Inference Performance: A Cross-Platform Comparison","contentTags":["snowflake-site:taxonomy/blog/engineering-blog/data-engineering","snowflake-site:taxonomy/blog/engineering-blog/core-platform"]},"locale":"en"}
  