> ## Documentation Index
> Fetch the complete documentation index at: https://docs.tuneplane.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# 配置团队与配额

> 创建团队、设置保障额度、给小时定价，并打开借用。

```bash theme={"theme":{"light":"github-light","dark":"github-dark-dimmed"}}
curl -X POST https://tuneplane.your-company.com/api/teams \
  -H "Authorization: Bearer $TUNEPLANE_CLIENT_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"key": "ml-platform", "display_name": "ML Platform"}'
```

或者在控制台里 **Administration → Teams → New team**，多数事情是在那里做的。见
[团队页](/zh-Hans/console/teams)。

团队是商业版的一部分。一个只有一个部门在用集群的部署完全不需要它：所有人在一个团队里，任何团队
gate 都不会触发。

## 开始之前

* 装好一个商业许可证。没有它，Teams 入口对管理员出现，点进去的页面会说明缺什么。
* 先设好按用户的配额，因为团队配额是**和它们并行**生效的，不是替代它们。见
  [角色与配额](/zh-Hans/ops/roles-and-quotas)。

## 创建一个团队

```bash theme={"theme":{"light":"github-light","dark":"github-dark-dimmed"}}
curl -X POST .../api/teams -d '{"key": "ml-platform", "display_name": "ML Platform"}'
```

**key** 是永久的。它出现在 URL 和账单里，接受小写字母、数字、`-` 和 `_`，最长 64 字符。团队可以
嵌套，所以一个团队可以指定一个父团队。

## 把项目放进去

一次运行的团队来自它的**项目**，从不来自提交它的人：

```bash theme={"theme":{"light":"github-light","dark":"github-dark-dimmed"}}
curl -X PUT .../api/teams/project -d '{"project": "support-agent", "team": "ml-platform"}'
```

这条规则的两半都很关键。一个人可以属于多个团队，所以按团队成员求和会把一次运行算到所有团队头上。
而团队在提交时盖在作业行上，所以把一个项目在部门之间挪动，不会改写上个季度的用量。

## 设置配额

```bash theme={"theme":{"light":"github-light","dark":"github-dark-dimmed"}}
curl -X PUT ".../api/teams/ml-platform/quota?max_concurrent_gpus=64&max_concurrent_jobs=20&daily_gpu_hours=800"
```

有两条语义和按用户的那套正好相反，而且都是有意的：

|     | 按用户      | 团队                             |
| --- | -------- | ------------------------------ |
| 没配置 | 上限为零     | **没有上限。** 创建一个团队不能成为封死里面每个人的手段 |
| 管理员 | 在某些检查里豁免 | **不豁免。** 跳过一个团队的预算是在花另一个部门的钱   |

## 加成员

手工加，或者配好单点登录的组映射，让他们在下次登录时进来。组映射是能扩展的那种：一个成员关系在
两个地方维护的团队，是一个在其中一个地方是错的团队。

```bash theme={"theme":{"light":"github-light","dark":"github-dark-dimmed"}}
curl -X PUT .../api/teams/ml-platform/members -d '{"members": [{"username": "alice", "role": "owner"}]}'
```

团队内部的角色是 `owner`、`member` 和 `viewer`。

## 打开借用

开了抢占之后，团队配额不再是上限，而变成一个**保障额度**：集群空闲时一个团队可以跑到它之上，超出
的那部分变成可回收的。

借用和回收是**一个开关**。只借不能要回来，比它替代掉的那个硬上限更糟：一个大量借用的团队会坐在
它的拥有者拿不回来的卡上。

一个正在跑的作业被回收之前，五个条件必须全部成立：

1. 索取方的团队低于自己的保障额度。否则这只是一个团队在竞价压过另一个。
2. 被回收方的团队高于自己的保障额度。否则回收会打破配额唯一的那个承诺。
3. 是不同的团队。
4. 被回收方的作业已经跑过一个最短运行时间。否则一个繁忙的队列会整天地回收、准入、再回收，而集群把
   时间花在写 checkpoint 上。
5. 被回收方持有的正是紧缺的那个卡型。

先拿最年轻的，有意不是优先级最低的：优先级排的是谁下一个跑，那是用同一个数字回答的另一个问题。

被回收的作业会被暂停、checkpoint 保留，然后回到 `QUEUED`。

## 给小时定价

账单加一个价格，不重新测量任何东西。小时数来自[用量](/zh-Hans/console/usage)页显示的同一套计量，
因为"我们到底用了多少"的第二个定义，是一个没人能裁决的争论。

```bash theme={"theme":{"light":"github-light","dark":"github-dark-dimmed"}}
curl -X PUT .../api/billing/teams/ml-platform/budget -d '{"budget_micros": 5000000000}'
```

钱从头到尾是整数微单位。按卡型设费率；没有设费率的卡型会被列在**未定价 series**下，而不是被静悄悄
折进零。

超出月度预算的团队会排队而不是失败，而一个确实等不了的单次运行可以通过
[审批](/zh-Hans/console/approvals)申请一次性例外。

## 确认成功

```bash theme={"theme":{"light":"github-light","dark":"github-dark-dimmed"}}
curl -H "Authorization: Bearer $TUNEPLANE_CLIENT_TOKEN" \
  https://tuneplane.your-company.com/api/teams/ml-platform/usage
```

返回这个团队这一周期的小时数。然后让团队里的某个人提交一个作业，检查它的页面点名的是那个团队，
而不只是提交人。

一份在拒绝工作的团队配额会点出自己：`teamQuota` 会用团队的 key 把底层原因包起来，所以一个排队中的
作业会说清它在等哪个团队的上限。

## 下一步

[团队页](/zh-Hans/console/teams) · [账单](/zh-Hans/console/billing) ·
[在团队中工作](/zh-Hans/guides/teams) · [角色与配额](/zh-Hans/ops/roles-and-quotas)
