<!doctype html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Cradicle Explorer</title>
    <link href="/css/bootstrap/bootstrap.min.css" rel="stylesheet">
    <style>
      .form-control-dark::placeholder {
          color: #aaa;
          opacity: 1;
      }
    </style>
    <link rel="stylesheet" href="/assets/fontawesome/css/all.min.css">
    <link rel="icon" type="image/png" href="/favicon.png">


                <link href="/css/dashboard.css" rel="stylesheet">
                </head>
                <body>
                <header class="navbar navbar-dark sticky-top bg-dark flex-md-nowrap p-0 shadow">
                  <a class="navbar-brand col-md-3 col-lg-2 me-0 px-3 fs-6" href="/">Cradicle Explorer</a>
                  <button class="navbar-toggler position-absolute d-md-none collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#sidebarMenu" aria-controls="sidebarMenu" aria-expanded="false" aria-label="Toggle navigation">
                    <span class="navbar-toggler-icon"></span>
                  </button>
                  <form method="get" action="/cgi-bin/main" style="width:100%;"><input class="form-control form-control-dark w-100 rounded-0 border-0" type="text" name="q" placeholder="Search repos" aria-label="Search"></form>
                  <div class="navbar-nav flex-row">
                    <div class="nav-item text-nowrap">
                      <a class="nav-link px-3 active" href="/cgi-bin/repo?id=zRsveVqCLDcpQAGuBoGDd2STTMvY">ai-llm-monitoring_mlflow</a>
                    </div>
                  </div>
                </header>
                <div class="container-fluid">
                  <div class="row">
                    <nav id="sidebarMenu" class="col-md-3 col-lg-2 d-md-block bg-dark sidebar collapse">
                      <div class="position-sticky pt-3 sidebar-sticky">
                        <ul class="nav flex-column">
                          <li class="nav-item">
                            <a class="nav-link" href="/cgi-bin/repo?id=zRsveVqCLDcpQAGuBoGDd2STTMvY">
                              <i class="align-text-bottom fa-solid fa-info"></i>
                              Info
                            </a>
                          </li>
                          <li class="nav-item">
                            <a class="nav-link" href="/cgi-bin/repo?id=zRsveVqCLDcpQAGuBoGDd2STTMvY&issue=list">
                              <i class="align-text-bottom fa-solid fa-layer-group"></i>
                              Issues
                            </a>
                          </li>
                          <li class="nav-item">
                            <a class="nav-link" href="/cgi-bin/repo?id=zRsveVqCLDcpQAGuBoGDd2STTMvY&patch=list">
                              <i class="align-text-bottom fa-solid fa-vest-patches"></i>
                              Patches
                            </a>
                          </li>
                          <li class="nav-item">
                            <a class="nav-link" href="/cgi-bin/repo?id=zRsveVqCLDcpQAGuBoGDd2STTMvY&wallet=list">
                              <i class="align-text-bottom fa-solid fa-wallet"></i>
                              Wallets
                            </a>
                          </li>
                          <li class="nav-item">
                            <a class="nav-link active" href="/cgi-bin/repo?id=zRsveVqCLDcpQAGuBoGDd2STTMvY&source=.">
                              <i class="align-text-bottom fa-solid fa-code"></i>
                              Source
                            </a>
                          </li>
                        <h6 class="sidebar-heading d-flex justify-content-between align-items-center px-3 mt-4 mb-1 text-muted text-uppercase">
                          <span></span>
                        </h6>
                        <ul class="nav flex-column mb-2">
                        
    <h6 class="sidebar-heading d-flex justify-content-between align-items-center px-3 mt-1 mb-1 text-muted text-uppercase">
      <span>Source</span>
    </h6>
    <li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=zRsveVqCLDcpQAGuBoGDd2STTMvY&source=.claude"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> .claude</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=zRsveVqCLDcpQAGuBoGDd2STTMvY&source=.github"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> .github</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=zRsveVqCLDcpQAGuBoGDd2STTMvY&source=.vscode"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> .vscode</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=zRsveVqCLDcpQAGuBoGDd2STTMvY&source=assets"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> assets</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=zRsveVqCLDcpQAGuBoGDd2STTMvY&source=bin"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> bin</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=zRsveVqCLDcpQAGuBoGDd2STTMvY&source=changelogs"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> changelogs</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=zRsveVqCLDcpQAGuBoGDd2STTMvY&source=dev"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> dev</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=zRsveVqCLDcpQAGuBoGDd2STTMvY&source=docker-compose"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> docker-compose</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=zRsveVqCLDcpQAGuBoGDd2STTMvY&source=docker"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> docker</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=zRsveVqCLDcpQAGuBoGDd2STTMvY&source=docs"><i class="fa-solid fa-folder-open" style="color:#f0c040;"></i> docs</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=zRsveVqCLDcpQAGuBoGDd2STTMvY&source=docs%2Fapi_reference"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> api_reference</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=zRsveVqCLDcpQAGuBoGDd2STTMvY&source=docs%2Fdocs"><i class="fa-solid fa-folder-open" style="color:#f0c040;"></i> docs</a></li><li><a class="nav-link py-0" style="padding-left:48px;" href="/cgi-bin/repo?id=zRsveVqCLDcpQAGuBoGDd2STTMvY&source=docs%2Fdocs%2Fclassic-ml"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> classic-ml</a></li><li><a class="nav-link py-0" style="padding-left:48px;" href="/cgi-bin/repo?id=zRsveVqCLDcpQAGuBoGDd2STTMvY&source=docs%2Fdocs%2Fcommunity"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> community</a></li><li><a class="nav-link py-0" style="padding-left:48px;" href="/cgi-bin/repo?id=zRsveVqCLDcpQAGuBoGDd2STTMvY&source=docs%2Fdocs%2Fgenai"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> genai</a></li><li><a class="nav-link py-0" style="padding-left:48px;" href="/cgi-bin/repo?id=zRsveVqCLDcpQAGuBoGDd2STTMvY&source=docs%2Fdocs%2Fprompts"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> prompts</a></li><li><a class="nav-link py-0" style="padding-left:48px;" href="/cgi-bin/repo?id=zRsveVqCLDcpQAGuBoGDd2STTMvY&source=docs%2Fdocs%2Fquickstart_drilldown"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> quickstart_drilldown</a></li><li><a class="nav-link py-0" style="padding-left:48px;" href="/cgi-bin/repo?id=zRsveVqCLDcpQAGuBoGDd2STTMvY&source=docs%2Fdocs%2Fself-hosting"><i class="fa-solid fa-folder-open" style="color:#f0c040;"></i> self-hosting</a></li><li><a class="nav-link py-0" style="padding-left:64px;" href="/cgi-bin/repo?id=zRsveVqCLDcpQAGuBoGDd2STTMvY&source=docs%2Fdocs%2Fself-hosting%2Farchitecture"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> architecture</a></li><li><a class="nav-link py-0" style="padding-left:64px;" href="/cgi-bin/repo?id=zRsveVqCLDcpQAGuBoGDd2STTMvY&source=docs%2Fdocs%2Fself-hosting%2Fdeploy-to-cloud"><i class="fa-solid fa-folder-open" style="color:#f0c040;"></i> deploy-to-cloud</a></li><li><a class="nav-link py-0" style="padding-left:80px;" href="/cgi-bin/repo?id=zRsveVqCLDcpQAGuBoGDd2STTMvY&file=docs%2Fdocs%2Fself-hosting%2Fdeploy-to-cloud%2Faws.mdx"><i class="fa-solid fa-file" style="color:#888;"></i> aws.mdx</a></li><li><a class="nav-link py-0" style="padding-left:80px;" href="/cgi-bin/repo?id=zRsveVqCLDcpQAGuBoGDd2STTMvY&file=docs%2Fdocs%2Fself-hosting%2Fdeploy-to-cloud%2Fazure.mdx"><i class="fa-solid fa-file" style="color:#888;"></i> azure.mdx</a></li><li><a class="nav-link py-0 active" style="padding-left:80px;" href="/cgi-bin/repo?id=zRsveVqCLDcpQAGuBoGDd2STTMvY&file=docs%2Fdocs%2Fself-hosting%2Fdeploy-to-cloud%2Fgcp.mdx"><i class="fa-solid fa-file" style="color:#888;"></i> gcp.mdx</a></li><li><a class="nav-link py-0" style="padding-left:80px;" href="/cgi-bin/repo?id=zRsveVqCLDcpQAGuBoGDd2STTMvY&file=docs%2Fdocs%2Fself-hosting%2Fdeploy-to-cloud%2Findex.mdx"><i class="fa-solid fa-file" style="color:#888;"></i> index.mdx</a></li><li><a class="nav-link py-0" style="padding-left:64px;" href="/cgi-bin/repo?id=zRsveVqCLDcpQAGuBoGDd2STTMvY&source=docs%2Fdocs%2Fself-hosting%2Fsecurity"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> security</a></li><li><a class="nav-link py-0" style="padding-left:64px;" href="/cgi-bin/repo?id=zRsveVqCLDcpQAGuBoGDd2STTMvY&source=docs%2Fdocs%2Fself-hosting%2Fwebhooks"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> webhooks</a></li><li><a class="nav-link py-0" style="padding-left:64px;" href="/cgi-bin/repo?id=zRsveVqCLDcpQAGuBoGDd2STTMvY&source=docs%2Fdocs%2Fself-hosting%2Fworkspaces"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> workspaces</a></li><li><a class="nav-link py-0" style="padding-left:64px;" href="/cgi-bin/repo?id=zRsveVqCLDcpQAGuBoGDd2STTMvY&file=docs%2Fdocs%2Fself-hosting%2Findex.mdx"><i class="fa-solid fa-file" style="color:#888;"></i> index.mdx</a></li><li><a class="nav-link py-0" style="padding-left:64px;" href="/cgi-bin/repo?id=zRsveVqCLDcpQAGuBoGDd2STTMvY&file=docs%2Fdocs%2Fself-hosting%2Fmigrate-from-file-store.mdx"><i class="fa-solid fa-file" style="color:#888;"></i> migrate-from-file-store.mdx</a></li><li><a class="nav-link py-0" style="padding-left:64px;" href="/cgi-bin/repo?id=zRsveVqCLDcpQAGuBoGDd2STTMvY&file=docs%2Fdocs%2Fself-hosting%2Fmigration.mdx"><i class="fa-solid fa-file" style="color:#888;"></i> migration.mdx</a></li><li><a class="nav-link py-0" style="padding-left:64px;" href="/cgi-bin/repo?id=zRsveVqCLDcpQAGuBoGDd2STTMvY&file=docs%2Fdocs%2Fself-hosting%2Ftroubleshooting.mdx"><i class="fa-solid fa-file" style="color:#888;"></i> troubleshooting.mdx</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=zRsveVqCLDcpQAGuBoGDd2STTMvY&source=docs%2Feslint-plugin-mlflow-docs"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> eslint-plugin-mlflow-docs</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=zRsveVqCLDcpQAGuBoGDd2STTMvY&source=docs%2Fscripts"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> scripts</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=zRsveVqCLDcpQAGuBoGDd2STTMvY&source=docs%2Fsrc"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> src</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=zRsveVqCLDcpQAGuBoGDd2STTMvY&source=docs%2Fstatic"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> static</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=zRsveVqCLDcpQAGuBoGDd2STTMvY&file=docs%2F.npmrc"><i class="fa-solid fa-file" style="color:#888;"></i> .npmrc</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=zRsveVqCLDcpQAGuBoGDd2STTMvY&file=docs%2F.prettierignore"><i class="fa-solid fa-file" style="color:#888;"></i> .prettierignore</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=zRsveVqCLDcpQAGuBoGDd2STTMvY&file=docs%2FREADME.md"><i class="fa-solid fa-file" style="color:#888;"></i> README.md</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=zRsveVqCLDcpQAGuBoGDd2STTMvY&file=docs%2FcommunitySidebar.ts"><i class="fa-solid fa-file" style="color:#888;"></i> communitySidebar.ts</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=zRsveVqCLDcpQAGuBoGDd2STTMvY&file=docs%2Fdocusaurus.config.ts"><i class="fa-solid fa-file" style="color:#888;"></i> docusaurus.config.ts</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=zRsveVqCLDcpQAGuBoGDd2STTMvY&file=docs%2FdocusaurusConfigUtils.ts"><i class="fa-solid fa-file" style="color:#888;"></i> docusaurusConfigUtils.ts</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=zRsveVqCLDcpQAGuBoGDd2STTMvY&file=docs%2Feslint.config.js"><i class="fa-solid fa-file" style="color:#888;"></i> eslint.config.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=zRsveVqCLDcpQAGuBoGDd2STTMvY&file=docs%2Fpackage-lock.json"><i class="fa-solid fa-file" style="color:#888;"></i> package-lock.json</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=zRsveVqCLDcpQAGuBoGDd2STTMvY&file=docs%2Fpackage.json"><i class="fa-solid fa-file" style="color:#888;"></i> package.json</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=zRsveVqCLDcpQAGuBoGDd2STTMvY&file=docs%2Fpostcss.config.mjs"><i class="fa-solid fa-file" style="color:#888;"></i> postcss.config.mjs</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=zRsveVqCLDcpQAGuBoGDd2STTMvY&file=docs%2Fprettier.config.js"><i class="fa-solid fa-file" style="color:#888;"></i> prettier.config.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=zRsveVqCLDcpQAGuBoGDd2STTMvY&file=docs%2Fsidebars.ts"><i class="fa-solid fa-file" style="color:#888;"></i> sidebars.ts</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=zRsveVqCLDcpQAGuBoGDd2STTMvY&file=docs%2FsidebarsClassicML.ts"><i class="fa-solid fa-file" style="color:#888;"></i> sidebarsClassicML.ts</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=zRsveVqCLDcpQAGuBoGDd2STTMvY&file=docs%2FsidebarsGenAI.ts"><i class="fa-solid fa-file" style="color:#888;"></i> sidebarsGenAI.ts</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=zRsveVqCLDcpQAGuBoGDd2STTMvY&file=docs%2FsidebarsSelfHosting.ts"><i class="fa-solid fa-file" style="color:#888;"></i> sidebarsSelfHosting.ts</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=zRsveVqCLDcpQAGuBoGDd2STTMvY&file=docs%2Ftsconfig.json"><i class="fa-solid fa-file" style="color:#888;"></i> tsconfig.json</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=zRsveVqCLDcpQAGuBoGDd2STTMvY&source=examples"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> examples</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=zRsveVqCLDcpQAGuBoGDd2STTMvY&source=fs2db"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> fs2db</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=zRsveVqCLDcpQAGuBoGDd2STTMvY&source=libs"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> libs</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=zRsveVqCLDcpQAGuBoGDd2STTMvY&source=mlflow"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> mlflow</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=zRsveVqCLDcpQAGuBoGDd2STTMvY&source=requirements"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> requirements</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=zRsveVqCLDcpQAGuBoGDd2STTMvY&source=tests"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> tests</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=zRsveVqCLDcpQAGuBoGDd2STTMvY&file=.dockerignore"><i class="fa-solid fa-file" style="color:#888;"></i> .dockerignore</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=zRsveVqCLDcpQAGuBoGDd2STTMvY&file=.git-blame-ignore-revs"><i class="fa-solid fa-file" style="color:#888;"></i> .git-blame-ignore-revs</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=zRsveVqCLDcpQAGuBoGDd2STTMvY&file=.gitattributes"><i class="fa-solid fa-file" style="color:#888;"></i> .gitattributes</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=zRsveVqCLDcpQAGuBoGDd2STTMvY&file=.gitignore"><i class="fa-solid fa-file" style="color:#888;"></i> .gitignore</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=zRsveVqCLDcpQAGuBoGDd2STTMvY&file=.gitmodules"><i class="fa-solid fa-file" style="color:#888;"></i> .gitmodules</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=zRsveVqCLDcpQAGuBoGDd2STTMvY&file=.pre-commit-config.yaml"><i class="fa-solid fa-file" style="color:#888;"></i> .pre-commit-config.yaml</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=zRsveVqCLDcpQAGuBoGDd2STTMvY&file=.python-version"><i class="fa-solid fa-file" style="color:#888;"></i> .python-version</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=zRsveVqCLDcpQAGuBoGDd2STTMvY&file=CHANGELOG.md"><i class="fa-solid fa-file" style="color:#888;"></i> CHANGELOG.md</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=zRsveVqCLDcpQAGuBoGDd2STTMvY&file=CITATION.cff"><i class="fa-solid fa-file" style="color:#888;"></i> CITATION.cff</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=zRsveVqCLDcpQAGuBoGDd2STTMvY&file=CLAUDE.md"><i class="fa-solid fa-file" style="color:#888;"></i> CLAUDE.md</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=zRsveVqCLDcpQAGuBoGDd2STTMvY&file=CODE_OF_CONDUCT.rst"><i class="fa-solid fa-file" style="color:#888;"></i> CODE_OF_CONDUCT.rst</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=zRsveVqCLDcpQAGuBoGDd2STTMvY&file=COMMITTER.md"><i class="fa-solid fa-file" style="color:#888;"></i> COMMITTER.md</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=zRsveVqCLDcpQAGuBoGDd2STTMvY&file=CONTRIBUTING.md"><i class="fa-solid fa-file" style="color:#888;"></i> CONTRIBUTING.md</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=zRsveVqCLDcpQAGuBoGDd2STTMvY&file=EXTRA_DEPENDENCIES.rst"><i class="fa-solid fa-file" style="color:#888;"></i> EXTRA_DEPENDENCIES.rst</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=zRsveVqCLDcpQAGuBoGDd2STTMvY&file=ISSUE_POLICY.md"><i class="fa-solid fa-file" style="color:#888;"></i> ISSUE_POLICY.md</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=zRsveVqCLDcpQAGuBoGDd2STTMvY&file=ISSUE_TRIAGE.rst"><i class="fa-solid fa-file" style="color:#888;"></i> ISSUE_TRIAGE.rst</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=zRsveVqCLDcpQAGuBoGDd2STTMvY&file=LICENSE.txt"><i class="fa-solid fa-file" style="color:#888;"></i> LICENSE.txt</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=zRsveVqCLDcpQAGuBoGDd2STTMvY&file=MANIFEST.in"><i class="fa-solid fa-file" style="color:#888;"></i> MANIFEST.in</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=zRsveVqCLDcpQAGuBoGDd2STTMvY&file=README.md"><i class="fa-solid fa-file" style="color:#888;"></i> README.md</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=zRsveVqCLDcpQAGuBoGDd2STTMvY&file=SECURITY.md"><i class="fa-solid fa-file" style="color:#888;"></i> SECURITY.md</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=zRsveVqCLDcpQAGuBoGDd2STTMvY&file=mlflow-charter.pdf"><i class="fa-solid fa-file" style="color:#888;"></i> mlflow-charter.pdf</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=zRsveVqCLDcpQAGuBoGDd2STTMvY&file=prettier.config.js"><i class="fa-solid fa-file" style="color:#888;"></i> prettier.config.js</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=zRsveVqCLDcpQAGuBoGDd2STTMvY&file=pyproject.release.toml"><i class="fa-solid fa-file" style="color:#888;"></i> pyproject.release.toml</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=zRsveVqCLDcpQAGuBoGDd2STTMvY&file=pyproject.toml"><i class="fa-solid fa-file" style="color:#888;"></i> pyproject.toml</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=zRsveVqCLDcpQAGuBoGDd2STTMvY&file=uv.lock"><i class="fa-solid fa-file" style="color:#888;"></i> uv.lock</a></li>
    
                        </ul>
                      </div>
                    </nav>
                <main class="col-md-9 ms-sm-auto col-lg-10">
                  <div class="container px-1 py-3">
        
