指南 3个标注团队操作手册:提升标注速度与质量

设置持久化存储

如果您在云端托管Label Studio,建议在与部署相同的云服务中为上传的任务数据、用户图片等设置持久化存储。

根据您的部署方式选择相关步骤。如果使用Docker Compose,请选择您希望用作持久存储的云服务:

设置 Amazon S3

将Amazon S3设置为在AWS中托管或使用Docker Compose部署的Label Studio的持久化存储。

创建S3存储桶

首先按照《Amazon Simple Storage Service用户指南》中的步骤创建S3存储桶

备注

如果您希望对存储在S3存储桶中的数据进行静态加密,可以按照《Amazon Simple Storage Service用户指南》中的步骤为Amazon S3存储桶设置默认服务器端加密

为S3存储桶配置CORS

备注

如果您打算使用直接文件上传功能并存储音频、视频、CSV等媒体文件,则需要完成此步骤。

设置对您存储桶的跨域资源共享(CORS)访问权限。请参阅Amazon S3用户指南中的配置跨域资源共享(CORS)。使用或修改以下示例:

[
  {
    "AllowedHeaders": [
      "*"
    ],
    "AllowedMethods": [
      "GET",
      "PUT",
      "POST",
      "DELETE",
      "HEAD"
    ],
    "AllowedOrigins": [
      "*"
    ],
    "ExposeHeaders": [
      "x-amz-server-side-encryption",
      "x-amz-request-id",
      "x-amz-id-2"
    ],
    "MaxAgeSeconds": 3600
  }
]

配置S3存储桶

创建S3存储桶后,设置必要的IAM权限以授予Label Studio访问您的存储桶的权限。您可以通过以下四种方式管理对S3存储桶的访问:

  • 设置一个带有OIDC提供商的IAM角色(推荐)。
  • 使用访问快捷键
  • 设置一个IAM角色,无需OIDC提供者。
  • 使用Docker Compose访问密钥

选择相关选项卡并按照您所需选项的步骤操作:

备注

要使用此方法设置IAM角色,您必须为集群配置并部署OIDC提供商。请参阅Amazon EKS用户指南中的为集群创建IAM OIDC提供商

  1. 按照步骤在Amazon EKS用户指南中为您的服务账户创建IAM角色和策略

  2. 使用以下IAM策略,将替换为您的存储桶名称:

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": [
            "s3:ListBucket"
          ],
          "Resource": [
            "arn:aws:s3:::"
          ]
        },
        {
          "Effect": "Allow",
          "Action": [
            "s3:PutObject",
            "s3:GetObject",
            "s3:DeleteObject"
          ],
          "Resource": [
            "arn:aws:s3:::/*"
          ]
        }
      ]
    }
  3. 使用集群OIDC提供商作为身份提供商,创建一个IAM角色作为Web身份

    • 从您的IAM控制台创建一个新的角色
    • 选择Web身份选项卡。
    • 身份提供商下拉菜单中,选择您EKS的OpenID Connect提供商URL,并将sts.amazonaws.com作为受众。
    • 将新创建的权限附加到角色并为其命名。
    • 检索下一步所需的角色ARN。
  4. 创建IAM角色后,将其作为注释添加到您的ls-values.yaml文件中。 可选地,您可以通过指定folder来选择文件夹(默认为""或省略此参数):

    global:
      persistence:
        enabled: true
        type: s3
        config:
          s3:
            bucket: ""
            region: ""
            folder: ""
    app:
      serviceAccount:
        annotations:
          eks.amazonaws.com/role-arn: arn:aws:iam:::role/
    
    rqworker:
      serviceAccount:
        annotations:
          eks.amazonaws.com/role-arn: arn:aws:iam:::role/
  1. 创建一个具有编程访问权限的IAM用户。详情请参阅AWS身份和访问管理用户指南中的在AWS账户中创建IAM用户

  2. 创建用户时,对于设置权限选项,选择直接附加现有策略

  3. 选择创建策略并附加以下策略,将替换为您的存储桶名称:

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": [
            "s3:ListBucket"
          ],
          "Resource": [
            "arn:aws:s3:::"
          ]
        },
        {
          "Effect": "Allow",
          "Action": [
            "s3:PutObject",
            "s3:GetObject",
            "s3:DeleteObject"
          ],
          "Resource": [
            "arn:aws:s3:::/*"
          ]
        }
      ]
    }
  4. 创建用户后,请将用户名和访问密钥保存在安全的地方。

  5. 使用新创建的访问密钥ID和密钥更新您的ls-values.yaml文件,替换。 可选地,您可以通过指定folder参数选择文件夹(默认为""或省略此参数):

    global:
      persistence:
        enabled: true
        type: s3
        config:
          s3:
            accessKey: ""
            secretKey: ""
            bucket: ""
            region: ""
            folder: ""

