ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Label Studio 故障排查全指南:安装、标注、云存储与 ML 后端常见问题定位与修复

Label Studio 故障排查全指南:安装、标注、云存储与 ML 后端常见问题定位与修复 Label Studio 故障排查全指南安装、标注、云存储与 ML 后端常见问题定位与修复【免费下载链接】label-studioLabel Studio is a multi-type data labeling and annotation tool with standardized output format项目地址: https://gitcode.com/GitHub_Trending/la/label-studio本篇指南以 Label Studio 社区版官方故障排查文档为核心系统梳理从安装启动、项目加载、标注性能、云存储S3/GCS/Azure/本地文件同步到预标注与 ML 机器学习后端接入过程中的高频故障场景并逐一给出可复现的定位步骤与修复方案。阅读本文后你将掌握如何通过浏览器控制台、服务端日志、/django-rq管理页、curl健康检查等工具快速定位问题并能够正确处理 CORS、403 权限、任务同步、预测结果不可见、ML 超时与 Docker 部署等典型难题。适用范围说明本文面向 Label Studio 社区版Community Edition的常见用户侧问题。Label Studio Enterprise 的专属问题请参考官方支持中心的文章见仓库 docs/source/guide/troubleshooting.md 页首说明。安装阶段问题排查安装类问题请直接参考专门的安装排障指南 docs/source/guide/install_troubleshoot.md其中覆盖了依赖冲突、数据库初始化失败、端口占用等安装与启动过程中的常见报错。本文后续章节聚焦启动成功之后、日常使用中出现的各类问题。项目页面加载异常打开项目时出现空白页Label Studio 启动并打开项目后页面空白可能由多种原因导致最常见的是启动时指定的 host 缺少协议前缀。如果在启动 Label Studio 时指定的 host 没有携带http://或https://协议头Label Studio 可能无法正确定位加载项目页面所需的静态资源文件从而渲染出空白页。修复方式更新启动参数或环境变量中指定的 host确保其包含完整协议前缀。具体启动方式参见 docs/source/guide/start.md。例如# 错误示例缺少协议前缀 label-studio start --host 192.168.1.10 --port 8080 # 正确示例在浏览器访问时需以 http:// 或 https:// 开头 # label-studio start --host 0.0.0.0 --port 8080标注过程常见问题标注速度明显变慢标注缓慢通常与数据库负载和标注配置规模相关可按以下顺序排查SQLite 数据库负载过高如果服务使用默认的 SQLite 数据库且其他用户正在导入大批量数据数据库的读写压力会导致同一台服务器上所有标注用户的操作变慢。SQLite 不擅长并发写这是由其架构决定的。错峰导入大批量数据如需上传成千上万条数据建议选择无人标注的时段执行或者改用 PostgreSQL、Redis 等更适合并发场景的数据库后端。可以直接在 Label Studio 仓库根目录使用 Docker Compose 一键切换 PostgreSQLdocker-compose up -d仓库内的 docker-compose.yml 定义了完整的服务编排。此外也可以不经过数据库直接同步云存储或数据库存储中的数据参见 docs/source/guide/storage.md。标签规模过大如果标注配置中定义了成千上万个标签界面渲染与交互会显著变慢建议改用外部分类体系Taxonomy标签来承载大规模层级标签而不是平铺几千个Label。图片/音频/资源加载失败CORS 问题标注时图片、音频等资源加载不出来最常见的原因是CORS跨域资源共享问题当你尝试从外部托管拉取图片时浏览器会出于安全策略拦截跨域请求。定位方法打开浏览器开发者工具F12的控制台Console面板查看具体的报错信息。如果确认是 CORS 拦截通常需要在资源所在的外部主机侧放行跨域访问能管理托管服务器在 Web 服务器配置中为对应 location 开放 CORS 响应头。例如在 nginx 的/etc/nginx/nginx.conf中往location段加入如下配置location YOUR_LOCATION { if ($request_method OPTIONS) { add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Methods GET, POST, OPTIONS; # # Custom headers and headers various browsers *should* be OK with but arent # add_header Access-Control-Allow-Headers DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range; # # Tell client that this pre-flight info is valid for 20 days # add_header Access-Control-Max-Age 1728000; add_header Content-Type text/plain; charsetutf-8; add_header Content-Length 0; return 204; } if ($request_method POST) { add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Methods GET, POST, OPTIONS; add_header Access-Control-Allow-Headers DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range; add_header Access-Control-Expose-Headers Content-Length,Content-Range; } if ($request_method GET) { add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Methods GET, POST, OPTIONS; add_header Access-Control-Allow-Headers DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range; add_header Access-Control-Expose-Headers Content-Length,Content-Range; } }这段配置覆盖了浏览器的 OPTIONS 预检请求以及实际的 GET/POST 请求Access-Control-Max-Age 1728000让预检结果在 20 天内免于重复发送。使用云对象存储Amazon S3、Google Cloud StorageGCS、Microsoft Azure Storage 各自都有独立的 CORS 配置入口请分别在其控制台或 API 中为你的存储桶bucket配置 CORS 规则S3 参考其用户指南中的 CORS 章节GCS 参考其配置 CORS 文档Azure 参考其 CORS 支持文档。使用本地静态文件服务器如果通过python -m http.server 8081 -d这类简易服务器托管数据它默认不携带 CORS 头。可以改用支持 CORS 的http-servernpm install http-server -g http-server -p 3000 --cors不是所有主机都支持 CORS 配置但如果托管方提供了管理后台可以尝试在其中查找并开启 CORS 相关设置。音频波形与标注不一致标注完音频数据后发现界面上显示的波形与时间戳、实际声音不匹配常见原因是音频编码格式兼容性问题。例如标注的是 mp3 文件时其帧结构与浏览器波形渲染可能存在偏差建议转换为 wav 格式后再标注ffmpeg -y -i audio.mp3 -ar 8k -ac 1 audio.wav上面的命令将音频重采样为 8kHz 单声道 wav兼顾了文件体积与波形渲染的准确性。标注者看不到预测结果如果标注者无法看到预标注Pre-annotations结果请跳转至下文「预标注问题」章节。云存储与本地存储问题使用外部云存储连接S3、GCS、Azure时需要先理解 Label Studio 的同步机制Source 存储数据源选择Files导入方式时Label Studio不会把桶内数据真正导入而是创建指向对象的引用。因此你可以在桶侧完全控制哪些数据被同步、哪些展示在标注界面。选择Tasks导入方式时桶内文件被假定为不可变要将更新后的文件状态推送到 Label Studio唯一方式是换一个新文件名上传到存储或者删除与该文件关联的所有任务后重新同步。同步是单向的要么由桶内对象创建任务Source 存储要么把标注结果推送到输出桶Target 存储。在桶侧修改内容并不能保证结果的一致性。推荐实践为每个 Label Studio 项目使用独立的桶目录bucket folder避免多个项目互相污染。云存储数据无法预览CORS 未配置如果没有正确配置 CORSLabel Studio 中无法预览云存储数据。典型症状是界面上只显示数据的链接而不是数据预览或浏览器控制台出现 CORS 错误。Amazon S3、GCS、Azure Storage 请分别在其官方文档中配置存储桶 CORS 规则。配置 CORS 的同时注意以下两点为服务账号Service Account授予正确的角色与权限。例如为服务账号授予roles/iam.serviceAccountTokenCreator角色GCS 场景。如果 DEBUG 日志中出现了labelstudio这个服务账号名相关的错误可以通过在label-studio start命令中追加--log-level DEBUG标志开启调试日志label-studio start --log-level DEBUG浏览器控制台出现 403 错误403 错误通常意味着凭据credentials配置不正确。GCSGoogle Cloud Storage凭据检查清单按照 Google Cloud 官方「设置认证」与「Cloud Storage 的 IAM 权限」文档配置认证账号必须同时具备Service Account Token Creator服务账号令牌创建者角色、Storage Object Viewer存储对象查看者角色以及storage.buckets.get访问权限如果使用服务账号授权访问 GCP务必先激活该服务账号例如通过gcloud auth activate-service-account命令。Amazon S3 凭据检查清单按 AWS CLI 官方「配置与凭据文件设置」文档配置凭据并确认在 aws 客户端中凭据可用检查区域region是否正确创建桶时指定的区域必须与源/目标存储设置或.aws/config文件中的区域一致否则访问桶对象会出问题。例如修改~/.aws/config[default] regionus-east-2 # change to the region of your bucket检查凭据是否仍然有效如果浏览器控制台出现 403且桶权限已正确配置可能需要更新 Access Key ID、Secret Access Key 与 Session ID。参见 AWS IAM 官方文档中关于「请求临时安全凭据」的说明。点击 Sync 后数据没有更新同步并非即时触发Label Studio 的同步过程基于内部任务调度器job scheduler因此点击 Sync 后可能不会立刻看到效果。如果等待一段时间后仍无变化按以下顺序排查确认凭据配置正确见上文 403 部分。进入云存储设置页点击连接旁的Edit检查File Filter Regex文件过滤正则是否正确。注意当未指定过滤规则时所有找到的对象都会被跳过。过滤条件必须是合法正则表达式而非通配符例如.*是合法的*.不合法。Import method导入方式处理图片、音频、文本等二进制内容时简单场景应设置为Files。该模式会让 Label Studio 自动以 URI 链接如s3://bucket/1.jpg形式创建任务并在打开标注界面时解析为带签名的httpsURL 加载预览。如果桶中存放的是 Label Studio 格式的 JSON/JSONL 任务文件或 Parquet 文件则应设为Tasks。检查 rq worker 是否故障。一个快速验证方式是执行一次导出操作在 Data Manager 中点击Export创建一个新快照并下载 JSON 文件。如果导出报错大概率是 rq worker 出了问题。另一个方法是以超级用户superuser身份登录后访问/django-rq页面查看workers列如果值为0或列为空则说明 worker 异常。云存储中的 JSON 文件未同步且 Data Manager 为空按以下步骤排查编辑存储设置如果在 Data Manager 中能看到任务则问题已解决跳到第 2 步。将Import method设置为Tasks。如果 Data Manager 中依然看不到任务说明你的桶只有 LIST 权限而没有 GET 权限。原因在于权限差异只有 LIST 权限时Label Studio 只能扫描桶内对象的存在性无法真正读取内容具备 GET 权限后Label Studio 才能读取数据并正确解析其中的 JSON 文件。任务加载方式与预期不符任务已经同步到 Label Studio但展示不符合预期例如显示的是 URL 而不是图片或者一个文件只出现一条任务而预期是多条检查以下两点在云存储中放置 JSON 文件时参见 docs/source/guide/storage.md如果同一个文件包含多个任务必须保证所有任务格式一致——不能在同一个文件中混用「只含data字段的原始任务」和「包含 annotations、predictions 的完整任务」。如果同步的是图片或音频文件确保Import method设置为Files。Windows 下无法访问本地存储在 Windows 上使用本地文件存储Local Storage时路径的转义规则容易踩坑请注意设置环境变量LABEL_STUDIO_LOCAL_FILES_DOCUMENT_ROOT时必须使用双反斜杠\\因为需要对反斜杠本身进行转义。在项目配置本地存储时填写Absolute local path绝对本地路径则应使用单反斜杠\。不要在LABEL_STUDIO_LOCAL_FILES_DOCUMENT_ROOT或Absolute local path中使用空格或非拉丁字符。示例LABEL_STUDIO_LOCAL_FILES_DOCUMENT_ROOTc:\\data\\media Absolute local path from Local Storage settings c:\data\media\subpath源码层面的安全校验从仓库源码看本地文件存储并非随意指向任意目录。在 label_studio/io_storages/localfiles/models.py 的validate_connection中Label Studio 会强制校验绝对本地路径必须真实存在、不能与LOCAL_FILES_DOCUMENT_ROOT相同出于安全原因必须指向其子目录且只有当LOCAL_FILES_SERVING_ENABLEDtrue时才允许启用。相关的环境变量定义位于 label_studio/core/settings/base.py默认LOCAL_FILES_SERVING_ENABLEDFalse从宿主文件系统提供文件存在安全风险默认关闭而LOCAL_FILES_DOCUMENT_ROOT默认指向文件系统根目录。这意味着启用本地存储前需要显式设置上述环境变量并重启服务。预标注Pre-annotations问题排查预标注问题前先确认标注单位使用正确。对于图像标注Label Studio 的x、y、width、height均以图片整体尺寸的百分比表示而非像素值。完整的换算公式与双向转换代码示例见 docs/source/includes/image_units.md核心换算关系为pixel_x x / 100.0 * original_width pixel_y y / 100.0 * original_height pixel_width width / 100.0 * original_width pixel_height height / 100.0 * original_height示例任务 JSON 中的标注结果会携带original_width、original_height、image_rotation等字段相关 schema 可参见 label_studio/tasks/openapi_schema.py其中value内的x/y/width/height即上述百分比单位。如果你的模型输出是像素坐标必须先换算成百分比再导入。标注者看不到预测结果标注者看不到预测或在导入预标注后出现异常行为导入方式参见 docs/source/guide/predictions.md按以下步骤排查首先在项目的Settings Annotation设置中确认Use predictions to pre-label tasks使用预测为任务预标注已开启。检查标注配置与任务的配置值预标注任务 JSON 中的from_name必须与标注配置中Labels namelabel toNametext的name值一致to_name必须与toName一致。例如以下 XML 配置片段... Choices namechoice toNameimage showInLinetrue ... RectangleLabels namelabel toNameimage ...应对应如下 JSON 片段... type: rectanglelabels, from_name: label, to_name: image, ... type: choices, from_name: choice, to_name: image, ...检查配置与任务中的标签确保已经为标注界面配置了标注配置且 JSON 文件中的标签labels与配置中的标签完全一致。如果使用了转换模型输出的工具如 label-studio-transformers请确认工具没有篡改标签文本。检查 ID 与 toName 值如果进行了嵌套标注——例如针对特定 Label 或 Choice 值展示 TextArea 标签——那么这些结果的ID 必须相互匹配。例如要在命名实体识别任务的同时做文本转写标注配置如下View Labels namelabel toNametext Label valuePER backgroundred/ Label valueORG backgrounddarkorange/ Label valueLOC backgroundorange/ Label valueMISC backgroundgreen/ /Labels Text nametext value$text/ TextArea nameentity toNametext perRegiontrue/ /View为该配置添加预测文本与建议转写的示例 JSON{ data:{ text:The world that we live in is a broad expanse of nothingness, said the existential philosopher, before he rode away with his cat on his motorbike. }, predictions:[ { result:[ { value:{ start:135, end:144, text:motorbike, labels:[ ORG ] }, id:def, from_name:ner, to_name:text, type:labels }, { value:{ start:135, end:144, text:[ yay ] }, id:def, from_name:entity, to_name:text, type:textarea } ] } ] }因为 TextArea 标签作用于每个被标注的区域所以上述例子中标签结果与 textarea 结果的id必须一致这里均为def。注意示例中from_name为ner请根据你自己的Labels name...实际取值调整。只读与隐藏区域某些场景下让预标注的边界框、文本片段、音频片段等区域只读或隐藏非常有用。可以在annotations.result列表内的结果字典中设置readonly: true或hidden: true实现例如{ result: [ { value: { ...: ... }, from_name: label, to_name: image, type: rectanglelabels, readonly: true } ] }导出问题导出的 HTML 标签偏移位置错误导出 HTML 标注例如 HTML 命名实体识别任务时偏移量不对最常见的原因是HTML 压缩minification。上传 HTML 文件到 Label Studio 标注时HTML 会被压缩以去除空白字符标注时的偏移量针对的是压缩后的 HTML 版本而非原始未修改的 HTML 文件。两种解决思路阻止压缩改用其他导入方式导入 HTML 数据参见 docs/source/guide/tasks.md 中导入 HTML 数据的部分。修正已有标注用与 Label Studio 相同的方式压缩源 HTML 文件使偏移量与之对齐。压缩脚本如下import htmlmin with open(sample.html, r) as f: html_doc f.read() minified_html_doc htmlmin.minify(html_doc, remove_all_empty_spaceTrue)如果压缩后偏移位置仍然不对则可能是复杂的 CSS 或其他原因导致。ML 机器学习后端问题ML 后端是独立于 Label Studio 运行的另一个服务排查时务必确认查看的是正确的服务器控制台日志。需要更详细日志时用--debug选项启动 ML 后端服务器。日志位置速查直接运行 ML 后端时生产环境训练日志位于my_backend/logs/rq.log生产环境运行时日志位于my_backend/logs/uwsgi.log开发模式下训练日志显示在浏览器控制台使用 Docker Compose 运行 ML 后端时训练日志位于logs/rq.log主进程与推理日志位于logs/uwsgi.logLabel Studio 对 ML 服务请求的默认超时设置Label Studio 对所有发往 ML 服务器的请求都设有默认超时。不同类型的请求对应的超时环境变量如下请求类型用途环境变量默认值秒Health添加新 ML 后端时检查其健康状态ML_TIMEOUT_HEALTH1Setup初始化 ML 模型ML_TIMEOUT_SETUP3Predict从 ML 后端获取预测ML_TIMEOUT_PREDICT100Train训练请求ML_TIMEOUT_PREDICT文档原文如此实际训练时长建议用ML_TIMEOUT_TRAIN100 / 30Duplicate model复制模型ML_TIMEOUT_PREDICT同训练100Delete删除请求ML_TIMEOUT_PREDICT同训练100Train job status查询训练任务状态ML_TIMEOUT_PREDICT同训练100你可以在启动 Label Studio 时为每种请求单独设置环境变量来调整超时。从源码看这些超时变量统一定义在 label_studio/ml/api_connector.pyCONNECTION_TIMEOUT float(get_env(ML_CONNECTION_TIMEOUT, 1)) # seconds TIMEOUT_DEFAULT float(get_env(ML_TIMEOUT_DEFAULT, 100)) # seconds TIMEOUT_TRAIN float(get_env(ML_TIMEOUT_TRAIN, 30)) TIMEOUT_PREDICT float(get_env(ML_TIMEOUT_PREDICT, 100)) TIMEOUT_HEALTH float(get_env(ML_TIMEOUT_HEALTH, 1)) TIMEOUT_SETUP float(get_env(ML_TIMEOUT_SETUP, 3)) TIMEOUT_DUPLICATE_MODEL float(get_env(ML_TIMEOUT_DUPLICATE_MODEL, 1)) TIMEOUT_DELETE float(get_env(ML_TIMEOUT_DELETE, 1)) TIMEOUT_TRAIN_JOB_STATUS float(get_env(ML_TIMEOUT_TRAIN_JOB_STATUS, 1))设置示例export ML_TIMEOUT_PREDICT300 # 大模型推理较慢时延长预测超时 export ML_TIMEOUT_TRAIN600 # 训练耗时较长时延长训练超时 export ML_CONNECTION_TIMEOUT5 # 连接超时从实现细节看连接超时与请求超时会被组合成元组(connection_timeout, request_timeout)传给底层 HTTP 客户端见 label_studio/ml/api_connector.py同时请求自动附带User-Agent: heartex/version头。另外仓库默认开启了ML_BLOCK_LOCAL_IP见 label_studio/core/settings/base.py它会阻止 ML 后端访问内网/回环地址以防御 SSRF相关校验在添加 ML 后端时即生效见 label_studio/ml/serializers.py。添加 ML 后端后显示 DisconnectedML 后端服务器可能没有正常启动。按以下步骤排查检查 ML 后端服务器是否在运行执行健康检查curl -X GET http://localhost:9090/health如果健康检查无响应或报错查看服务器日志。如果使用 Docker Compose 启动 ML 后端检查用于配置 Docker 内环境的requirements.txt是否缺少必要依赖。点击 Start Training 后提示 Error点击错误信息可以查看 traceback常见错误包括已完成标注的数量不足无法开始训练服务器内存不足。预测结果错误或标注页看不到模型预测ML 后端可能生成了格式错误的预测。检查ML 后端预测格式是否与导入的预标注格式保持一致项目的标签配置是否与 ML 后端输出匹配。例如使用Choices标签为文本创建预测类别。更多标签用法参见 Label Studio 标签文档。模型后端无法启动或运行如果启动 ML 后端服务器后在终端或日志中看到缺包错误需要在 ML 后端的requirements.txt中补充相应依赖。ML 后端无法访问任务由于 ML 后端与 Label Studio 是两个不同服务你所标注的资源图片、音频等必须托管在 ML 后端可以通过 URL 访问的地方否则 ML 后端无法基于这些资源生成预测。添加 ML 后端时出现校验错误添加 ML 后端 URL 到项目时如果出现校验错误检查以下几点标注界面是否配置了合法有效的标注配置ML 后端是否在运行执行健康检查curl -X GET http://localhost:9090/healthML 后端是否对 Label Studio 实例可达它必须能被运行 Label Studio 的实例访问到。如果 Label Studio 运行在 Docker 中则 ML 后端必须运行在同一个 Docker 容器内或者通过其他方式让该容器可以访问到它。可以使用docker exec在容器内执行命令或使用docker exec -it container_id /bin/sh进入容器 shell。Windows 下 Docker 报 No such file or directory在 Windows 上运行docker-compose up --build时可能遇到如下错误exec /app/start.sh : No such file or directory exited with code 1这通常由Windows 对文本文件换行符的处理方式引起——Git 检出时把 LF 自动转换成了 CRLF导致容器内的start.sh脚本无法执行。Step 1调整 Git 配置。克隆仓库前先关闭换行符自动转换。在 Git Bash 或终端中执行git config --global core.autocrlf falseStep 2重新克隆仓库。如果之前已经克隆过需要在调整配置后重新克隆确保换行符被正确保留先备份工作内容并删除现有本地仓库再重新克隆。Step 3构建并启动容器。进入克隆仓库中包含 Dockerfile 与docker-compose.yml的目录依次执行docker-compose build docker-compose up补充说明此方案专门针对 Windows 下自动换行转换引发的问题其他操作系统不适用同时注意检查项目中的.gitattributes文件如存在它也会影响 Git 对换行符的处理。重置 Docker 镜像中的 pip 缓存有时需要重置 pip 缓存以确保安装到依赖的最新版本。例如requirements.txt中以label-studio-ml githttps://github.com/HumanSignal/label-studio-ml-backend.git形式引用了 Label Studio ML Backend 库当它更新后希望 Docker 镜像直接采用最新版本可以强制无缓存重建镜像docker compose build --no-cacheBad Gateway 与 Service Unavailable 错误这些错误通常出现在同时发送多个并发请求时。注意仓库提供的 ML 后端示例均以开发模式提供不支持生产级的推理服务承载能力高并发下出现网关类错误属预期现象。ML 后端无法完成简单自动标注或看不到预测必须确保 ML 后端能够访问你的 Label Studio 数据否则可能遇到服务器日志中出现no such file or directory错误在 Label Studio 中加载任务时看不到预测ML 后端显示已连接但无法在任务内完成任何自动标注。解决方法确保已设置LABEL_STUDIO_URL与LABEL_STUDIO_API_KEY环境变量。详细说明参见 docs/source/guide/ml.md 中「允许 ML 后端访问 Label Studio 数据」一节。排查思路总结面对上述问题时可以遵循一条通用排查路径先看浏览器控制台 → 再看服务端日志 → 最后核对配置。前端资源加载类问题图片、音频、预测展示优先看浏览器 Console 的 CORS/403 报错同步、导出、训练类问题优先看 rq worker 状态/django-rq页面与服务端日志ML 后端注意区分rq.log与uwsgi.log预标注相关的问题优先核对from_name/to_name/标签/ID 的一致性部署类问题Docker 启动失败优先检查换行符、依赖完整性与超时环境变量配置。按此顺序定位绝大多数社区版常见问题都能在数分钟内得到解决。【免费下载链接】label-studioLabel Studio is a multi-type data labeling and annotation tool with standardized output format项目地址: https://gitcode.com/GitHub_Trending/la/label-studio创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表