<div class="mb-2" style="font-size:1.1rem;"><a href="/cgi-bin/repo?id=zRsveVqCLDcpQAGuBoGDd2STTMvY&source=.">/</a> <a href="/cgi-bin/repo?id=zRsveVqCLDcpQAGuBoGDd2STTMvY&source=docs">docs</a> / <a href="/cgi-bin/repo?id=zRsveVqCLDcpQAGuBoGDd2STTMvY&source=docs%2Fdocs">docs</a> / <a href="/cgi-bin/repo?id=zRsveVqCLDcpQAGuBoGDd2STTMvY&source=docs%2Fdocs%2Fself-hosting">self-hosting</a> / <a href="/cgi-bin/repo?id=zRsveVqCLDcpQAGuBoGDd2STTMvY&source=docs%2Fdocs%2Fself-hosting%2Fdeploy-to-cloud">deploy-to-cloud</a> / gcp.mdx</div>
        <div class="list-group">
        <div class="list-group-item">
        <div class="mb-2" style="font-weight:bold;"><i class="fa-solid fa-file"></i> gcp.mdx</div>
        <pre style="margin:0; font-size:0.85rem; overflow-x:auto; color:#fafafa;"><span style="color:#666; user-select:none;">  1</span>  ---
<span style="color:#666; user-select:none;">  2</span>  title: Deploying MLflow to Google Cloud platform
<span style="color:#666; user-select:none;">  3</span>  ---
<span style="color:#666; user-select:none;">  4</span>  
<span style="color:#666; user-select:none;">  5</span>  # Deploying MLflow to Google Cloud platform
<span style="color:#666; user-select:none;">  6</span>  
<span style="color:#666; user-select:none;">  7</span>  MLflow core components include:
<span style="color:#666; user-select:none;">  8</span>  
<span style="color:#666; user-select:none;">  9</span>  - **MLflow server**: This is the Python backend for experiment tracking, model registry management, tracing for LLM observability, job scheduling, and AI Gateway endpoints.
<span style="color:#666; user-select:none;"> 10</span>  - **Backend store**: The database in which entity metadata (e.g. trace info, experiment tracking metadata) is stored.
<span style="color:#666; user-select:none;"> 11</span>  - **Artifact store**: Blob storage for larger pieces of persisted data (e.g. model weights, trace span data).
<span style="color:#666; user-select:none;"> 12</span>  
<span style="color:#666; user-select:none;"> 13</span>  This guide walks you through deploying the MLflow server to Google Cloud Run, the backend store to Cloud SQL (PostgreSQL), and the artifact store to Google Cloud Storage (GCS). The guide also covers IAM service accounts, Cloud SQL connectivity, and Cloud Run networking settings. Once deployment is complete, you can access the MLflow web UI through a Cloud Run service URL such as: `https://mlflow-&lt;unique-id&gt;.&lt;region&gt;.run.app`. Your MLflow client code can connect to the MLflow server by setting the tracking URI to this URL.
<span style="color:#666; user-select:none;"> 14</span>  
<span style="color:#666; user-select:none;"> 15</span>  The overall deployment architecture is as follows:
<span style="color:#666; user-select:none;"> 16</span>  
<span style="color:#666; user-select:none;"> 17</span>  ![overall architecture](/images/self-hosting/gcp-deployment-arch.png)
<span style="color:#666; user-select:none;"> 18</span>  
<span style="color:#666; user-select:none;"> 19</span>  The deployment architecture has a couple of advantages:
<span style="color:#666; user-select:none;"> 20</span>  
<span style="color:#666; user-select:none;"> 21</span>  - **High Availability**
<span style="color:#666; user-select:none;"> 22</span>    - Cloud Storage (GCS) provides highly durable and globally distributed object storage for MLflow artifacts. Data is replicated across multiple zones within the selected region or multi-region location.
<span style="color:#666; user-select:none;"> 23</span>    - Cloud SQL (PostgreSQL) supports automated backups and high-availability configurations with automatic failover to a standby instance in another zone, reducing downtime for the MLflow backend store.
<span style="color:#666; user-select:none;"> 24</span>    - Cloud Run is a fully managed serverless platform that automatically restarts failed containers and scales the MLflow service based on incoming requests, ensuring high availability without manual infrastructure management.
<span style="color:#666; user-select:none;"> 25</span>  
<span style="color:#666; user-select:none;"> 26</span>  - **Security by design**
<span style="color:#666; user-select:none;"> 27</span>    - Cloud Run endpoints are automatically served over HTTPS, ensuring secure communication between MLflow clients and the server.
<span style="color:#666; user-select:none;"> 28</span>    - The Google Cloud storage bucket blocks public access, and the MLflow server running in Cloud Run accesses the artifact store securely through a service account with the &quot;Storage Object User&quot; role.
<span style="color:#666; user-select:none;"> 29</span>    - Cloud Run can connect to Cloud SQL using the built-in Cloud SQL integration or via the Cloud SQL Auth Proxy mechanism, avoiding the need to expose the database publicly.
<span style="color:#666; user-select:none;"> 30</span>    - The architecture can integrate with MLflow authentication configurations.
<span style="color:#666; user-select:none;"> 31</span>  
<span style="color:#666; user-select:none;"> 32</span>  - **Operational Simplicity**
<span style="color:#666; user-select:none;"> 33</span>    - Serverless Compute (Cloud Run), no virtual machines to manage, patch, or scale manually.
<span style="color:#666; user-select:none;"> 34</span>    - Managed Database (Cloud SQL): Automated backups, patching, and failover.
<span style="color:#666; user-select:none;"> 35</span>    - Managed Object Storage (Cloud Storage): Highly scalable and durable storage for MLflow artifacts, eliminating the need to manage scalable storage infrastructure.
<span style="color:#666; user-select:none;"> 36</span>  
<span style="color:#666; user-select:none;"> 37</span>  ## Step 1: Create a docker image and upload it to GCP:
<span style="color:#666; user-select:none;"> 38</span>  
<span style="color:#666; user-select:none;"> 39</span>  Build a docker image using the following `Dockerfile`:
<span style="color:#666; user-select:none;"> 40</span>  
<span style="color:#666; user-select:none;"> 41</span>  ```docker
<span style="color:#666; user-select:none;"> 42</span>  FROM ghcr.io/mlflow/mlflow:&lt;mlflow-version&gt;-full
<span style="color:#666; user-select:none;"> 43</span>  
<span style="color:#666; user-select:none;"> 44</span>  RUN pip install google-cloud-storage
<span style="color:#666; user-select:none;"> 45</span>  ```
<span style="color:#666; user-select:none;"> 46</span>  
<span style="color:#666; user-select:none;"> 47</span>  The `&lt;mlflow-version&gt;` in the Dockerfile is a value like `v3.10.0`.
<span style="color:#666; user-select:none;"> 48</span>  
<span style="color:#666; user-select:none;"> 49</span>  This docker image is based on the official MLflow docker image, but preinstalls &quot;google-cloud-storage&quot; package which is required by MLflow server to access Google Cloud storage.
<span style="color:#666; user-select:none;"> 50</span>  
<span style="color:#666; user-select:none;"> 51</span>  In Google Cloud &quot;Artifact Registry&quot; console, create a repository with name of &quot;mlflow-repo&quot;, set the repository format to &quot;Docker&quot;, the repository path is like `&lt;region&gt;-docker.pkg.dev/&lt;gcp-project-name&gt;/mlflow-repo`, then build the above docker image and push it to the Google docker repository as follows:
<span style="color:#666; user-select:none;"> 52</span>  
<span style="color:#666; user-select:none;"> 53</span>  ```bash
<span style="color:#666; user-select:none;"> 54</span>  docker build -t &lt;google-docker-repository-path&gt;/mlflow-gcp:v3.10.0 .
<span style="color:#666; user-select:none;"> 55</span>  
<span style="color:#666; user-select:none;"> 56</span>  docker push &lt;google-docker-repository-path&gt;/mlflow-gcp:v3.10.0
<span style="color:#666; user-select:none;"> 57</span>  ```
<span style="color:#666; user-select:none;"> 58</span>  
<span style="color:#666; user-select:none;"> 59</span>  ## Step 2: Create a bucket in Google Cloud Storage
<span style="color:#666; user-select:none;"> 60</span>  
<span style="color:#666; user-select:none;"> 61</span>  In Google Cloud &quot;Cloud Storage&quot; console, create a bucket with name like &quot;mlflow-artifact-12345&quot; as follows, note that you should turn on &quot;Public access prevention&quot; option to block public access to the bucket.
<span style="color:#666; user-select:none;"> 62</span>  
<span style="color:#666; user-select:none;"> 63</span>  ![create bucket](/images/self-hosting/gcp-create-bucket.png)
<span style="color:#666; user-select:none;"> 64</span>  
<span style="color:#666; user-select:none;"> 65</span>  ## Step 3: Grant user role to the default compute service account
<span style="color:#666; user-select:none;"> 66</span>  
<span style="color:#666; user-select:none;"> 67</span>  In Google Cloud &quot;IAM &amp; Admin&quot; console, click &quot;grant access&quot;, then assign the &quot;Storage Object User&quot; role to the default compute service account as follows:
<span style="color:#666; user-select:none;"> 68</span>  
<span style="color:#666; user-select:none;"> 69</span>  ![storage iam role](/images/self-hosting/storage-iam-role.png)
<span style="color:#666; user-select:none;"> 70</span>  
<span style="color:#666; user-select:none;"> 71</span>  ## Step 4: Create cloud SQL instance
<span style="color:#666; user-select:none;"> 72</span>  
<span style="color:#666; user-select:none;"> 73</span>  In Google Cloud &quot;Cloud SQL&quot; console, click &quot;Create an instance&quot; button to create a &quot;PostgreSQL&quot; instance as follows:
<span style="color:#666; user-select:none;"> 74</span>  
<span style="color:#666; user-select:none;"> 75</span>  ![create cloud SQL instance](/images/self-hosting/gcp-create-cloud-sql-instance.png)
<span style="color:#666; user-select:none;"> 76</span>  
<span style="color:#666; user-select:none;"> 77</span>  The database connection string used by MLflow is like:
<span style="color:#666; user-select:none;"> 78</span>  
<span style="color:#666; user-select:none;"> 79</span>  `postgresql://&lt;admin-name&gt;:&lt;admin-password&gt;@/&lt;database-name&gt;?host=/cloudsql/&lt;gcp-project-name&gt;:us-central1:&lt;cloud-sql-instance-id&gt;`
<span style="color:#666; user-select:none;"> 80</span>  
<span style="color:#666; user-select:none;"> 81</span>  The default values of &quot;admin-name&quot; and &quot;database-name&quot; are both &quot;postgres&quot;.
<span style="color:#666; user-select:none;"> 82</span>  
<span style="color:#666; user-select:none;"> 83</span>  ## Step 5: Create Cloud Run instance
<span style="color:#666; user-select:none;"> 84</span>  
<span style="color:#666; user-select:none;"> 85</span>  In Google Cloud &quot;Cloud Run&quot; console, click &quot;Deploy container&quot; button to create a cloud run instance. You need to configure the following items correctly:
<span style="color:#666; user-select:none;"> 86</span>  
<span style="color:#666; user-select:none;"> 87</span>  - Container image URL: Select the &quot;mlflow-gcp&quot; image that you pushed to the Google docker repository.
<span style="color:#666; user-select:none;"> 88</span>  - Service scaling: set both minimum and maximum number of instances to 1.
<span style="color:#666; user-select:none;"> 89</span>  - Ingress: All (Allow direct access to your service from the internet)
<span style="color:#666; user-select:none;"> 90</span>  - Container port: 5000
<span style="color:#666; user-select:none;"> 91</span>  - Container command: mlflow
<span style="color:#666; user-select:none;"> 92</span>  - Container arguments: `server --backend-store-uri &lt;database-connection-string&gt; --artifacts-destination gs://&lt;cloud-storage-bucket-name&gt; --host 0.0.0.0 --port 5000 --disable-security-middleware`
<span style="color:#666; user-select:none;"> 93</span>  - Resources: at least 2GiB memory and 1 CPU.
<span style="color:#666; user-select:none;"> 94</span>  - Cloud SQL connections: Click &quot;Add connection&quot; button and add the connection to the cloud SQL instance that is created in &quot;Step 4&quot;.
<span style="color:#666; user-select:none;"> 95</span>  
<span style="color:#666; user-select:none;"> 96</span>  After created the cloud run instance, you can view the application URL like `https://&lt;instance-name&gt;-&lt;unique-id&gt;.&lt;region&gt;.run.app` on the instance console page, and you can also view the instance metrics and logs as follows:
<span style="color:#666; user-select:none;"> 97</span>  
<span style="color:#666; user-select:none;"> 98</span>  ![cloud run instance](/images/self-hosting/gcp-cloud-run-instance.png)
<span style="color:#666; user-select:none;"> 99</span>  
<span style="color:#666; user-select:none;">100</span>  ### Integration with MLflow authentication
<span style="color:#666; user-select:none;">101</span>  
<span style="color:#666; user-select:none;">102</span>  MLflow supports [basic authentication](https://mlflow.org/docs/latest/self-hosting/security/basic-http-auth/) and [authentication with OIDC plugin](https://mlflow.org/docs/latest/self-hosting/security/sso/#using-oidc-plugin), the 2 kinds of authentication settings require:
<span style="color:#666; user-select:none;">103</span>  
<span style="color:#666; user-select:none;">104</span>  - Additional pip packages: preinstall them in the `mlflow-gcp` image in &quot;Step 1&quot;.
<span style="color:#666; user-select:none;">105</span>  - Additional environment variable settings: Set them as the environment variables in the container&#x27;s &quot;Variables &amp; Secrets&quot; settings.
<span style="color:#666; user-select:none;">106</span>  - Additional mlflow server CLI options: Append them in the &quot;Container arguments&quot; setting.
<span style="color:#666; user-select:none;">107</span>  
<span style="color:#666; user-select:none;">108</span>  ## Step 6: Validate the deployment
<span style="color:#666; user-select:none;">109</span>  
<span style="color:#666; user-select:none;">110</span>  Use [MLflow demo](https://mlflow.org/docs/latest/api_reference/cli.html#mlflow-demo) CLI to validate the deployment. Run the command from your own laptop as follows:
<span style="color:#666; user-select:none;">111</span>  
<span style="color:#666; user-select:none;">112</span>  ```
<span style="color:#666; user-select:none;">113</span>  mlflow demo --tracking-uri &lt;GCP-cloud-run-application-URL&gt;
<span style="color:#666; user-select:none;">114</span>  ```
<span style="color:#666; user-select:none;">115</span>  
<span style="color:#666; user-select:none;">116</span>  then open the application URL in your browser, view the experiment with name &quot;MLflow Demo&quot;, and explore GenAI features like traces, evaluation runs, prompt management etc.
</pre>
        </div>
        </div>

</div>
</main>
</div>
</div>


</body>
</html>