备注

可选地,您可以使用现有的Kubernetes密钥和密钥。

  1. 使用您的AWS访问密钥创建Kubernetes密钥:
    kubectl create secret generic  --from-literal=accesskey= --from-literal=secretkey=
  2. 使用新创建的Kubernetes密钥更新您的ls-values.yaml文件:
    global:
      persistence:
        enabled: true
        type: s3
        config:
          s3:
            accessKeyExistingSecret: ""
            accessKeyExistingSecretKey: "accesskey"
            secretKeyExistingSecret: ""
            secretKeyExistingSecretKey: "secretkey"
            bucket: ""
            region: ""

要在EKS中不使用OIDC创建IAM角色,请按照以下步骤操作。

  1. 在AWS控制台界面中,前往EKS > 集群 > YOUR_CLUSTER_NAME > 节点组

  2. 选择已部署Label Studio的YOUR_NODE_GROUP名称。

  3. 详情页面,找到并选择Node IAM角色ARN选项,然后选择直接附加现有策略

  4. 选择创建策略并附加以下策略,将替换为您的存储桶名称:

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": [
            "s3:ListBucket"
          ],
          "Resource": [
            "arn:aws:s3:::"
          ]
        },
        {
          "Effect": "Allow",
          "Action": [
            "s3:PutObject",
            "s3:GetObject",
            "s3:DeleteObject"
          ],
          "Resource": [
            "arn:aws:s3:::/*"
          ]
        }
      ]
    }
  5. 添加IAM策略后,配置您的ls-values.yaml文件。 可选地,您可以通过指定folder来选择文件夹(默认为""或省略此参数):

    global:
      persistence:
        enabled: true
        type: s3
        config:
          s3:
            bucket: ""
            region: ""
            folder: ""
  1. 创建一个具有编程访问权限的IAM用户。详情请参阅AWS身份和访问管理用户指南中的在AWS账户中创建IAM用户

  2. 创建用户时,对于设置权限选项,选择直接附加现有策略

  3. 选择创建策略并附加以下策略,将替换为您的存储桶名称:

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": [
            "s3:ListBucket"
          ],
          "Resource": [
            "arn:aws:s3:::"
          ]
        },
        {
          "Effect": "Allow",
          "Action": [
            "s3:PutObject",
            "s3:GetObject",
            "s3:DeleteObject"
          ],
          "Resource": [
            "arn:aws:s3:::/*"
          ]
        }
      ]
    }
  4. 创建用户后,请将用户名和访问密钥保存在安全的地方。

  5. 更新您的env.list文件,将替换为您新创建的访问密钥ID和密钥。可选地,您可以使用STORAGE_AWS_FOLDER指定一个文件夹(默认为""或省略此参数):

    STORAGE_TYPE=s3
    STORAGE_AWS_ACCESS_KEY_ID=""
    STORAGE_AWS_SECRET_ACCESS_KEY=""
    STORAGE_AWS_BUCKET_NAME=""
    STORAGE_AWS_REGION_NAME=""
    STORAGE_AWS_FOLDER=""

设置Google云存储

将Google Cloud Storage (GCS)设置为在Google Cloud Platform (GCP)或Docker Compose中托管的Label Studio的持久化存储。

创建GCS存储桶

  1. 首先创建一个存储桶。参考Google云存储指南中的创建存储桶。例如,创建一个名为heartex-example-bucket-123456的存储桶。
  2. 当为存储桶选择访问控制方法时,请选择统一访问控制
  3. 创建一个IAM服务账号。详情请参阅Google Cloud Storage指南中的创建和管理服务账号
  4. 选择预定义的存储对象管理员IAM角色添加到服务账户,以便该账户可以创建、访问和删除存储桶中的对象。
  5. Add a condition to the role that restricts the role to access only objects that belong to the bucket you created. You can add a condition in one of two ways:
    • Select Add Condition when setting up the service account IAM role, then use the Condition Builder to specify the following values:
      • 条件类型: Name
      • 运算符: Starts with
      • 值: projects/_/buckets/heartex-example-bucket-123456
    • 或者,使用通用表达式语言 (CEL) 来指定IAM条件。例如,设置如下:resource.name.startsWith('projects/_/buckets/heartex-example-bucket-123456')。参阅Google Cloud Storage指南中的IAM条件概述中的CEL条件

