Install the CLI, submit a GRPO job, and see the first point land on the loss curve.
uv tool install tuneplanetp init my-lab --yes && cd my-labtp login --server https://tuneplane.your-company.comtp new my-grpo --method nemo-rl/grpogit add -A && git commit -m "first grpo run"tp submit my-grpo --profile h200:8
That queues a GRPO run on 8 GPUs and prints a job id. The rest of this page is the same
sequence with the detail you need when a step does not go through.
An account on a TunePlane deployment, and its URL. An administrator creates it, or the
deployment uses single sign-on.
Quota, and at least one hardware profile you are allowed to use. tp status prints both
after you log in. Every profile name on this site is an example — use the ones tp status
gives you.
The cluster must be able to reach Qwen/Qwen2.5-1.5B, which is what the scaffold trains. On
an air-gapped network an administrator points the deployment at an internal mirror. Without
one the job starts, stalls downloading weights, and times out. See
air-gapped deployments.
Object storage is not needed for this path. It is needed for tp dataset push and for
automatic evaluation after training.
tp init writes experiments/, configs/ and common/, plus a tuneplane.yaml marker
that tells tp where your project root is. It also makes a git repository and one commit.Do not clone the platform repository. tp init is what creates your project. Upgrade later
with tp update, not by reinstalling by hand.
Opens a browser. On an SSH session add --device-flow. In CI pass --token. Credentials
land in ~/.tuneplane/.
tp status
Prints your account, your quota, and the profile names this deployment has. Note one — the
submit step needs it.
Console sign-in. Username and password, or single sign-on where the deployment has it.
3
Create an experiment
tp new my-grpo --method nemo-rl/grpo
Writes experiments/my-grpo/ holding config.yaml, README.md and recipe.lock.json.
The lock file pins the method version, so the run is reproducible even after the catalogue
moves on.
tp methods # every method this deployment offerstp methods nemo-rl/grpo # what you can tune, with ranges and defaults
4
Tune and validate
Edit experiments/my-grpo/config.yaml. Learning rate, prompts per step and generations per
prompt are at the top.
tp validate my-grpo
Checks types, ranges and batch-size divisibility against the method declaration. A typo
fails here in seconds instead of after a queue wait.
Prints a job id. --profile is the only resource flag: h200 takes the registry’s default
shape, h200:4 asks for four GPUs, h200:16 for two full nodes.A dirty working tree is refused. Pass --allow-dirty to submit anyway.
tp job logs # omit the id to follow the latest job
Status moves QUEUED → SUBMITTED → PENDING → RUNNING. QUEUED means admitted but
not yet on the cluster. See job states.
6
Watch it in the console
Open the console, go to Jobs, and click your run.
Tab
What it shows
Charts
Loss, reward, KL, gradient norm, step by step
Logs
The full stream, searchable and downloadable
Validation
Sample conversations and reward histograms
System
GPU utilisation, memory, network
Diagnosis
On a failure or an odd curve, a report and the knobs worth trying
Job charts during a GRPO run: reward, accuracy, and training scalars.
Once that first point appears, the path worked.If logs move but charts stay empty, first identify the reporting path. SDK reporting needs
a reachable ingest endpoint and tuneplane.report calls.
Native TensorBoard/JSONL outputs need declared sources, the collector and a reachable
telemetry gateway; stdout alone does not create points.
Change what tp submit does in submitting a job. Run many variants at
once with sweeps. Score the result against GSM8K or C-Eval in
benchmarks. If the method you need is not in the catalogue, bring your
own trainer with custom training.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"TunePlane","description":"TunePlane — one control plane for the whole LLM post-training lifecycle: environments, training, evaluation, serving and deployment, across any framework and any backend.","colors":{"primary":"#141618","light":"#9FA0A0","dark":"#141618"},"logo":{"light":"https://mintcdn.com/starforge/InJS8EvGlZCp2PSg/logo/mark.svg?fit=max\u0026auto=format\u0026n=InJS8EvGlZCp2PSg\u0026q=85\u0026s=69ca4ec035a742e44ccf911a2810084b","dark":"https://mintcdn.com/starforge/InJS8EvGlZCp2PSg/logo/mark-dark.svg?fit=max\u0026auto=format\u0026n=InJS8EvGlZCp2PSg\u0026q=85\u0026s=7bd0637054faca9fb70498ea06266b93","href":"/"},"favicon":{"light":"https://mintcdn.com/starforge/InJS8EvGlZCp2PSg/favicon.svg?fit=max\u0026auto=format\u0026n=InJS8EvGlZCp2PSg\u0026q=85\u0026s=2d2102320e91dd6d1b4e2f1060a9e6c5","dark":"https://mintcdn.com/starforge/InJS8EvGlZCp2PSg/favicon-dark.svg?fit=max\u0026auto=format\u0026n=InJS8EvGlZCp2PSg\u0026q=85\u0026s=dec3f593045edf947cc2c36384fe376e"},"appearance":{"default":"system"},"footer":{"socials":{"github":"https://github.com/tuneplane/tuneplane"}},"search":{"prompt":"Search docs…"},"fonts":{"family":"Plus Jakarta Sans"},"icons":{"library":"lucide"},"styling":{"eyebrows":"breadcrumbs","codeblocks":{"theme":{"light":"github-light","dark":"github-dark-dimmed"}},"latex":false},"contextual":{"options":["copy","view","chatgpt","claude"],"display":"header"},"navigation":{"languages":[{"language":"en","default":true,"navbar":{"links":[{"href":"/","label":"Console"},{"href":"/en/quickstart","label":"Quickstart"}],"primary":{"type":"github","label":"GitHub","href":"https://github.com/tuneplane/tuneplane"}},"href":"en"},{"language":"zh-Hans","navbar":{"links":[{"href":"/","label":"控制台"},{"href":"/zh-Hans/quickstart","label":"快速开始"}],"primary":{"type":"github","label":"GitHub","href":"https://github.com/tuneplane/tuneplane"}},"href":"zh-Hans"}]}},"deployment":{"deploymentMetadataValue":{"subdomain":"starforge","hasAudioNarration":false,"actualSubdomain":"starforge","customDomains":["docs.tuneplane.ai"],"gitSource":{"type":"github","owner":"tuneplane","repo":"tuneplane","deployBranch":"main","contentDirectory":"mintlify","isPrivate":true,"mountPath":"","label":""},"chroma":{"latestBuiltDeploymentHistoryId":"6abb8c03dac088f3f7e513f5","collectionId":"14ef6ac9-130e-4ea7-878d-4a3d9f6d0dcd","liveDeploymentHistoryId":"6abb8c03dac088f3f7e513f5","schemaVersion":"v3"},"entitlements":{},"buildId":"6abb8c03dac088f3f7e513f5","clientVersion":"0.0.3952","searchFilterCounts":[{"language":"default","tag":"API 参考","count":456},{"language":"default","tag":"接口","count":456},{"language":"default","tag":"jobs","count":58},{"language":"en","tag":"Guides","count":49},{"language":"zh-Hans","tag":"指南","count":49},{"language":"zh-Hans","tag":"Web 控制台","count":33},{"language":"default","tag":"admin","count":32},{"language":"default","tag":"auth","count":32},{"language":"en","tag":"Web Console","count":31},{"language":"zh-Hans","tag":"CLI 参考","count":30},{"language":"en","tag":"CLI Reference","count":29},{"language":"en","tag":"Deployment \u0026 Ops","count":25},{"language":"zh-Hans","tag":"部署运维","count":25},{"language":"default","tag":"share","count":25},{"language":"default","tag":"datasets","count":22},{"language":"en","tag":"Train a model","count":19},{"language":"zh-Hans","tag":"训练模型","count":19},{"language":"default","tag":"volumes","count":17},{"language":"default","tag":"model-deployments","count":16},{"language":"default","tag":"plugins","count":15},{"language":"en","tag":"Frameworks","count":9},{"language":"zh-Hans","tag":"训练框架","count":9},{"language":"en","tag":"Get started","count":8},{"language":"en","tag":"Administration","count":8},{"language":"en","tag":"Resources","count":8},{"language":"en","tag":"Evaluation","count":8},{"language":"zh-Hans","tag":"开始","count":8},{"language":"zh-Hans","tag":"管理","count":8},{"language":"zh-Hans","tag":"资源","count":8},{"language":"zh-Hans","tag":"评测","count":8}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-v7-file-tree","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"pause-universal-search-reconcile","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"per-site-search-delta","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-private-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-nav-generations","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-agent-model-picker","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"isAtlas":false,"googleFontsInlined":true},"customCss":[{"filePath":"style.css","content":"#navbar img.nav-logo,a[href=\"/\"]>img.nav-logo,header img.nav-logo{height:2.25rem!important;width:auto!important;max-height:none!important}#navbar a[href^=\"https://github.com/\"] span,header a[href^=\"https://github.com/\"] span,html[data-current-path=\"/\"] #header{display:none}card{transition:border-color .18s ease,background-color .18s ease}tile{overflow:hidden}"}],"page":{"pagePath":"en/quickstart","slug":"/en/quickstart","pageMetadata":{"title":"Quickstart","description":"Install the CLI, submit a GRPO job, and see the first point land on the loss curve.","icon":"rocket","href":"/en/quickstart"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Install the CLI, submit a GRPO job, and see the first point land on the loss curve.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Frame,Heading,OptimizedImage,Step,Steps,Table}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Frame)_missingMdxReference(`Frame`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!OptimizedImage)_missingMdxReference(`OptimizedImage`,true);if(!Step)_missingMdxReference(`Step`,true);if(!Steps)_missingMdxReference(`Steps`,true);if(!Table)_missingMdxReference(`Table`,true);return _jsxs(_Fragment,{children:[_jsx(CodeBlock,{filename:``,numberOfLines:`6`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light github-dark-dimmed`,style:{backgroundColor:`#fff`,\"--shiki-dark-bg\":`#22272e`,color:`#24292e`,\"--shiki-dark\":`#adbac7`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`6`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#6F42C1`,\"--shiki-dark\":`#F69D50`},children:`uv`}),_jsx(_components.span,{style:{color:`#032F62`,\"--shiki-dark\":`#96D0FF`},children:` tool`}),_jsx(_components.span,{style:{color:`#032F62`,\"--shiki-dark\":`#96D0FF`},children:` install`}),_jsx(_components.span,{style:{color:`#032F62`,\"--shiki-dark\":`#96D0FF`},children:` tuneplane`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#6F42C1`,\"--shiki-dark\":`#F69D50`},children:`tp`}),_jsx(_components.span,{style:{color:`#032F62`,\"--shiki-dark\":`#96D0FF`},children:` init`}),_jsx(_components.span,{style:{color:`#032F62`,\"--shiki-dark\":`#96D0FF`},children:` my-lab`}),_jsx(_components.span,{style:{color:`#005CC5`,\"--shiki-dark\":`#6CB6FF`},children:` --yes`}),_jsx(_components.span,{style:{color:`#24292E`,\"--shiki-dark\":`#ADBAC7`},children:` \u0026\u0026 `}),_jsx(_components.span,{style:{color:`#005CC5`,\"--shiki-dark\":`#6CB6FF`},children:`cd`}),_jsx(_components.span,{style:{color:`#032F62`,\"--shiki-dark\":`#96D0FF`},children:` my-lab`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#6F42C1`,\"--shiki-dark\":`#F69D50`},children:`tp`}),_jsx(_components.span,{style:{color:`#032F62`,\"--shiki-dark\":`#96D0FF`},children:` login`}),_jsx(_components.span,{style:{color:`#005CC5`,\"--shiki-dark\":`#6CB6FF`},children:` --server`}),_jsx(_components.span,{style:{color:`#032F62`,\"--shiki-dark\":`#96D0FF`},children:` https://tuneplane.your-company.com`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#6F42C1`,\"--shiki-dark\":`#F69D50`},children:`tp`}),_jsx(_components.span,{style:{color:`#032F62`,\"--shiki-dark\":`#96D0FF`},children:` new`}),_jsx(_components.span,{style:{color:`#032F62`,\"--shiki-dark\":`#96D0FF`},children:` my-grpo`}),_jsx(_components.span,{style:{color:`#005CC5`,\"--shiki-dark\":`#6CB6FF`},children:` --method`}),_jsx(_components.span,{style:{color:`#032F62`,\"--shiki-dark\":`#96D0FF`},children:` nemo-rl/grpo`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#6F42C1`,\"--shiki-dark\":`#F69D50`},children:`git`}),_jsx(_components.span,{style:{color:`#032F62`,\"--shiki-dark\":`#96D0FF`},children:` add`}),_jsx(_components.span,{style:{color:`#005CC5`,\"--shiki-dark\":`#6CB6FF`},children:` -A`}),_jsx(_components.span,{style:{color:`#24292E`,\"--shiki-dark\":`#ADBAC7`},children:` \u0026\u0026 `}),_jsx(_components.span,{style:{color:`#6F42C1`,\"--shiki-dark\":`#F69D50`},children:`git`}),_jsx(_components.span,{style:{color:`#032F62`,\"--shiki-dark\":`#96D0FF`},children:` commit`}),_jsx(_components.span,{style:{color:`#005CC5`,\"--shiki-dark\":`#6CB6FF`},children:` -m`}),_jsx(_components.span,{style:{color:`#032F62`,\"--shiki-dark\":`#96D0FF`},children:` \"first grpo run\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#6F42C1`,\"--shiki-dark\":`#F69D50`},children:`tp`}),_jsx(_components.span,{style:{color:`#032F62`,\"--shiki-dark\":`#96D0FF`},children:` submit`}),_jsx(_components.span,{style:{color:`#032F62`,\"--shiki-dark\":`#96D0FF`},children:` my-grpo`}),_jsx(_components.span,{style:{color:`#005CC5`,\"--shiki-dark\":`#6CB6FF`},children:` --profile`}),_jsx(_components.span,{style:{color:`#032F62`,\"--shiki-dark\":`#96D0FF`},children:` h200:8`})]}),`\n`]})})}),`\n`,_jsx(_components.p,{children:`That queues a GRPO run on 8 GPUs and prints a job id. The rest of this page is the same\nsequence with the detail you need when a step does not go through.`}),`\n`,_jsx(Heading,{level:`2`,id:`before-you-start`,children:`Before you start`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`An account on a TunePlane deployment, and its URL. An administrator creates it, or the\ndeployment uses single sign-on.`}),`\n`,_jsxs(_components.li,{children:[`Quota, and at least one hardware profile you are allowed to use. `,_jsx(_components.code,{children:`tp status`}),` prints both\nafter you log in. Every profile name on this site is an example — use the ones `,_jsx(_components.code,{children:`tp status`}),`\ngives you.`]}),`\n`,_jsxs(_components.li,{children:[`The cluster must be able to reach `,_jsx(_components.code,{children:`Qwen/Qwen2.5-1.5B`}),`, which is what the scaffold trains. On\nan air-gapped network an administrator points the deployment at an internal mirror. Without\none the job starts, stalls downloading weights, and times out. See\n`,_jsx(_components.a,{href:`/en/ops/airgapped`,children:`air-gapped deployments`}),`.`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`Object storage is not needed for this path. It is needed for `,_jsx(_components.code,{children:`tp dataset push`}),` and for\nautomatic evaluation after training.`]}),`\n`,_jsxs(Steps,{children:[_jsxs(Step,{title:`Install the CLI and create a project`,children:[_jsx(CodeBlock,{filename:``,numberOfLines:`3`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light github-dark-dimmed`,style:{backgroundColor:`#fff`,\"--shiki-dark-bg\":`#22272e`,color:`#24292e`,\"--shiki-dark\":`#adbac7`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`3`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#6F42C1`,\"--shiki-dark\":`#F69D50`},children:`uv`}),_jsx(_components.span,{style:{color:`#032F62`,\"--shiki-dark\":`#96D0FF`},children:` tool`}),_jsx(_components.span,{style:{color:`#032F62`,\"--shiki-dark\":`#96D0FF`},children:` install`}),_jsx(_components.span,{style:{color:`#032F62`,\"--shiki-dark\":`#96D0FF`},children:` tuneplane`}),_jsx(_components.span,{style:{color:`#6A737D`,\"--shiki-dark\":`#768390`},children:` # or: pip install tuneplane`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#6F42C1`,\"--shiki-dark\":`#F69D50`},children:`tp`}),_jsx(_components.span,{style:{color:`#032F62`,\"--shiki-dark\":`#96D0FF`},children:` init`}),_jsx(_components.span,{style:{color:`#032F62`,\"--shiki-dark\":`#96D0FF`},children:` my-lab`}),_jsx(_components.span,{style:{color:`#005CC5`,\"--shiki-dark\":`#6CB6FF`},children:` --yes`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#005CC5`,\"--shiki-dark\":`#6CB6FF`},children:`cd`}),_jsx(_components.span,{style:{color:`#032F62`,\"--shiki-dark\":`#96D0FF`},children:` my-lab`})]}),`\n`]})})}),_jsxs(_components.p,{children:[_jsx(_components.code,{children:`tp init`}),` writes `,_jsx(_components.code,{children:`experiments/`}),`, `,_jsx(_components.code,{children:`configs/`}),` and `,_jsx(_components.code,{children:`common/`}),`, plus a `,_jsx(_components.code,{children:`tuneplane.yaml`}),` marker\nthat tells `,_jsx(_components.code,{children:`tp`}),` where your project root is. It also makes a git repository and one commit.`]}),_jsxs(_components.p,{children:[`Do not clone the platform repository. `,_jsx(_components.code,{children:`tp init`}),` is what creates your project. Upgrade later\nwith `,_jsx(_components.a,{href:`/en/cli/update`,children:_jsx(_components.code,{children:`tp update`})}),`, not by reinstalling by hand.`]})]}),_jsxs(Step,{title:`Log in`,children:[_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light github-dark-dimmed`,style:{backgroundColor:`#fff`,\"--shiki-dark-bg\":`#22272e`,color:`#24292e`,\"--shiki-dark\":`#adbac7`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#6F42C1`,\"--shiki-dark\":`#F69D50`},children:`tp`}),_jsx(_components.span,{style:{color:`#032F62`,\"--shiki-dark\":`#96D0FF`},children:` login`}),_jsx(_components.span,{style:{color:`#005CC5`,\"--shiki-dark\":`#6CB6FF`},children:` --server`}),_jsx(_components.span,{style:{color:`#032F62`,\"--shiki-dark\":`#96D0FF`},children:` https://tuneplane.your-company.com`})]}),`\n`]})})}),_jsxs(_components.p,{children:[`Opens a browser. On an SSH session add `,_jsx(_components.code,{children:`--device-flow`}),`. In CI pass `,_jsx(_components.code,{children:`--token`}),`. Credentials\nland in `,_jsx(_components.code,{children:`~/.tuneplane/`}),`.`]}),_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light github-dark-dimmed`,style:{backgroundColor:`#fff`,\"--shiki-dark-bg\":`#22272e`,color:`#24292e`,\"--shiki-dark\":`#adbac7`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#6F42C1`,\"--shiki-dark\":`#F69D50`},children:`tp`}),_jsx(_components.span,{style:{color:`#032F62`,\"--shiki-dark\":`#96D0FF`},children:` status`})]}),`\n`]})})}),_jsx(_components.p,{children:`Prints your account, your quota, and the profile names this deployment has. Note one — the\nsubmit step needs it.`}),_jsx(Frame,{caption:`Console sign-in. Username and password, or single sign-on where the deployment has it.`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/starforge/GatXR2rI5-_Vm4_H/images/console/login.png?fit=max\u0026auto=format\u0026n=GatXR2rI5-_Vm4_H\u0026q=85\u0026s=2306521111801b18e089d0ddd58a6667`,alt:`TunePlane console login page`,\"data-og-width\":`2160`,width:`2160`,\"data-og-height\":`1350`,height:`1350`,\"data-path\":`images/console/login.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/starforge/GatXR2rI5-_Vm4_H/images/console/login.png?w=280\u0026fit=max\u0026auto=format\u0026n=GatXR2rI5-_Vm4_H\u0026q=85\u0026s=415e5aa10451346caa63443d18141fd4 280w, https://mintcdn.com/starforge/GatXR2rI5-_Vm4_H/images/console/login.png?w=560\u0026fit=max\u0026auto=format\u0026n=GatXR2rI5-_Vm4_H\u0026q=85\u0026s=aefcab00e1f0821baedabacde48ed558 560w, https://mintcdn.com/starforge/GatXR2rI5-_Vm4_H/images/console/login.png?w=840\u0026fit=max\u0026auto=format\u0026n=GatXR2rI5-_Vm4_H\u0026q=85\u0026s=6c8861cb7583bda9828ac503e04cc432 840w, https://mintcdn.com/starforge/GatXR2rI5-_Vm4_H/images/console/login.png?w=1100\u0026fit=max\u0026auto=format\u0026n=GatXR2rI5-_Vm4_H\u0026q=85\u0026s=0214d9edb004bac4c0c77d9e75166311 1100w, https://mintcdn.com/starforge/GatXR2rI5-_Vm4_H/images/console/login.png?w=1650\u0026fit=max\u0026auto=format\u0026n=GatXR2rI5-_Vm4_H\u0026q=85\u0026s=b44e9238ba4d7453086d6c6bfae4549a 1650w, https://mintcdn.com/starforge/GatXR2rI5-_Vm4_H/images/console/login.png?w=2500\u0026fit=max\u0026auto=format\u0026n=GatXR2rI5-_Vm4_H\u0026q=85\u0026s=6ec020b4f32ba9ed0245dba75c803fa6 2500w`})})]}),_jsxs(Step,{title:`Create an experiment`,children:[_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light github-dark-dimmed`,style:{backgroundColor:`#fff`,\"--shiki-dark-bg\":`#22272e`,color:`#24292e`,\"--shiki-dark\":`#adbac7`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#6F42C1`,\"--shiki-dark\":`#F69D50`},children:`tp`}),_jsx(_components.span,{style:{color:`#032F62`,\"--shiki-dark\":`#96D0FF`},children:` new`}),_jsx(_components.span,{style:{color:`#032F62`,\"--shiki-dark\":`#96D0FF`},children:` my-grpo`}),_jsx(_components.span,{style:{color:`#005CC5`,\"--shiki-dark\":`#6CB6FF`},children:` --method`}),_jsx(_components.span,{style:{color:`#032F62`,\"--shiki-dark\":`#96D0FF`},children:` nemo-rl/grpo`})]}),`\n`]})})}),_jsxs(_components.p,{children:[`Writes `,_jsx(_components.code,{children:`experiments/my-grpo/`}),` holding `,_jsx(_components.code,{children:`config.yaml`}),`, `,_jsx(_components.code,{children:`README.md`}),` and `,_jsx(_components.code,{children:`recipe.lock.json`}),`.\nThe lock file pins the method version, so the run is reproducible even after the catalogue\nmoves on.`]}),_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light github-dark-dimmed`,style:{backgroundColor:`#fff`,\"--shiki-dark-bg\":`#22272e`,color:`#24292e`,\"--shiki-dark\":`#adbac7`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`2`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#6F42C1`,\"--shiki-dark\":`#F69D50`},children:`tp`}),_jsx(_components.span,{style:{color:`#032F62`,\"--shiki-dark\":`#96D0FF`},children:` methods`}),_jsx(_components.span,{style:{color:`#6A737D`,\"--shiki-dark\":`#768390`},children:` # every method this deployment offers`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#6F42C1`,\"--shiki-dark\":`#F69D50`},children:`tp`}),_jsx(_components.span,{style:{color:`#032F62`,\"--shiki-dark\":`#96D0FF`},children:` methods`}),_jsx(_components.span,{style:{color:`#032F62`,\"--shiki-dark\":`#96D0FF`},children:` nemo-rl/grpo`}),_jsx(_components.span,{style:{color:`#6A737D`,\"--shiki-dark\":`#768390`},children:` # what you can tune, with ranges and defaults`})]}),`\n`]})})})]}),_jsxs(Step,{title:`Tune and validate`,children:[_jsxs(_components.p,{children:[`Edit `,_jsx(_components.code,{children:`experiments/my-grpo/config.yaml`}),`. Learning rate, prompts per step and generations per\nprompt are at the top.`]}),_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light github-dark-dimmed`,style:{backgroundColor:`#fff`,\"--shiki-dark-bg\":`#22272e`,color:`#24292e`,\"--shiki-dark\":`#adbac7`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#6F42C1`,\"--shiki-dark\":`#F69D50`},children:`tp`}),_jsx(_components.span,{style:{color:`#032F62`,\"--shiki-dark\":`#96D0FF`},children:` validate`}),_jsx(_components.span,{style:{color:`#032F62`,\"--shiki-dark\":`#96D0FF`},children:` my-grpo`})]}),`\n`]})})}),_jsx(_components.p,{children:`Checks types, ranges and batch-size divisibility against the method declaration. A typo\nfails here in seconds instead of after a queue wait.`})]}),_jsxs(Step,{title:`Submit`,children:[_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light github-dark-dimmed`,style:{backgroundColor:`#fff`,\"--shiki-dark-bg\":`#22272e`,color:`#24292e`,\"--shiki-dark\":`#adbac7`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`2`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#6F42C1`,\"--shiki-dark\":`#F69D50`},children:`git`}),_jsx(_components.span,{style:{color:`#032F62`,\"--shiki-dark\":`#96D0FF`},children:` add`}),_jsx(_components.span,{style:{color:`#005CC5`,\"--shiki-dark\":`#6CB6FF`},children:` -A`}),_jsx(_components.span,{style:{color:`#24292E`,\"--shiki-dark\":`#ADBAC7`},children:` \u0026\u0026 `}),_jsx(_components.span,{style:{color:`#6F42C1`,\"--shiki-dark\":`#F69D50`},children:`git`}),_jsx(_components.span,{style:{color:`#032F62`,\"--shiki-dark\":`#96D0FF`},children:` commit`}),_jsx(_components.span,{style:{color:`#005CC5`,\"--shiki-dark\":`#6CB6FF`},children:` -m`}),_jsx(_components.span,{style:{color:`#032F62`,\"--shiki-dark\":`#96D0FF`},children:` \"first grpo run\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#6F42C1`,\"--shiki-dark\":`#F69D50`},children:`tp`}),_jsx(_components.span,{style:{color:`#032F62`,\"--shiki-dark\":`#96D0FF`},children:` submit`}),_jsx(_components.span,{style:{color:`#032F62`,\"--shiki-dark\":`#96D0FF`},children:` my-grpo`}),_jsx(_components.span,{style:{color:`#005CC5`,\"--shiki-dark\":`#6CB6FF`},children:` --profile`}),_jsx(_components.span,{style:{color:`#032F62`,\"--shiki-dark\":`#96D0FF`},children:` h200:8`})]}),`\n`]})})}),_jsxs(_components.p,{children:[`Prints a job id. `,_jsx(_components.code,{children:`--profile`}),` is the only resource flag: `,_jsx(_components.code,{children:`h200`}),` takes the registry’s default\nshape, `,_jsx(_components.code,{children:`h200:4`}),` asks for four GPUs, `,_jsx(_components.code,{children:`h200:16`}),` for two full nodes.`]}),_jsxs(_components.p,{children:[`A dirty working tree is refused. Pass `,_jsx(_components.code,{children:`--allow-dirty`}),` to submit anyway.`]}),_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light github-dark-dimmed`,style:{backgroundColor:`#fff`,\"--shiki-dark-bg\":`#22272e`,color:`#24292e`,\"--shiki-dark\":`#adbac7`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#6F42C1`,\"--shiki-dark\":`#F69D50`},children:`tp`}),_jsx(_components.span,{style:{color:`#032F62`,\"--shiki-dark\":`#96D0FF`},children:` job`}),_jsx(_components.span,{style:{color:`#032F62`,\"--shiki-dark\":`#96D0FF`},children:` logs`}),_jsx(_components.span,{style:{color:`#6A737D`,\"--shiki-dark\":`#768390`},children:` # omit the id to follow the latest job`})]}),`\n`]})})}),_jsxs(_components.p,{children:[`Status moves `,_jsx(_components.code,{children:`QUEUED`}),` → `,_jsx(_components.code,{children:`SUBMITTED`}),` → `,_jsx(_components.code,{children:`PENDING`}),` → `,_jsx(_components.code,{children:`RUNNING`}),`. `,_jsx(_components.code,{children:`QUEUED`}),` means admitted but\nnot yet on the cluster. See `,_jsx(_components.a,{href:`/en/concepts/job-lifecycle`,children:`job states`}),`.`]})]}),_jsxs(Step,{title:`Watch it in the console`,children:[_jsxs(_components.p,{children:[`Open the console, go to `,_jsx(_components.strong,{children:`Jobs`}),`, and click your run.`]}),_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Tab`}),_jsx(_components.th,{children:`What it shows`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Charts`}),_jsx(_components.td,{children:`Loss, reward, KL, gradient norm, step by step`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Logs`}),_jsx(_components.td,{children:`The full stream, searchable and downloadable`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Validation`}),_jsx(_components.td,{children:`Sample conversations and reward histograms`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`System`}),_jsx(_components.td,{children:`GPU utilisation, memory, network`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Diagnosis`}),_jsx(_components.td,{children:`On a failure or an odd curve, a report and the knobs worth trying`})]})]})]}),_jsx(Frame,{caption:`Job charts during a GRPO run: reward, accuracy, and training scalars.`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/starforge/GatXR2rI5-_Vm4_H/images/console/job-charts.png?fit=max\u0026auto=format\u0026n=GatXR2rI5-_Vm4_H\u0026q=85\u0026s=f0cbc511c02bb6a4b59b74c5575899ce`,alt:`TunePlane job charts tab`,\"data-og-width\":`2160`,width:`2160`,\"data-og-height\":`1350`,height:`1350`,\"data-path\":`images/console/job-charts.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/starforge/GatXR2rI5-_Vm4_H/images/console/job-charts.png?w=280\u0026fit=max\u0026auto=format\u0026n=GatXR2rI5-_Vm4_H\u0026q=85\u0026s=98e9ba2ca6d1820933f1084a7013dc3b 280w, https://mintcdn.com/starforge/GatXR2rI5-_Vm4_H/images/console/job-charts.png?w=560\u0026fit=max\u0026auto=format\u0026n=GatXR2rI5-_Vm4_H\u0026q=85\u0026s=c47bd380d3d12a07817f2880f87a707e 560w, https://mintcdn.com/starforge/GatXR2rI5-_Vm4_H/images/console/job-charts.png?w=840\u0026fit=max\u0026auto=format\u0026n=GatXR2rI5-_Vm4_H\u0026q=85\u0026s=a5bb1869eaa2bc53124d3a021eb7503d 840w, https://mintcdn.com/starforge/GatXR2rI5-_Vm4_H/images/console/job-charts.png?w=1100\u0026fit=max\u0026auto=format\u0026n=GatXR2rI5-_Vm4_H\u0026q=85\u0026s=0de48317115e65c4ab04e0773024b772 1100w, https://mintcdn.com/starforge/GatXR2rI5-_Vm4_H/images/console/job-charts.png?w=1650\u0026fit=max\u0026auto=format\u0026n=GatXR2rI5-_Vm4_H\u0026q=85\u0026s=2326245d9eda2265efa642b60cf6071f 1650w, https://mintcdn.com/starforge/GatXR2rI5-_Vm4_H/images/console/job-charts.png?w=2500\u0026fit=max\u0026auto=format\u0026n=GatXR2rI5-_Vm4_H\u0026q=85\u0026s=ba5b565bb0c00fbc3c8d424ef4838942 2500w`})})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`check-it-worked`,children:`Check it worked`}),`\n`,_jsx(_components.p,{children:`Read this in order. If one row does not match, stop there — every row below assumes the one\nabove happened.`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`When`}),_jsx(_components.th,{children:`What you should see`}),_jsx(_components.th,{children:`If it does not match`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[`After `,_jsx(_components.code,{children:`tp status`})]}),_jsx(_components.td,{children:`Your username, your quota, at least one profile name`}),_jsx(_components.td,{children:`Login did not finish, or you have no quota yet`})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[`After `,_jsx(_components.code,{children:`tp submit`})]}),_jsxs(_components.td,{children:[`A job id, state `,_jsx(_components.code,{children:`QUEUED`}),` or `,_jsx(_components.code,{children:`SUBMITTED`})]}),_jsxs(_components.td,{children:[`A refusal names the gate that refused it. See `,_jsx(_components.a,{href:`/en/api-reference/errors`,children:`errors`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`1–3 min`}),_jsxs(_components.td,{children:[`State turns `,_jsx(_components.code,{children:`RUNNING`})]}),_jsxs(_components.td,{children:[`Still `,_jsx(_components.code,{children:`QUEUED`}),`: the job page names the gate holding it`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`3–8 min`}),_jsx(_components.td,{children:`Logs show the weight download, then Ray starting`}),_jsxs(_components.td,{children:[`Stuck downloading: the mirror. See `,_jsx(_components.a,{href:`/en/ops/airgapped`,children:`air-gapped`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`8–15 min`}),_jsx(_components.td,{children:`The first point on the Charts tab`}),_jsx(_components.td,{children:`Logs moving, charts empty: see below`})]})]})]}),`\n`,_jsx(_components.p,{children:`Once that first point appears, the path worked.`}),`\n`,_jsxs(_components.p,{children:[`If logs move but charts stay empty, first identify the reporting path. SDK reporting needs\na reachable ingest endpoint and `,_jsx(_components.a,{href:`/en/api-reference/python-sdk`,children:_jsx(_components.code,{children:`tuneplane.report`})}),` calls.\nNative TensorBoard/JSONL outputs need declared sources, the collector and a reachable\n`,_jsx(_components.a,{href:`/en/ops/telemetry`,children:`telemetry gateway`}),`; stdout alone does not create points.`]}),`\n`,_jsx(Heading,{level:`2`,id:`next`,children:`Next`}),`\n`,_jsxs(_components.p,{children:[`Change what `,_jsx(_components.code,{children:`tp submit`}),` does in `,_jsx(_components.a,{href:`/en/guides/submit`,children:`submitting a job`}),`. Run many variants at\nonce with `,_jsx(_components.a,{href:`/en/guides/sweep`,children:`sweeps`}),`. Score the result against GSM8K or C-Eval in\n`,_jsx(_components.a,{href:`/en/guides/benchmarks`,children:`benchmarks`}),`. If the method you need is not in the catalogue, bring your\nown trainer with `,_jsx(_components.a,{href:`/en/guides/custom-training`,children:`custom training`}),`.`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"codeStyling":{"theme":{"light":"github-light","dark":"github-dark-dimmed"}},"config":{},"pageMetadata":{"title":"Quickstart","description":"Install the CLI, submit a GRPO job, and see the first point land on the loss curve.","icon":"rocket","href":"/en/quickstart"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Before you start","slug":"before-you-start","depth":2,"children":[]},{"title":"Check it worked","slug":"check-it-worked","depth":2,"children":[]},{"title":"Next","slug":"next","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"starforge","siteName":"TunePlane","title":"Quickstart - TunePlane","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{"en":{"href":"/en/quickstart","matchLevel":0},"zh-Hans":{"href":"/zh-Hans/quickstart","matchLevel":1}}},"lastModified":"2026-09-24T04:11:12.729Z","originalFileLocation":"en/quickstart.mdx","locale":"en"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Install the CLI, submit a GRPO job, and see the first point land on the loss curve.\">\u003cmeta data-mint-head name=\"application-name\" content=\"TunePlane\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/starforge/GckS4U1wjz1fZvKG/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/starforge/GckS4U1wjz1fZvKG/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/starforge/GckS4U1wjz1fZvKG/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/starforge/GckS4U1wjz1fZvKG/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/starforge/GckS4U1wjz1fZvKG/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/starforge/GckS4U1wjz1fZvKG/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/starforge/GckS4U1wjz1fZvKG/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/starforge/GckS4U1wjz1fZvKG/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/starforge/GckS4U1wjz1fZvKG/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Quickstart - TunePlane\">\u003cmeta data-mint-head property=\"og:description\" content=\"Install the CLI, submit a GRPO job, and see the first point land on the loss curve.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"TunePlane\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.tuneplane.ai/en/quickstart\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://starforge.mintlify.app/_mintlify/api/og/v2?division=Get+started\u0026amp;title=Quickstart\u0026amp;description=Install+the+CLI%2C+submit+a+GRPO+job%2C+and+see+the+first+point+land+on+the+loss+curve.\u0026amp;theme=d594fc747a584e2e90492cf7\u0026amp;signature=5bc282579f21f9609d5e4c0a85a58fd85109b5d8c9cd53ff527e77e43d9fbcac\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Quickstart - TunePlane\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Install the CLI, submit a GRPO job, and see the first point land on the loss curve.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://starforge.mintlify.app/_mintlify/api/og/v2?division=Get+started\u0026amp;title=Quickstart\u0026amp;description=Install+the+CLI%2C+submit+a+GRPO+job%2C+and+see+the+first+point+land+on+the+loss+curve.\u0026amp;theme=d594fc747a584e2e90492cf7\u0026amp;signature=5bc282579f21f9609d5e4c0a85a58fd85109b5d8c9cd53ff527e77e43d9fbcac\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/starforge/GckS4U1wjz1fZvKG/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"TunePlane\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#141618\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.tuneplane.ai/en/quickstart\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/en/quickstart.md\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"en\" href=\"https://docs.tuneplane.ai/en/quickstart\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"zh-Hans\" href=\"https://docs.tuneplane.ai/zh-Hans/quickstart\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"x-default\" href=\"https://docs.tuneplane.ai/en/quickstart\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.tuneplane.ai/#organization\",\"name\":\"TunePlane\",\"url\":\"https://docs.tuneplane.ai\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/starforge/InJS8EvGlZCp2PSg/logo/mark.svg?fit=max\u0026auto=format\u0026n=InJS8EvGlZCp2PSg\u0026q=85\u0026s=69ca4ec035a742e44ccf911a2810084b\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.tuneplane.ai#website\",\"name\":\"TunePlane\",\"url\":\"https://docs.tuneplane.ai\",\"publisher\":{\"@id\":\"https://docs.tuneplane.ai/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.tuneplane.ai/en/quickstart#webpage\",\"url\":\"https://docs.tuneplane.ai/en/quickstart\",\"name\":\"Quickstart\",\"description\":\"Install the CLI, submit a GRPO job, and see the first point land on the loss curve.\",\"dateModified\":\"2026-09-24T04:11:12.729Z\",\"isPartOf\":{\"@id\":\"https://docs.tuneplane.ai#website\"},\"breadcrumb\":{\"@id\":\"https://docs.tuneplane.ai/en/quickstart#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.tuneplane.ai/en/quickstart#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Get started\",\"item\":\"https://docs.tuneplane.ai/en/index\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Quickstart\",\"item\":\"https://docs.tuneplane.ai/en/quickstart\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.tuneplane.ai/en/quickstart#article\",\"headline\":\"Quickstart\",\"name\":\"Quickstart\",\"description\":\"Install the CLI, submit a GRPO job, and see the first point land on the loss curve.\",\"url\":\"https://docs.tuneplane.ai/en/quickstart\",\"mainEntityOfPage\":{\"@id\":\"https://docs.tuneplane.ai/en/quickstart#webpage\"},\"dateModified\":\"2026-09-24T04:11:12.729Z\",\"publisher\":{\"@id\":\"https://docs.tuneplane.ai/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.tuneplane.ai#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"TunePlane\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"TunePlane","nav":{"global":null,"languages":[{"language":"en","default":true,"navbar":{"links":[{"href":"/","label":"Console"},{"href":"/en/quickstart","label":"Quickstart"}],"primary":{"type":"github","label":"GitHub","href":"https://github.com/tuneplane/tuneplane"}},"tabs":[{"tab":"Guides","icon":"book-open","groups":[{"group":"Get started","icon":"rocket","pages":[{"title":"TunePlane","sidebarTitle":"What is TunePlane","description":"Run LLM post-training jobs on shared GPUs, from a project on your own machine.","icon":"house","mode":"wide","href":"/en"},{"title":"Quickstart","icon":"rocket","href":"/en/quickstart"}]},{"group":"Core concepts","icon":"book-open","expanded":false,"pages":[{"title":"How TunePlane fits together","sidebarTitle":"Architecture","description":"Submission, execution control and telemetry have separate contracts and resource budgets.","icon":"layers","href":"/en/concepts/architecture"},{"title":"Glossary","icon":"book-a","href":"/en/concepts/glossary"},{"title":"How you ask for GPUs","sidebarTitle":"Resource model","icon":"cpu","href":"/en/concepts/resources"},{"title":"Job states","icon":"git-commit-horizontal","href":"/en/concepts/job-lifecycle"}]},{"group":"Train a model","icon":"flask-conical","expanded":false,"pages":[{"group":"Run a job","expanded":false,"pages":[{"title":"Start from an engineering solution","sidebarTitle":"Solutions","icon":"layers","href":"/en/guides/solutions"},{"title":"Create and tune an experiment","sidebarTitle":"Experiments","icon":"flask-conical","href":"/en/guides/experiments"},{"title":"Write the experiment config","sidebarTitle":"config.yaml","icon":"file-sliders","href":"/en/guides/config"},{"title":"Submit a training job","sidebarTitle":"Submit","icon":"send","href":"/en/guides/submit"},{"title":"Run a hyperparameter sweep","sidebarTitle":"Sweeps","icon":"grid-3x3","href":"/en/guides/sweep"},{"title":"Chain runs into a pipeline","sidebarTitle":"Pipelines","icon":"git-branch","href":"/en/guides/pipelines"}]},{"group":"Frameworks","expanded":false,"pages":[{"title":"Choose a method","sidebarTitle":"Method catalogue","icon":"library","href":"/en/guides/methods"},{"title":"Train with NeMo-RL","sidebarTitle":"NeMo-RL","icon":"cpu","href":"/en/guides/nemo-rl"},{"title":"Train with verl","sidebarTitle":"verl","icon":"boxes","href":"/en/guides/verl"},{"title":"Train with TRL","sidebarTitle":"TRL","icon":"sparkles","href":"/en/guides/trl"},{"title":"Train with OpenRLHF","sidebarTitle":"OpenRLHF","icon":"flame","href":"/en/guides/openrlhf"},{"title":"Train with ms-swift","sidebarTitle":"ms-swift","icon":"layers","href":"/en/guides/ms-swift"},{"title":"Train an image classifier","sidebarTitle":"PyTorch","icon":"flame","href":"/en/guides/pytorch"},{"title":"Bring your own trainer","sidebarTitle":"Custom training","icon":"wrench","href":"/en/guides/custom-training"},{"title":"Build a training image","sidebarTitle":"Custom images","icon":"box","href":"/en/guides/custom-images"}]},{"group":"Data","expanded":false,"pages":[{"title":"Publish and use a dataset","sidebarTitle":"Datasets","icon":"database","href":"/en/guides/datasets"},{"title":"Data shapes and design-lineage splits","sidebarTitle":"Data shapes and splits","icon":"shapes","href":"/en/guides/data-formats"},{"title":"Mount a governed folder","sidebarTitle":"Volumes","icon":"folder-lock","href":"/en/guides/volumes"},{"title":"Collect preference annotations","sidebarTitle":"Annotation","icon":"users","href":"/en/guides/annotation"}]}]},{"group":"Evaluate and serve","icon":"gauge","pages":[{"group":"Evaluation","expanded":false,"pages":[{"title":"Run a benchmark","sidebarTitle":"Benchmarks","icon":"gauge","href":"/en/guides/benchmarks"},{"title":"Score with a rubric","sidebarTitle":"Rubrics","icon":"ruler","href":"/en/guides/rubrics"},{"title":"Score hardware and RTL work","sidebarTitle":"RTL benchmarks","icon":"cpu","href":"/en/guides/rtl-benchmarks"}]},{"group":"Serving","expanded":false,"pages":[{"title":"Register and promote a model","sidebarTitle":"Model registry","icon":"package","href":"/en/guides/model-registry"},{"title":"Deploy a model version","sidebarTitle":"Deployments","icon":"boxes","href":"/en/guides/deployments"},{"title":"Chat with a checkpoint","sidebarTitle":"Playground","icon":"message-square","href":"/en/guides/playground"},{"title":"Turn production traffic into training data","sidebarTitle":"Reflow","icon":"recycle","href":"/en/guides/reflow"}]}]},{"group":"Agent environments","icon":"joystick","expanded":false,"pages":[{"title":"Train against an agent environment","sidebarTitle":"Using environments","icon":"bot","href":"/en/guides/agent-envs"},{"title":"Agent environments","sidebarTitle":"Environments","icon":"joystick","href":"/en/extend/environments"},{"title":"Verifiers","icon":"scale","href":"/en/extend/verifiers"}]},{"group":"Extend the platform","icon":"puzzle","expanded":false,"pages":[{"title":"Extension points","sidebarTitle":"Overview","icon":"puzzle","href":"/en/extend/overview"},{"title":"Plugin packages","sidebarTitle":"Plugin packages","icon":"package","href":"/en/extend/plugins"},{"title":"Algorithm plugins","sidebarTitle":"Algorithm plugins","icon":"code","href":"/en/extend/algorithm-plugins"},{"title":"Recipe packs","sidebarTitle":"Recipe packs","icon":"book-marked","href":"/en/extend/recipe-packs"},{"title":"Benchmark packs","sidebarTitle":"Benchmark packs","icon":"gauge","href":"/en/extend/benchmark-packs"},{"title":"Rubrics","icon":"ruler","href":"/en/extend/rubrics"}]},{"group":"Collaborate","icon":"users","expanded":false,"pages":[{"title":"Share a run with someone","sidebarTitle":"Sharing","icon":"share-2","href":"/en/guides/sharing"},{"title":"Work in a team","sidebarTitle":"Teams","icon":"users-round","href":"/en/guides/teams"}]},{"group":"Integrations","icon":"link","expanded":false,"pages":[{"title":"Connect an AI assistant over MCP","sidebarTitle":"MCP","icon":"plug","href":"/en/integrations/mcp"},{"title":"Link your Hugging Face account","sidebarTitle":"Hugging Face","icon":"box","href":"/en/integrations/huggingface"}]},{"group":"Reference","icon":"file-text","expanded":false,"pages":[{"title":"JobSpec","icon":"file-json","href":"/en/reference/jobspec"},{"title":"Job environment variables","sidebarTitle":"Job environment","icon":"variable","href":"/en/reference/job-env"}]},{"group":"Help","icon":"life-buoy","expanded":false,"pages":[{"title":"Troubleshooting","icon":"life-buoy","href":"/en/troubleshooting"},{"title":"FAQ","icon":"circle-help","href":"/en/faq"}]}]},{"tab":"API Reference","icon":"plug","pages":[{"title":"API Reference","href":"/en/api-reference/introduction"}]},{"tab":"CLI Reference","icon":"terminal","pages":[{"title":"CLI Reference","href":"/en/cli/overview"}]},{"tab":"Web Console","icon":"layout-dashboard","pages":[{"title":"Web Console","href":"/en/console/overview"}]},{"tab":"Deployment \u0026 Ops","icon":"server","pages":[{"title":"Deployment \u0026 Ops","href":"/en/ops/overview"}]}]},{"language":"zh-Hans","navbar":{"links":[{"href":"/","label":"控制台"},{"href":"/zh-Hans/quickstart","label":"快速开始"}],"primary":{"type":"github","label":"GitHub","href":"https://github.com/tuneplane/tuneplane"}},"pages":[{"title":"zh-Hans","href":"/zh-Hans/quickstart"}]}]},"title":"Quickstart - TunePlane","buildId":"dpl_7GUK3ixdQTF3BSNUQYJm8ibGxQWw","deploymentId":"dpl_7GUK3ixdQTF3BSNUQYJm8ibGxQWw","dynamics":["07c022d89b","a74be98ba7"],"chunks":["Frame-BUwlkhKf.js","DynamicMarkdown-CCag2O17.js","zoom-image-lightbox-BVI9Chd9.js","PlusIcon-dPxQtROk.js","lightbox-handle-r17bVUz3.js"]}