CINXE.COM
Recommender System Framework | NVIDIA Developer | NVIDIA Developer
<!DOCTYPE html> <html lang='en' class='h-100'> <head> <meta name="viewport" content="width=device-width,initial-scale=1"> <meta name="csrf-param" content="authenticity_token" /> <meta name="csrf-token" content="q-0KXrHvzioLwfzzFrUhmsfx9RMN2fOq58P85ZUrndJjeLlBL1bScielTjVJnh13GNcOU7rlVe0yOGGRTwy9VQ" /> <meta name="csp-nonce" /> <title>Recommender System Framework | NVIDIA Developer | NVIDIA Developer</title> <meta name="description" content="NVIDIA Merlin lets you build high-performance recommender systems at scale."> <meta name="keywords" content="merlin, recommender systems, recommender workflow, nvidia"> <link rel="canonical" href="https://developer.nvidia.com/merlin"> <link rel="alternate" href="https://developer.nvidia.com/merlin" hreflang="x-default"> <link rel="alternate" href="https://developer.nvidia.com/merlin" hreflang="en-us"> <link rel="alternate" href="https://developer.nvidia.cn/merlin" hreflang="zh-cn"> <meta property="og:site_name" content="NVIDIA Developer"> <meta property="og:title" content="Merlin Recommender System Framework"> <meta property="og:description" content="Build high-performing recommender systems at scale."> <meta property="og:type" content="website"> <meta property="og:image" content="https://d29g4g2dyqv443.cloudfront.net/sites/default/files/akamai/merlin/og-nvidia-merlin-1200x630.jpg"> <meta property="og:url" content="https://developer.nvidia.com/merlin"> <meta name="twitter:title" content="NVIDIA Merlin Recommender System Framework"> <meta name="twitter:description" content="Built on NVIDIA AI, Merlin empowers data scientists, machine learning engineers, and researchers to build high-performing recommenders at scale."> <meta name="twitter:image" content="https://d29g4g2dyqv443.cloudfront.net/sites/default/files/akamai/merlin/og-nvidia-merlin-1200x630.jpg"> <meta name="twitter:site" content="@NVIDIA"> <meta name="twitter:card" content="summary_large_image"> <meta name="twitter:creator" content="@NVIDIA"> <meta property="interest" content="Recommenders / Personalization"> <link rel="stylesheet" href="https://dirms4qsy6412.cloudfront.net/assets/application-1e91adb0e814253f53c7a621169b6daa7cc975f97befa1c8f1a2ffe493719eb1.css" media="all" /> <link rel="stylesheet" href="https://dirms4qsy6412.cloudfront.net/assets/one-trust-bea625cf16a072ce5fdb0707a19f2645daf63c05eb1a016db72773eba008fc07.css" /> <script src="https://cdn.cookielaw.org/scripttemplates/otSDKStub.js" data-document-language="true" type="text/javascript" charset="UTF-8" data-domain-script="3e2b62ff-7ae7-4ac5-87c8-d5949ecafff5"></script> <script src="https://dirms4qsy6412.cloudfront.net/assets/onetrust-overrides-v2-9d7d1399c432d702a5bf32a31067737e10c123fdbe5ffef8ae83a34cf2d680ee.js"></script> <script> function OptanonWrapper() { let event = new Event('bannerLoaded'); window.dispatchEvent(event); if (window.OnetrustActiveGroups && window.OnetrustActiveGroups.includes("C0002")) { window.DD_RUM && window.DD_RUM.init({ clientToken: 'pub0430c74fae5d2b467bcb8d48b13e5b32', applicationId: '9fc963c7-14e6-403d-bdec-ee671550bb7f', site: 'datadoghq.com', service: 'devzone', env: 'production', version: '', sessionSampleRate: 10, sessionReplaySampleRate: 5, trackUserInteractions: true, trackResources: true, trackLongTasks: true, defaultPrivacyLevel: 'mask-user-input', }); } } </script> <link rel="preload" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css" as="style" type="text/css"> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css" /> <link rel="stylesheet" href="https://dirms4qsy6412.cloudfront.net/assets/devzone3/vars-cd3a0769a3c2f2d9ea6b83ac53ce86bceef4c719e4dbd22ed41d48d01f200901.css" media="all" /> <link rel="stylesheet" href="https://dirms4qsy6412.cloudfront.net/assets/devzone3/new/application-18e41529317cec7a71ff11ed11f560691cd0843420e9cb6082d8cf8ce8fc638c.css" media="all" /> <link rel="stylesheet" href="https://dirms4qsy6412.cloudfront.net/assets/feed-aggregator/feed-aggregator-9ace7521871242143cb35fa86d5be702c4dacb409600041fa6a5b14fa2a71dde.css" media="all" /> <link rel="stylesheet" href="https://dirms4qsy6412.cloudfront.net/assets/twentytwenty/css/twentytwenty-4ef2ccd719d09a97572e93c499c1fb11cc971d2a3519cfe105dcff2be92f65b9.css" media="all" /> <script src="https://dirms4qsy6412.cloudfront.net/assets/horizontal-chart/d3.v4.min-41cfecdf7c41476e805de7afacf4aacdd1a4be6947fbecf95217e947ebc2faf5.js"></script> <script src="https://dirms4qsy6412.cloudfront.net/assets/horizontal-chart/visualize-d-06443fdef48364af6635f0d1d3535da26910671f6f6a680c531eff0e54ed595f.js"></script> <link rel="stylesheet" href="https://dirms4qsy6412.cloudfront.net/assets/sf-validation/sf-validation-805362e079494cd052f713be5f91a44eb602f545c342f794abbd4a8050c0acb3.css" /> <script src="https://assets.adobedtm.com/5d4962a43b79/c1061d2c5e7b/launch-191c2462b890.min.js" data-ot-ignore="true"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.3/jquery.min.js" integrity="sha512-STof4xm1wgkfm7heWqFJVn58Hm3EtS31XFaagaa8VMReCXAkQnJZ+jEy8PCC/iT18dFy95WcExNHFTqLyp72eQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script> <script src="https://api-prod.nvidia.com/search/nvidia-gallery-widget.js"></script> <script src="https://dirms4qsy6412.cloudfront.net/assets/devzone3/modules/nvidia_editor/nod_widgets-8c38a7d04ed3c3acd9117aa126bf76d7902d3c57c72b76dbf3c281c96ed09975.js"></script> <link rel="icon" type="image/x-icon" href="https://dirms4qsy6412.cloudfront.net/assets/favicon-81bff16cada05fcff11e5711f7e6212bdc2e0a32ee57cd640a8cf66c87a6cbe6.ico" /> </head> <body class='d-flex flex-column h-100' data-theme='devzone3_new'> <div id='header'></div> <main class="main-content dz3-main-section dz-new-theme page-merlin page-merlin" data-id="1028"> <div id="join-nvd-banner" class="text-white" style="background: rgba(0, 0, 0, 0) linear-gradient(rgb(153, 153, 153) 0%, rgb(102, 102, 102) 100%) repeat scroll 0% 0%; padding: 1em ; color: white;"> <div class="container"> <div class="col-12 text-center" style="text-align: center;"> Join Netflix, Fidelity, and NVIDIA to learn best practices for building, training, and deploying modern recommender systems. <a target="_blank" href="https://info.nvidia.com/recsys-at-work-best-practices-and-insights.html" class="cta--prim"> Register Free</a> </div> </div> </div> <section class="sct--xs txt-cntr"> <div class="cntnr--cozy"> <h1 class="h--large txt-clr--blck txt-cntr">NVIDIA Merlin</h1> <p class="content-l txt-cntr">NVIDIA Merlin™ is an open-source framework for building high-performing recommender systems at scale.</p> <center><a target="_blank" href="https://github.com/NVIDIA-Merlin/Merlin" class="cta--prim cta--l cta-row--cntr">Get Started</a></center> </div> <br> <br> <div class="cntnr--narrow"> <h2 class="h--medium txt-clr--blck">Designed for Recommender Workflows</h2> <p class=""><a href="https://github.com/NVIDIA-Merlin/Merlin" target="_blank">NVIDIA Merlin</a> empowers data scientists, machine learning engineers, and researchers to build high-performing recommenders at scale. Merlin includes libraries, methods, and tools that streamline the building of recommenders by addressing common preprocessing, feature engineering, training, inference, and deploying to production challenges. Merlin components and capabilities are optimized to support the retrieval, filtering, scoring, and ordering of hundreds of terabytes of data, all accessible through easy-to-use APIs. With Merlin, better predictions, increased click-through rates, and faster deployment to production are within reach.</p> <center><img style="width:80%;" alt="Diagram illustrating detailed components Recommender Workflows" title="Diagram illustrating detailed components Recommender Workflows" class="img-responsive" src="https://d29g4g2dyqv443.cloudfront.net/sites/default/files/akamai/merlin-detailed-diagram-850x480.jpg"></center> </div> </section> <hr> <section class="sct--xs "> <div class="cntnr--narrow txt-cntr"> <h2 class="h--medium txt-clr--blck">Interoperable Solution</h2> <p class=""><a target="_blank" href="https://github.com/NVIDIA-Merlin/Merlin">NVIDIA Merlin</a>, as part of NVIDIA AI, advances our commitment to support innovative practitioners doing their best work. NVIDIA Merlin components are designed to be interoperable within existing recommender workflows that utilize data science, machine learning (ML), and deep learning (DL) on CPUs or GPUs. Data scientists, ML engineers, and researchers are able to use single or multiple components, or libraries, to accelerate the entire recommender pipeline—from ingesting, training, inference, to deploying to production. NVIDIA Merlin's open-source components simplify building and deploying a production-quality pipeline. </p> <br> </div> <div class="cntnr--narrow"> <div class="row"> <div class="col-lg-4 col-md-4 txt-cntr"> <h3 class="h--smaller txt-clr--blck txt-cntr">Merlin Models</h3> <p class=""><a href="https://github.com/NVIDIA-Merlin/models">Merlin Models</a> is a library that provides standard models for recommender systems and high quality implementations from ML to more advanced DL models on CPUs and GPUs. Train models for retrieval and ranking within 10 lines of code. </p> <div> <strong><p class=" txt-cntr">Try it today:</p></strong> <p class=" txt-cntr"><a target="_blank" href="https://github.com/NVIDIA-Merlin/models">GitHub</a></p> </div> </div> <div class="col-lg-4 col-md-4 txt-cntr"> <h3 class="h--smaller txt-clr--blck txt-cntr">Merlin NVTabular</h3> <p class=""><a href="/merlin/nvtabular">Merlin NVTabular</a> is a feature engineering and preprocessing library designed to effectively manipulate terabytes of recommender system datasets and significantly reduce data preparation time.</p> <div> <strong><p class=" txt-cntr">Try it today:</p></strong> <p class=" txt-cntr"><a target="_blank" href="http://www.github.com/nvidia/NVTabular">GitHub</a> | <a target="_blank" href="https://anaconda.org/nvidia/nvtabular"> Anaconda</a></p> </div> </div> <div class="col-lg-4 col-md-4 txt-cntr"> <h3 class="h--smaller txt-clr--blck txt-cntr">Merlin HugeCTR</h3> <p class=""><a target="_blank" href="http://www.developer.nvidia.com/merlin/hugectr">Merlin HugeCTR</a> is a deep neural network framework designed for recommender systems on GPUs. It provides distributed model-parallel training and inference with hierarchical memory for maximum performance and scalability.</p> <div> <strong><p class=" txt-cntr">Try it today:</p></strong> <p class=" txt-cntr"><a target="_blank" href="https://github.com/NVIDIA/HugeCTR">GitHub</a> | <a target="_blank" href="https://catalog.ngc.nvidia.com/containers?filters=&orderBy=dateModifiedDESC&query=Merlin">NGC™</a></p> </div> </div> </div> <div class="row"> <div class="col-lg-4 col-md-4 txt-cntr"> <h3 class="h--smaller txt-clr--blck txt-cntr">Merlin Transformers4Rec</h3> <p class=""><a target="_blank" href="https://github.com/NVIDIA-Merlin/Transformers4Rec">Merlin Transformers4Rec</a> is a library that streamlines the building of pipelines for session-based recommendations. The library makes it easier to explore and apply popular transformers architectures when building recommenders. </p> <div> <strong><p class=" txt-cntr">Try it today:</p></strong> <p class=" txt-cntr"><a target="_blank" href="https://github.com/NVIDIA-Merlin/Transformers4Rec">GitHub</a> | <a target="_blank" href="https://anaconda.org/nvidia/transformers4rec">Anaconda</a></p> </div> </div> <div class="col-lg-4 col-md-4 txt-cntr"> <h3 class="h--smaller txt-clr--blck txt-cntr">Merlin Distributed Training</h3> <p class="">Merlin provides support for distributed training across multiple GPUs. Components include <a target="_blank" href="https://github.com/NVIDIA-Merlin/HugeCTR/tree/master/sparse_operation_kit">Merlin SOK (SparseOperationsKit)</a> and <a target="_blank" href="https://github.com/NVIDIA-Merlin/distributed-embeddings">Merlin Distributed Embeddings (DE)</a>. TensorFlow (TF) users are empowered to use SOK (TF 1.x) and DE (TF 2.x) to leverage model parallelism to scale training. </p> <div> <strong><p class=" txt-cntr">Try it today:</p></strong> <p class=" txt-cntr"><a target="_blank" href="https://github.com/NVIDIA-Merlin/Merlin">GitHub</a></p> </div> </div> <div class="col-lg-4 col-md-4 txt-cntr"> <h3 class="h--smaller txt-clr--blck txt-cntr">Merlin Systems</h3> <p class=""><a target="_blank" href="https://github.com/NVIDIA-Merlin/systems">Merlin Systems</a> is a library that eases new model and workflow deployment to production. It enables ML engineers and operations to deploy an end-to-end recommender pipeline with 50 lines of code. </p> <div> <strong><p class=" txt-cntr">Try it today:</p></strong> <p class=" txt-cntr"><a target="_blank" href="https://github.com/NVIDIA-Merlin/systems">GitHub</a></p> </div> </div> </div> </div> </section> <section class="sct--xs "> <div class="cntnr--narrow "> <h2 class="h--medium txt-clr--blck txt-cntr">Built on NVIDIA AI</h2> <p class=" txt-cntr">NVIDIA AI empowers millions of hands-on practitioners and thousands of companies to use the NVIDIA AI Platform to accelerate their workloads. <a target="_blank" href="https://github.com/NVIDIA-Merlin/Merlin">NVIDIA Merlin</a>, is part of the NVIDIA AI Platform. NVIDIA Merlin was built upon and leverages additional NVIDIA AI software within the platform.</p> <div class="row"> <div class="col-md-4"> <h3 class="h--smaller txt-clr--blck txt-cntr">RAPIDS</h3> <p class="txt-cntr">RAPIDS is an open-source suite of GPU-accelerated python libraries, enhancing performance and speed across data science and analytics pipelines entirely on GPUs.</p> <div> <strong><p class=" txt-cntr">Try it today:</p></strong> <p class=" txt-cntr"><a target="_blank" href="https://github.com/rapidsai">GitHub</a></p> </div> </div> <div class="col-md-4"> <h3 class="h--smaller txt-clr--blck txt-cntr">cuDF</h3> <p class="txt-cntr">cuDF i is a Python GPU DataFrame library for loading, joining, aggregating, filtering, and manipulating data. </p> <div> <strong><p class=" txt-cntr">Try it today:</p></strong> <p class=" txt-cntr"><a target="_blank" href="https://github.com/rapidsai/cudf">GitHub</a></p> </div> </div> <div class="col-md-4"> <h3 class="h--smaller txt-clr--blck txt-cntr">NVIDIA Triton Inference Server</h3> <p class="txt-cntr">Take advantage of NVIDIA Triton™ Inference Server to run inference efficiently on GPUs by maximizing throughput with the right combination of latency and GPU utilization.</p> <div> <strong><p class=" txt-cntr">Try it today:</p></strong> <p class=" txt-cntr"><a target="_blank" href="https://github.com/triton-inference-server/server">GitHub</a></p> </div> </div> </div> </div> </section> <section class="sct--xs "> <div class="cntnr--narrow "> <h2 class="h--medium txt-cntr">Production Readiness with NVIDIA AI Enterprise</h2> <div class="row"> <div class="col-md-6"> <p>NVIDIA AI Enterprise accelerates enterprises to the leading edge of AI with enterprise-grade security, stability, manageability, and support while mitigating the potential risks of open source software.</p> <ul class="fa-ul"> <li><span class="fa-li"><i class="far fa-angle-right fa-fw"></i></span>Secure, end-to-end AI software platform</li> <li><span class="fa-li"><i class="far fa-angle-right fa-fw"></i></span>API compatibility for AI application lifecycle management</li> <li><span class="fa-li"><i class="far fa-angle-right fa-fw"></i></span>Management software for workloads and infrastructure</li> <li><span class="fa-li"><i class="far fa-angle-right fa-fw"></i></span>Broad industry ecosystem certifications</li> <li><span class="fa-li"><i class="far fa-angle-right fa-fw"></i></span>Technical support and access to NVIDIA AI experts</li> </ul> <br> <a target="_blank" href="https://www.nvidia.com/en-us/data-center/products/ai-enterprise-suite/support/" class="cta--prim">Learn More </a> </div> <div class="col-md-6"> <center><img alt="Get Enterprise technical support for NVIDIA Merlin" title="Get Enterprise technical support for NVIDIA Merlin" class="img-responsive" src="https://developer.download.nvidia.com/images/Enterprise-Support-for-NVIDIA-Merlin.jpg"></center> </div> </div> </div> </section> <section class="sct--xs sct--lt-gry2"> <div class="cntnr--narrow txt-cntr"> <h2 class="h--medium txt-clr--blck">Resources</h2> </div> <div class="cntnr--narrow"> <div class="row"> <div class="col-md-3"> <div class="card"> <div class="card-cntnt-cntnr"> <div> <h3 class="h--smallest txt-clr--blck">Recommender Systems, Not Just Recommender Models</h3> <p class="">Learn about the 4 stages of recommender systems pattern that covers the majority of modern recommenders today.</p> </div> <a target="_blank" class="cta--tert mt-auto" href="https://medium.com/nvidia-merlin/recommender-systems-not-just-recommender-models-485c161c755e">Read now <span class="fas fa-angle-right fa-fw"></span></a> </div> </div> </div> <div class="col-md-3"> <div class="card"> <div class="card-cntnt-cntnr"> <div> <h3 class="h--smallest txt-clr--blck">GTC Spring 2022 Keynote: NVIDIA Merlin</h3> <p class="">Watch as NVIDIA CEO Jensen Huang discusses how recommenders personalize the internet and highlights NVIDIA Merlin use cases from Snap and Tencent's WeChat.</p> </div> <a target="_blank" class="cta--tert mt-auto" href="https://youtu.be/39ubNuxnrK8?t=1345">Watch now <span class="fas fa-angle-right fa-fw"></span></a> </div> </div> </div> <div class="col-md-3"> <div class="card"> <div class="card-cntnt-cntnr"> <div> <h3 class="h--smallest txt-clr--blck">Optimizing ML Platform with NVIDIA Merlin</h3> <p class="">Discover how Meituan optimizes their ML Platform using NVIDIA Merlin.</p> </div> <a target="_blank" class="cta--tert mt-auto" href="https://medium.com/nvidia-merlin/optimizing-meituans-machine-learning-platform-an-interview-with-jun-huang-7e046143131f">Read now <span class="fas fa-angle-right fa-fw"></span></a> </div> </div> </div> <div class="col-md-3"> <div class="card"> <div class="card-cntnt-cntnr"> <div> <h3 class="h--smallest txt-clr--blck">Next Gen Recommenders with Grace Hopper</h3> <p class="">Learn more about Grace Hopper Superchip and how it provides more memory and greater efficiency for recommender workloads.</p> </div> <a target="_blank" class="cta--tert mt-auto" href="https://blogs.nvidia.com/blog/2022/09/20/grace-hopper-recommender-systems/">Read now <span class="fas fa-angle-right fa-fw"></span></a> </div> </div> </div> </div> <br> <a class="cta--tert cta--cntr justify-content-center" href="https://resources.nvidia.com/l/en-us-merlin">Explore Merlin resources <span class="fas fa-angle-right fa-fw"></span> </a> </div> </section> <section class="sct--xs sct--drk-gry4"> <div class="cntnr--cozy"> <p class="content-l text-white txt-cntr">Take this survey to share some information about your recommender pipeline and influence the NVIDIA Merlin roadmap.</p> <center><a class="cta--prim" href="/merlin-devzone-survey" role="button" target="blank">Submit Feedback</a></center> <br> </div> </section> <script> document.addEventListener('DOMContentLoaded', () => { const allLinks = document.querySelectorAll('.dz3-main-section.dz-new-theme a'); allLinks.forEach((link) => { let hasIcon = link.querySelector('span.fas'); if(hasIcon) { link.classList.add('has-cta-icon'); } }); }); </script> </main> <div id='footer' class='mt-auto'></div> <script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" crossorigin="anonymous"></script> <script src="https://dirms4qsy6412.cloudfront.net/assets/devzone3/new/popper.min-a9eb3f3101919a18965114cfdcd0138652ec03b2b58cfb26806f9a256564c858.js"></script> <script src="https://dirms4qsy6412.cloudfront.net/assets/feed-aggregator/feed-aggregator-7f147443abc2d1300a239c29e4ba3ca0d0d2eb0dc66b608765e2b3be50e18e10.js"></script> <script src="https://dirms4qsy6412.cloudfront.net/assets/devzone3/new/dist/dz3-new-bundle-11f473650a558402a2733b7bb4d6133e28814892ec0527381c9144f3499b8d60.js"></script> <script src="https://dirms4qsy6412.cloudfront.net/assets/twentytwenty/js/jquery.event.move-16041d2e384b513c1b202af51fc404a0643b8c38ff823bb4326520ad5a82b761.js"></script> <script src="https://dirms4qsy6412.cloudfront.net/assets/twentytwenty/js/jquery.twentytwenty-835622257095d5bd0719a5484d68213ccc8708a321dd3deded777d1e6623b499.js"></script> <script> const template = document.createElement('template'); template.innerHTML = ` <style> @import "https://dirms4qsy6412.cloudfront.net/assets/feed-aggregator/feed-aggregator-9ace7521871242143cb35fa86d5be702c4dacb409600041fa6a5b14fa2a71dde.css"; .feed-aggregator-component .card { box-shadow: 0 4px 5px 0 rgba(0,0,0,0.14), 0 1px 10px 0 rgba(0,0,0,0.12), 0 2px 4px -1px rgba(0,0,0,0.3) !important; } .feed-aggregator-component .card:hover { box-shadow: 0 0 8px 0 rgba(0,0,0,0.13), 0 14px 32px 5px rgba(0,0,0,0.13) !important; } </style> <div class="feed-aggregator-component"></div> `; const hosts = { 'en': 'https://developer.nvidia.com/blog', 'cn': 'https://developer.nvidia.com/zh-cn/blog', } class FeedAggregatorElement extends HTMLElement { constructor() { super(); this._shadowRoot = this.attachShadow({ 'mode': 'open' }); this._shadowRoot.appendChild(template.content.cloneNode(true)); } connectedCallback() { const categories = this.getAttribute('categories'); const tags = this.getAttribute('tags'); const perPage = this.getAttribute('per-page'); const excludedTags = this.getAttribute('excluded-tags'); let locale = this.getAttribute('locale'); if (!locale) { locale = 'en'; } let targetElement = this._shadowRoot.querySelector(".feed-aggregator-component"); let feed = { id: 'blog', host: hosts[locale], type: 'json', minCount: 2, }; if (categories && categories !== 'all') { feed['category_ids'] = categories.split(','); } if (tags && tags !== 'all') { feed['tag_ids'] = tags.split(','); } if(excludedTags && excludedTags !== 'null'){ feed['excluded_tag_ids'] = excludedTags.split(','); } document.addEventListener("DOMContentLoaded", function () { new FeedAggregator({ target: targetElement, props: { count: perPage, openInNewTab: true, showExcerpts: true, feeds: [feed] } }); }) } } window.customElements.define('feed-aggregator', FeedAggregatorElement); </script> <template id='application-button-template'> <style> @import "https://dirms4qsy6412.cloudfront.net/assets/application-button/application-button-68ca7e1e3aa49ec79169d49226e34ee0c341d27a15a38b28ce975cb2467e123e.css"; </style> <a href='' class='nvidia-application-button'>Join now</a> </template> <script> async function fetchMembershipState () { const userInfo = await fetch('/api/user'); const {status} = userInfo; if (status === 401) { let error = new Error('Unauthorized'); error.statusCode = status; throw error; } // TODO: Figure out how to get DZ4 program // Fetch page info. const {pathname} = location; const pageInfo = await fetch(`${pathname}.json`); const pageData = await pageInfo.json(); // Fetch membership info return pageData; } const initApplicationButton = (element) => { const linkElement = element.querySelector('a'); fetchMembershipState() .then(data => { console.log(data); }) .catch(error => { switch (error.statusCode) { default: linkElement.innerHTML = 'Login'; linkElement.href = '/login'; } }); }; class NvidiaApplicationButton extends HTMLElement { constructor() { const template = document.getElementById('application-button-template'); super(); this._shadowRoot = this.attachShadow({ 'mode': 'open' }); this._shadowRoot.appendChild(template.content.cloneNode(true)); } connectedCallback() { const element = this._shadowRoot; document.addEventListener('DOMContentLoaded', () => { initApplicationButton(element); }); } } window.customElements.define('nv-application-button', NvidiaApplicationButton); </script> <template id='application-text-template'> <p></p> </template> <script> class NvidiaApplicationText extends HTMLElement { constructor() { const template = document.getElementById('application-text-template'); super(); this._shadowRoot = this.attachShadow({ 'mode': 'open' }); this._shadowRoot.appendChild(template.content.cloneNode(true)); } connectedCallback() { } } window.customElements.define('nv-application-text', NvidiaApplicationText); </script> <template id='nv-sf-form-validator-template'> <script src="https://dirms4qsy6412.cloudfront.net/assets/sf-validation/moment-620a5949fff0ad37198f07464b91d7b7c110ecdb6f94ca90ca7d2e1b471f1da8.js"></script> <script src="https://dirms4qsy6412.cloudfront.net/assets/sf-validation/validate.min-2160a65c1b5d4a5966544ad25af8fe99f11c636a99c516fee6c7afd3b1f21409.js"></script> <p></p> </template> <script> class NvidiaSalesforceValidator extends HTMLElement { constructor() { const template = document.getElementById('nv-sf-form-validator-template'); super(); this._shadowRoot = this.attachShadow({'mode': 'open'}); this._shadowRoot.appendChild(template.content.cloneNode(true)); } initComponent() { if (!window.sfv) { return; } validate.extend(validate.validators.datetime, { parse: function (value, options) { if (moment(value, options.format, true).isValid()) { return +moment.utc(value); } }, format: function (value, options) { var format = options.dateOnly ? "MM/DD/YYYY" : "MM/DD/YYYY hh:mm"; return moment.utc(value).format(format); } }); function showErrors(errors) { $.each(errors, function (index, element) { $('input[name="' + errors[index]['attribute'] + '"]').each(function (i, e) { var errorMessage = errors[index]['options']['message']; $('<div class="js-validation-errors">' + errorMessage + '</div>').insertAfter(e); }).focus(); }); } function isValidForm(form, constraints) { var errors = validate(form, constraints, {format: "detailed"}); if (errors) { showErrors(errors); return false; } return true; } $.each(window.sfv, function (index, element) { $(element.target).on('click', function (event) { $('.js-validation-errors').remove(); if (!isValidForm(element.form, element.constraints)) { event.preventDefault(); } }); }); } connectedCallback() { document.addEventListener('DOMContentLoaded', () => { this.initComponent(); }); } } window.customElements.define('nv-sf-form-validator', NvidiaSalesforceValidator); </script> <script src="https://dirms4qsy6412.cloudfront.net/assets/horizontal-chart/d3.v4.min-41cfecdf7c41476e805de7afacf4aacdd1a4be6947fbecf95217e947ebc2faf5.js"></script> <script src="https://dirms4qsy6412.cloudfront.net/assets/horizontal-chart/visualize-d-06443fdef48364af6635f0d1d3535da26910671f6f6a680c531eff0e54ed595f.js"></script> <template id="chart-template"> <style> @import "https://dirms4qsy6412.cloudfront.net/assets/devzone3/modules/nvidia_tokens/nvidia-charts-a459e90d273ab4f8b282e0f5fef607074b5fc7cbb5f8d0f0e378281320e6b9c8.css"; </style> <div class="horizontal-chart-component"> <div class="chart-container"> <h4 class="chart-title"></h4> <p class="chart-subtitle"></p> <div class="legend"></div> <svg data-nvidia-chart="true" data-chart-legend=""></svg> <p class="chart-footnote"></p> </div> </div> </template> <script> function chartInit(element) { const chart = element.querySelector('svg[data-nvidia-chart]'); const isRendered = chart.getAttribute("data-rendered"); if (isRendered) { return; } const svgChart = d3.select(chart); const bars = JSON.parse(chart.dataset['chartBars']); const ticks = JSON.parse(chart.dataset['chartTicks']); const xAxisLabel = chart.dataset['xAxisLabel']; const barPadding = chart.dataset['barPadding']; const milestone = null; const isGrouped = chart.dataset['isGrouped'] === 'true'; if (isGrouped) { const legend = JSON.parse(chart.dataset['chartLegend']); createGroupedHorizontalBarChart(svgChart, bars, barPadding, legend, ticks, milestone, xAxisLabel, false); } else { createHorizontalBarChart(svgChart, bars, barPadding, ticks, xAxisLabel, "", false); } chart.dataset['rendered'] = 'true'; } $('a[data-toggle="tab"]').on("click", function (event) { setTimeout(() => { // Triggering 'resize' event to redraw charts. window.dispatchEvent(new Event('resize')); const target = jQuery(event.target).parents('.nav.nav-tabs').siblings('.tab-content').find('.tab-pane.active'); if (target.length > 0) { const svg = jQuery(target).find('horizontal-chart'); if (svg.length) { svg.each((idx, el) => { setTimeout(function () { const chartContainer = el._shadowRoot.querySelector('.chart-container'); chartInit(chartContainer); }, 300); }); } } }, 50); }); async function loadFileSource(url) { try{ const response = await fetch(url); return response.json(); }catch (e) { console.warn(`Failed to load chart data. URL: ${url}`); } return {}; } class HorizontalChartElement extends HTMLElement { constructor() { const horizontalCharTemplate = document.getElementById('chart-template'); super(); this._shadowRoot = this.attachShadow({ 'mode': 'open' }); this._shadowRoot.appendChild(horizontalCharTemplate.content.cloneNode(true)); } connectedCallback() { const url = this.getAttribute('source'); const element = this._shadowRoot; document.addEventListener("DOMContentLoaded", function () { loadFileSource(url).then(data => { const { chartTitle: title, chartSubtitle: subTitle, chartFootnote: footNote, chartId: id, isGrouped: isGrouped, legendData, barPadding, xAxisLabel, bars, ticks } = data; element.querySelector('.chart-title').innerHTML = title; // Subtitle if (subTitle) { element.querySelector('.chart-subtitle').innerHTML = subTitle; } else { element.querySelector('.chart-subtitle').remove(); } // Chart const svgElement = element.querySelector('.chart-container svg'); svgElement.id = id; const dataAttributes = [ ['isGrouped', isGrouped ? 'true' : 'false', ''], ['chartLegend', JSON.stringify(legendData), ''], ['xAxisLabel', xAxisLabel, ''], ['barPadding', barPadding, 5], ['chartBars', bars, ''], ['chartTicks', ticks, ''], ]; dataAttributes.forEach(dataAttribute => { if (dataAttribute[0] === 'chartBars' && dataAttribute[1]) { dataAttribute[1] = JSON.stringify(dataAttribute[1]); } if (dataAttribute[0] === 'chartTicks' && dataAttribute[1]) { dataAttribute[1] = JSON.stringify(dataAttribute[1]); } svgElement.dataset[dataAttribute[0]] = dataAttribute[1] ? dataAttribute[1] : dataAttribute[2]; }); // Caption if (footNote) { element.querySelector('.chart-footnote').innerHTML = footNote; } else { element.querySelector('.chart-footnote').remove(); } // Init chart const chartContainer = element.querySelector('.chart-container'); setTimeout(function () { if (jQuery(chartContainer).is(':visible')) { chartInit(chartContainer); } }, 300); }); }) } } window.customElements.define('horizontal-chart', HorizontalChartElement); </script> <script src="https://dirms4qsy6412.cloudfront.net/assets/nv-developer-menu-09b6a95e79b8d8d44b0f1ac794e39d5adac82391d128f6d4d39715826a860020.js"></script> <script> let menuLocale = 'en'; if (menuLocale == 'en') { menuLocale = 'en-US'; } function mountHeader(data = false) { let options = { baseURL: window.location.origin, signedIn: false, locale: menuLocale }; if (data) { options.secondaryMenu = data; } options.showMembershipCardLink = true; new NVDeveloperHeader({ target: document.getElementById('header'), props: options }); } function mountFooter(data = false) { let options = { menu: data, locale: menuLocale }; new NVDeveloperFooter({ target: document.getElementById('footer'), props: options }); } let url = 'd29g4g2dyqv443.cloudfront.net'; let headerMenuURL = "https://d29g4g2dyqv443.cloudfront.net/menu/en-US/header-secondary.json"; fetch(headerMenuURL) .then(response => response.json()) .then(data => { mountHeader(data); }) .catch((error) => { mountHeader(); window.nv.tracing.addError('menu', error); }); fetch(`https://${url}/menu/${menuLocale}/footer.json`) .then(response => response.json()) .then(data => { mountFooter(data); }) .catch((error) => { mountFooter(); window.nv.tracing.addError('menu', error); }); </script> <script src="https://www.datadoghq-browser-agent.com/us1/v5/datadog-rum.js"></script> <script> let silentAuthHost = 'www.nvidia.com'; let crossOriginPageUrl = `https://${silentAuthHost}/auth/hints/`; function readHint() { return new Promise((resolve) => { const { origin: targetOrigin } = new URL(crossOriginPageUrl); const iframe = document.createElement('iframe'); iframe.hidden = true; iframe.src = crossOriginPageUrl; function responseHandler(event) { if (event.origin === targetOrigin) { iframe.parentNode.removeChild(iframe); return resolve(event.data); } } window.addEventListener('message', responseHandler, { once: true }); iframe.onload = () => { iframe.contentWindow.postMessage({ type: 'read' }, targetOrigin); } document.body.appendChild(iframe); }); } function writeHint(login_hint, idp_id, timestamp, sub) { const { origin: targetOrigin } = new URL(crossOriginPageUrl); const iframe = document.createElement('iframe'); iframe.hidden = true; iframe.src = crossOriginPageUrl; iframe.onload = () => { const message = { type: 'write', login_hint, idp_id, timestamp, sub }; iframe.contentWindow.postMessage(message, targetOrigin); } document.body.appendChild(iframe); } function deleteHint() { const { origin: targetOrigin } = new URL(crossOriginPageUrl); const iframe = document.createElement('iframe'); iframe.hidden = true; iframe.src = crossOriginPageUrl; iframe.onload = () => { iframe.contentWindow.postMessage({ type: 'delete' }, targetOrigin); } document.body.appendChild(iframe); } </script> <script>_satellite.pageBottom();</script> <script src="https://dirms4qsy6412.cloudfront.net/packs/js/runtime-503119e3bfeec75056bc.js" defer="defer"></script> <script src="https://dirms4qsy6412.cloudfront.net/packs/js/692-70104789368a40f2d231.js" defer="defer"></script> <script src="https://dirms4qsy6412.cloudfront.net/packs/js/341-3761d2892158034dde54.js" defer="defer"></script> <script src="https://dirms4qsy6412.cloudfront.net/packs/js/798-8f26177f1189c7399fb3.js" defer="defer"></script> <script src="https://dirms4qsy6412.cloudfront.net/packs/js/866-f9c34b19d1b60b883caf.js" defer="defer"></script> <script src="https://dirms4qsy6412.cloudfront.net/packs/js/311-033b6299b51897e65419.js" defer="defer"></script> <script src="https://dirms4qsy6412.cloudfront.net/packs/js/252-f83b27d9f72fef366bc7.js" defer="defer"></script> <script src="https://dirms4qsy6412.cloudfront.net/packs/js/367-0b2e82a8016bebbc82b5.js" defer="defer"></script> <script src="https://dirms4qsy6412.cloudfront.net/packs/js/900-34f3bf570904cbfb5a16.js" defer="defer"></script> <script src="https://dirms4qsy6412.cloudfront.net/packs/js/application-54bf18784eb1ee5cdece.js" defer="defer"></script> <script src="https://dirms4qsy6412.cloudfront.net/packs/js/ls_track-4ba11c63b23b3f4ff0d5.js" defer="defer"></script> </body> </html>