为GCS存储桶配置CORS

备注

如果您打算使用直接文件上传功能并存储音频、视频、CSV等媒体文件,则需要完成此步骤。

设置对您存储桶的CORS访问权限。请参阅Google云用户指南中的配置跨源资源共享(CORS)。使用或修改以下示例:

echo '[
   {
      "origin": ["*"],
      "method": ["GET","PUT","POST","DELETE","HEAD"],
      "responseHeader": ["Content-Type","Access-Control-Allow-Origin"],
      "maxAgeSeconds": 3600
   }
]' > cors-config.json

将以下命令中的YOUR_BUCKET_NAME替换为您实际的存储桶名称,以更新存储桶的CORS设置:

gsutil cors set cors-config.json gs://YOUR_BUCKET_NAME

配置GCS存储桶

您可以通过工作负载身份访问密钥将Label Studio连接到您的GCS存储桶。

创建存储桶并设置IAM权限后,将Label Studio连接到您的GCS存储桶。您可以通过以下三种方式连接到存储桶:

  • 使用工作负载身份(Workload Identity)允许GKE中的工作负载通过模拟您创建的服务账号来访问GCS存储桶(推荐)。
  • 创建服务账号密钥以便在Google Cloud外部使用该服务账号。
  • 创建一个服务账号密钥以用于Docker Compose。

备注

确保您的GKE集群已启用工作负载身份并满足必要前提条件。请参阅Google Kubernetes Engine指南中的使用工作负载身份

  1. 设置以下环境变量,将您创建的服务账号指定为GCP_SA变量,并根据需要替换<>中的其他引用:

    GCP_SA=
    APP_SA="serviceAccount:.svc.id.goog[/-lse-app]"
    WORKER_SA="serviceAccount:.svc.id.goog[/-lse-rqworker]"
  2. 在您的Kubernetes集群服务账户与创建的GCS服务账户之间建立IAM策略绑定,允许Label Studio应用及其相关rqworkers的K8s服务账户模拟另一个服务账户。从命令行运行以下命令:

    gcloud iam service-accounts add-iam-policy-binding ${GCP_SA} \
        --role roles/iam.workloadIdentityUser \
        --member "${APP_SA}"
    gcloud iam service-accounts add-iam-policy-binding ${GCP_SA} \
        --role roles/iam.workloadIdentityUser \
        --member "${WORKER_SA}"
  3. 绑定服务账号后,更新您的ls-values.yaml文件以包含服务账号和其他配置的值。更新projectIDbucket,并将替换为部署相关的实际值。 可选地,您可以通过指定folder来选择文件夹(默认为""或省略此参数):

    global:
      persistence:
        enabled: true
        type: gcs
        config:
          gcs:
            projectID: ""
            bucket: ""
            folder: ""
    app:
      serviceAccount:
        annotations:
          iam.gke.io/gcp-service-account: ""
    
    rqworker:
      serviceAccount:
        annotations:
          iam.gke.io/gcp-service-account: ""

您可以使用自己创建的服务账号密钥,或者如果已有Kubernetes密钥和密钥对,请按照以下步骤来使用它们。

创建新的服务账户密钥

  1. 从用户界面创建服务账号密钥并下载JSON文件。按照Google Cloud身份与访问管理指南中的创建和管理服务账号密钥步骤操作。

  2. 下载完服务账号密钥的JSON文件后,在您的ls-values.yaml文件中更新或创建对JSON、项目ID和存储桶的引用。 可选地,您可以通过指定folder来选择文件夹(默认为""或省略此参数):

    global:
      persistence:
        enabled: true
        type: gcs
        config:
          gcs:
            projectID: ""
            applicationCredentialsJSON: ""
            bucket: ""
            folder: ""

使用现有的Kubernetes密钥和密钥

  1. 使用您的GCS服务账号JSON文件创建一个Kubernetes密钥,将替换为服务账号JSON文件的路径:

    kubectl create secret generic  --from-file=key_json=
  2. 使用新创建的Kubernetes密钥更新您的ls-values.yaml文件:

    global:
       persistence:
          enabled: true
          type: gcs
          config:
             gcs:
                projectID: ""
                applicationCredentialsJSONExistingSecret: ""
                applicationCredentialsJSONExistingSecretKey: "key_json"
                bucket: ""
  1. 从用户界面创建服务账号密钥并下载JSON文件。按照Google Cloud身份与访问管理指南中的创建和管理服务账号密钥步骤操作。

  2. 下载完服务账号密钥的JSON文件后,在您的env.list文件中更新或创建对JSON、项目ID和存储桶的引用。 可选地,您可以通过指定STORAGE_GCS_FOLDER来选择文件夹(默认为""或省略此参数):

    STORAGE_TYPE=gcs
    STORAGE_GCS_BUCKET_NAME=""
    STORAGE_GCS_PROJECT_ID=""
    STORAGE_GCS_FOLDER=""
    GOOGLE_APPLICATION_CREDENTIALS="/opt/heartex/secrets/key.json"
  3. 将步骤1中下载的JSON文件放置在与env.list文件相同的目录中。

  4. docker-compose.yml文件中为app.volumes路径添加以下条目:

    - ./service-account-file.json:/opt/heartex/secrets/key.json:ro

