{"id":2980,"date":"2026-09-23T09:21:06","date_gmt":"2026-09-23T00:21:06","guid":{"rendered":"https:\/\/localmodelwatch.tsuchitsuchi.com\/2026\/09\/23\/together-ai-canary-rollouts-2\/"},"modified":"2026-09-23T09:21:06","modified_gmt":"2026-09-23T00:21:06","slug":"together-ai-canary-rollouts-2","status":"publish","type":"post","link":"https:\/\/localmodelwatch.tsuchitsuchi.com\/en\/2026\/09\/23\/together-ai-canary-rollouts-2\/","title":{"rendered":"Together AI Announces Canary Rollouts for Zero-Downtime Updates"},"content":{"rendered":"<p><!-- lmw:facts --><\/p>\n<h2>At a Glance<\/h2>\n<div class=\"lmw-table-scroll\" tabindex=\"0\" style=\"overflow-x:auto;-webkit-overflow-scrolling:touch;max-width:100%;\">\n<table style=\"width:max-content;min-width:100%;border-collapse:collapse;\">\n<thead>\n<tr>\n<th>Item<\/th>\n<th>Value<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Publisher<\/td>\n<td>Together AI<\/td>\n<\/tr>\n<tr>\n<td>Published<\/td>\n<td>2026-09-22<\/td>\n<\/tr>\n<tr>\n<td>Source type<\/td>\n<td>Primary source (the publisher itself)<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p><em>Values determined by this site&#8217;s code at collection time. Dates are JST.<\/em><\/p>\n<p><!-- \/lmw:facts --><\/p>\n<h2>Overview<\/h2>\n<p>Together AI has released &#8220;Canary Rollouts,&#8221; a phased update methodology for zero-downtime model updates in production. This method gradually migrates traffic from a current model (Source) to a new checkpoint or a new model family (Target) according to defined steps.<\/p>\n<h2>Claims and Evidence<\/h2>\n<p>Together AI claims that by using Canary Rollouts, users can automatically detect performance degradation or errors that may occur when transitioning to a new model through automated metric checks (Metric Gates), providing a mechanism to safely roll back.<\/p>\n<p>In demonstrations by the presenters, when conducting a Canary Rollout from Qwen2.5-7B to Qwen3.5-9B, the gate detected a 137% regression in p95 latency at 10% traffic. At this point, the system automatically entered the &#8220;SYSTEM_PAUSED&#8221; state, and it is reported that users could cancel the rollout and execute it in reverse to return to the original state without failing live requests.<\/p>\n<p>A comparison of the three strategies provided is as follows:<\/p>\n<div class=\"lmw-table-scroll\" tabindex=\"0\" style=\"overflow-x:auto;-webkit-overflow-scrolling:touch;max-width:100%;\">\n<table style=\"width:max-content;min-width:100%;border-collapse:collapse;\">\n<thead>\n<tr>\n<th style=\"text-align: left;\">Feature<\/th>\n<th style=\"text-align: left;\">Canary<\/th>\n<th style=\"text-align: left;\">Blue-green<\/th>\n<th style=\"text-align: left;\">Rolling<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"text-align: left;\">Traffic Pattern<\/td>\n<td style=\"text-align: left;\">Maintains defined shares (default 5% \u2192 25% \u2192 50% \u2192 100%) at each step<\/td>\n<td style=\"text-align: left;\">Bulk switch from 0% to 100%<\/td>\n<td style=\"text-align: left;\">Sequentially replaces per replica, moving traffic according to replica ratio<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\">Additional Capacity<\/td>\n<td style=\"text-align: left;\">Amount close to Source size. Target grows by 1 step before Source is drained<\/td>\n<td style=\"text-align: left;\">Both deployments run at full size until Source is drained<\/td>\n<td style=\"text-align: left;\">Source replicas per count at each step. Requires 1 additional replica during the step<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\">Typical Duration<\/td>\n<td style=\"text-align: left;\">Initial cold start + wait time per step (at least 390s per step when using metric gates)<\/td>\n<td style=\"text-align: left;\">Initial cold start + 30s propagation time. Around a few minutes<\/td>\n<td style=\"text-align: left;\">Cold start per replica. Slower for large deployments<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\">Metric Gates<\/td>\n<td style=\"text-align: left;\">Yes (after each step)<\/td>\n<td style=\"text-align: left;\">No (due to no wait time)<\/td>\n<td style=\"text-align: left;\">No<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\">How to Revert<\/td>\n<td style=\"text-align: left;\">Fix current share by cancellation and execute rollout in reverse<\/td>\n<td style=\"text-align: left;\">Execute rollout in reverse. Can temporarily preserve old model with <code>--final-source-replicas 1<\/code><\/td>\n<td style=\"text-align: left;\">Execute rollout in reverse<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\">Best Used For<\/td>\n<td style=\"text-align: left;\">When you want to measure on live traffic before 100% migration<\/td>\n<td style=\"text-align: left;\">Fastest switch when short-term double capacity can be tolerated<\/td>\n<td style=\"text-align: left;\">When GPU footprint must be kept constant, or for engine\/configuration changes of the same model<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<h2>Prerequisites<\/h2>\n<p>The conditions for this method and feature to operate are as follows:<\/p>\n<ul>\n<li><strong>Target Software<\/strong>: Together AI platform, and the <code>together<\/code> Python package (version 2.34.0 or later)<\/li>\n<li><strong>Operation Interface<\/strong>: CLI (<code>tg<\/code> command), REST API, or console<\/li>\n<li><strong>Available Metrics<\/strong>: Three types: <code>router_error_rate<\/code>, <code>router_latency<\/code>, and <code>inflight_requests<\/code><\/li>\n<li><strong>Metric Constraints<\/strong>:<br \/>\n        * <code>router_latency<\/code> gate evaluation requires at least 20 requests within the window * <code>p99<\/code> evaluation requires at least 100 requests within the window * <code>router_error_rate<\/code> and <code>inflight_requests<\/code> require at least 1 data point within the window<\/li>\n<\/ul>\n<h2>Reproducibility<\/h2>\n<p>Users utilizing the Together AI platform can implement and control Canary Rollouts via the following methods:<\/p>\n<h3>Operation via CLI<\/h3>\n<p>You can use the <code>tg<\/code> command to create, start, monitor, and control rollouts. For example, you can start a 3-step Canary Rollout (10%, 50%, 100%) while monitoring for p95 latency regression with the following command:<\/p>\n<pre><code class=\"language-bash\"># Create and start rollout simultaneously\ntg beta endpoints rollout $TARGET_DEPLOYMENT_ID \\\n--source $SOURCE_DEPLOYMENT_ID \\\n--canary \\\n--steps 10,50,100 \\\n--interval 600s \\\n--metric router_latency --metric-stat p95 \\\n--metric-max-regression 10 --metric-direction higher-is-worse \\\n--metric-window 300s\n<\/code><\/pre>\n<p>You can also check the status of the rollout, or pause (<code>--pause<\/code>), resume (<code>--resume<\/code>), promote (<code>--promote<\/code>), and cancel (<code>--cancel<\/code>) using the following commands:<\/p>\n<pre><code class=\"language-bash\"># Check rollout status\ntg beta endpoints get $ROLLOUT_ID\n\n# Cancel rollout\ntg beta endpoints rollout $ENDPOINT_ID --cancel --reason &quot;latency regression on target&quot;\n<\/code><\/pre>\n<h3>Operation via Python SDK<\/h3>\n<p>You can control rollouts programmatically using the <code>together<\/code> package (2.34.0 or later).<\/p>\n<pre><code class=\"language-python\">from together import Together\nclient = Together()\n\nrollout = client.beta.endpoints.rollouts.create(\n    endpoint_id=ENDPOINT_ID,\n    project_id=PROJECT_ID,\n    source_deployment_id=SOURCE_DEPLOYMENT_ID,\n    target_deployment_id=TARGET_DEPLOYMENT_ID,\n    canary={&quot;steps&quot;: [{&quot;traffic&quot;: 10}, {&quot;traffic&quot;: 50}, {&quot;traffic&quot;: 100}], &quot;step_interval&quot;: &quot;600s&quot;},\n    metrics=[{\n        &quot;name&quot;: &quot;router_latency&quot;, \n        &quot;stat&quot;: &quot;METRIC_STAT_TYPE_PERCENTILE&quot;, \n        &quot;percentile&quot;: 95,\n        &quot;regression_check&quot;: {\n            &quot;direction&quot;: &quot;REGRESSION_DIRECTION_HIGHER_IS_WORSE&quot;, \n            &quot;max_regression_percent&quot;: 10\n        },\n        &quot;window&quot;: &quot;300s&quot;,\n    }],\n)\nclient.beta.endpoints.rollouts.start(rollout.id, project_id=PROJECT_ID, endpoint_id=ENDPOINT_ID)\n<\/code><\/pre>\n<h3>Operation via REST API<\/h3>\n<p>Through the API, you can create and start rollouts with a <code>POST<\/code> request, and retrieve status with a <code>GET<\/code> request.<\/p>\n<p><!-- lmw:related --><\/p>\n<h2>Related Articles<\/h2>\n<ul>\n<li><a href=\"https:\/\/localmodelwatch.tsuchitsuchi.com\/en\/2026\/09\/19\/scaling-coding-agent-traffic-glm-52-together-ai\/\">Scaling Coding Agent Traffic with GLM-5.2 and Dedicated Inference<\/a><\/li>\n<li><a href=\"https:\/\/localmodelwatch.tsuchitsuchi.com\/en\/2026\/09\/10\/together-ai-open-source-ai-stack-and-might-stack\/\">Together AI Explains Open-Source AI Stack and MIGHT Stack<\/a><\/li>\n<\/ul>\n<p><!-- \/lmw:related --><\/p>\n<h2>Sources<\/h2>\n<ul>\n<li><a href=\"https:\/\/www.together.ai\/blog\/canary-rollouts-upgrade-models-in-production-without-downtime\">Canary rollouts: upgrade models in production without downtime<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Together AI introduces Canary Rollouts for zero-downtime production model updates, featuring automated metric gates and gradual traffic migration.<\/p>\n","protected":false},"author":1,"featured_media":2979,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1528],"tags":[2072,2074,2076,590,870,1547],"class_list":["post-2980","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-technical-reports","tag-api-en","tag-canary-rollouts-en","tag-cli-en","tag-python-en","tag-together-ai-en","tag-verified"],"lang":"en","translations":{"en":2980,"ja":2978},"_links":{"self":[{"href":"https:\/\/localmodelwatch.tsuchitsuchi.com\/en\/wp-json\/wp\/v2\/posts\/2980","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/localmodelwatch.tsuchitsuchi.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/localmodelwatch.tsuchitsuchi.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/localmodelwatch.tsuchitsuchi.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/localmodelwatch.tsuchitsuchi.com\/en\/wp-json\/wp\/v2\/comments?post=2980"}],"version-history":[{"count":0,"href":"https:\/\/localmodelwatch.tsuchitsuchi.com\/en\/wp-json\/wp\/v2\/posts\/2980\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/localmodelwatch.tsuchitsuchi.com\/en\/wp-json\/wp\/v2\/media\/2979"}],"wp:attachment":[{"href":"https:\/\/localmodelwatch.tsuchitsuchi.com\/en\/wp-json\/wp\/v2\/media?parent=2980"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/localmodelwatch.tsuchitsuchi.com\/en\/wp-json\/wp\/v2\/categories?post=2980"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/localmodelwatch.tsuchitsuchi.com\/en\/wp-json\/wp\/v2\/tags?post=2980"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}