设置 Microsoft Azure 存储

创建一个Microsoft Azure存储容器,用作Label Studio的持久化存储。

创建存储容器

  1. 创建一个Azure存储账户。详情请参阅Microsoft Azure产品文档中的创建存储账户

备注

请确保将库存单位(SKU)设置为Premium_LRS,并将kind参数设为BlockBlobStorage。此配置将使用固态硬盘(SSD)而非标准机械硬盘(HDD)作为存储介质。若将该参数设置为基于HDD的存储选项,您的实例可能会运行过慢甚至出现故障。

  1. Azure Portal存储账户 > 访问密钥部分查找生成的密钥,或通过运行以下命令获取:

    az storage account keys list --account-name=${STORAGE_ACCOUNT}
  2. 按照Microsoft Azure产品文档中使用Azure门户上传、下载和列出Blob的步骤在您的存储账户中创建存储容器,或运行以下命令:

    az storage container create --name  \
              --account-name  \
              --account-key ""

为Azure存储桶配置CORS

备注

如果您打算使用直接文件上传功能并存储音频、视频、CSV等媒体文件,则需要完成此步骤。

设置对您存储桶的CORS访问权限。请参阅Azure用户指南中的配置跨域资源共享(CORS)。使用或修改以下示例:

<Cors>
    <CorsRule>
        <AllowedOrigins>*</AllowedOrigins>
        <AllowedMethods>GET,PUT,POST,DELETE,HEAD</AllowedMethods>
        <AllowedHeaders>x-ms-blob-content-type</AllowedHeaders>
        <ExposedHeaders>x-ms-*</ExposedHeaders>
        <MaxAgeInSeconds>3600</MaxAgeInSeconds>
    </CorsRule>
<Cors>

配置Azure容器

您可以通过Kubernetes中的账户密钥或Docker Compose中的账户密钥,将Label Studio连接到您的Azure容器。请选择与您的Label Studio部署相关的选项。

使用您创建的YOUR_CONTAINER_NAMEYOUR_STORAGE_ACCOUNTYOUR_STORAGE_KEY更新您的ls-values.yaml文件。 可选地,您可以通过指定folder来选择文件夹(默认为""或省略此参数):

global:
  persistence:
    enabled: true
    type: azure
    config:
      azure:
        storageAccountName: "<YOUR_STORAGE_ACCOUNT>"
        storageAccountKey: "<YOUR_STORAGE_KEY>"
        containerName: "<YOUR_CONTAINER_NAME>"
        folder: ""

如果您已有现有密钥,可以直接使用它来创建Kubernetes密钥。

  1. 使用您的Azure访问密钥创建Kubernetes密钥:
    kubectl create secret generic  --from-literal=storageaccountname= --from-literal=storageaccountkey=
  2. 使用新创建的Kubernetes密钥更新您的ls-values.yaml文件:
    global:
       persistence:
          enabled: true
          type: azure
          config:
             azure:
                storageAccountNameExistingSecret: ""
                storageAccountNameExistingSecretKey: "storageaccountname"
                storageAccountKeyExistingSecret: ""
                storageAccountKeyExistingSecretKey: "storageaccountkey"
                containerName: ""

在您的env.list文件中更新您创建的YOUR_CONTAINER_NAMEYOUR_STORAGE_ACCOUNTYOUR_STORAGE_KEY。 可选地,您可以通过指定STORAGE_AZURE_FOLDER来选择文件夹(默认为""或省略此参数):

STORAGE_TYPE=azure
STORAGE_AZURE_ACCOUNT_NAME="<YOUR_STORAGE_ACCOUNT>"
STORAGE_AZURE_ACCOUNT_KEY="<YOUR_STORAGE_KEY>"
STORAGE_AZURE_CONTAINER_NAME="<YOUR_CONTAINER_NAME>"
STORAGE_AZURE_FOLDER=""