问题排查#

对于任何组件的任何崩溃或问题排查帮助

请向 NVIDIA 报告以下内容

  1. 组件和相关组件的完整日志(理想情况下是所有日志)。请参阅下面的简短脚本,以收集部署设置中的所有 Pod 日志 -

#!/bin/bash
for pod in $(kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}')
do
    #depending on logs, this may take a while
    kubectl logs --all-containers $pod > $pod.txt
done
  1. 捕获 nvidia-smi 或等效的 GPU 利用率数据

  2. 捕获 CPU 和内存利用率数据

  3. 从 UI 捕获控制台日志

  4. 如果适用,请分享互动视频。

UI 和 Iframe 错误#

以下部分将介绍可能在 Tokkio UI 和 Tokkio Iframe 中出现的不同错误。

通用问题排查清单#

  1. 所有容器都已启动并运行

  2. VPN 上的网络条件差。请参阅推荐的带宽表。

  3. STUN/TURN 服务器已正确部署、配置且可在 VST 中访问。请参阅 Trickle ICE 部分。

  4. UI 和 VST 容器之间没有版本不匹配。请参阅 Tokkio 文档。

  5. 麦克风和摄像头已连接到系统。

  6. LLM 密钥已正确设置且未过期(在单独的 RAG 部署的情况下)

  7. GPU 驱动程序已正确配置。GPU 应为推荐的 GPU 之一。请参阅 Tokkio 文档。

  8. 确保 Web 浏览器受支持。受支持的 Web 浏览器为 Chrome 和 Safari。

未找到部署#

当 UI 中 Tokkio 部署的位置配置错误时,会出现此错误。

在 Tokkio UI 中的外观#

Deployment not found Tokkio UI

在 Iframe 中的外观#

Deployment not found Tokkio Iframe

解决方法#

如果部署 UI 或 Iframe 时没有部署脚本,请首先确保 Tokkio 部署是健康的且可访问的。这可以通过访问 /health 端点来完成,使用以下 cURL 命令

curl http(s)://<ingress endpoint>/health

如果部署是健康的,您应该在响应有效负载中看到不健康服务的空列表。

$ curl http://10.128.34.39:30888/health
{"unhealthy_services":[],"healthy_services":["....", "....."]}

如果端点未按预期响应,您必须确保部署正在运行,并且客户端可以访问您在其上运行部署的计算机。

在您验证部署是健康之后,请确认部署端点已在 UI 中正确配置。在 Tokkio Iframe 中,这是 INGRESS_ENDPOINT 配置选项,在 Tokkio UI 中,这是 UI_SERVER_ENDPOINT 选项。花时间阅读 配置配置 的文档,以确保正确配置了部署。

如果使用部署脚本部署 UI,请确保 设置上述部署位置配置,这些配置将由部署脚本自动设置。

头像流未连接#

启动时,UI 将获取用户的视频和音频流,连接到 VST 微服务 WebSocket,然后建立用于头像视频的 webRTC 连接。如果此过程的任何部分失败,则会出现此错误。

在 Tokkio UI 中的外观#

Avatar Stream Failed Tokkio UI

在 Iframe 中的外观#

Avatar Stream Failed Tokkio Iframe

解决方法#

出现此错误可能有多种原因。

  1. 如果 Tokkio 或 UI 是通过 HTTP 而不是 HTTPS 部署的,则需要在用户的浏览器中设置浏览器标志,以将 Tokkio 和 UI 部署端点视为安全。在 Google Chrome 上,通过导航到 chrome://flags URL,打开 将不安全来源视为安全来源 选项,然后将不安全的 Tokkio 端点添加到文本框中来完成此操作。这通常是一个类似于这样的字符串:http://<入口 IP:端口>,ws://<入口 IP:端口>

  2. 浏览器窗口必须有权访问用户的麦克风。如果通过远程桌面部署,系统上将没有麦克风,并且会出现此错误。如果启用了摄像头,则浏览器还必须有权访问摄像头。

  3. 如果任何用户在其浏览器中打开了多个 UI,则这可能会导致后端丢失流总数的跟踪,并且无法通知 UI 没有容量。在这种情况下,WebSocket 连接将被拒绝,并且会出现此错误。

  4. coturn 服务器必须在 VST 微服务中正确配置。如果 coturn 未正确设置,则头像轮将长时间旋转,然后才显示错误。

  5. 如果未使用部署脚本部署 UI,请确保 VST 端点已在 UI 中正确配置。在 Tokkio Iframe 中,这是 VST_ENDPOINT 配置选项,在 Tokkio UI 中,这是 VST_WEBSOCKET_ENDPOINT 选项。花时间阅读 UIIframe 的文档,以确保正确配置了部署。

  6. 如果使用部署脚本部署 UI,请确保 设置上述部署位置配置,这些配置将由部署脚本自动设置。

可以检查浏览器日志以缩小问题范围。

容量已满#

当 UI 连接到 Tokkio 时,但所有流都已被其他人使用时,会出现此错误。

在 Tokkio UI 中的外观#

Capacity Full Tokkio UI

在 Iframe 中的外观#

Capacity Full Tokkio Iframe

解决方法#

确保使用系统的人数少于可用流的数量。关闭 UI 后,该 UI 使用的流将在一两分钟后释放。

无效令牌#

当用户尝试在没有会话令牌的情况下调用 Tokkio 中的端点时,会出现此错误。

在 Tokkio UI 中的外观#

Invalid Token Tokkio UI

在 Iframe 中的外观#

头像将出现片刻,然后显示容量已满错误消息。控制台日志可能会显示 HTTP 400 错误。

Invalid Token Tokkio Iframe

解决方法#

确保在您的浏览器中启用了 Cookie。清除您的 Cookie 和历史记录,并且不要在隐身模式下打开 Tokkio。

SDR 错误报告#

当其中一个后端服务崩溃然后恢复时,会出现此错误。

在 Tokkio UI 中的外观#

SDR Error Tokkio UI

在 Iframe 中的外观#

此错误不会在 Iframe 中出现,故障将静默发生。如果头像视频或 Tokkio 功能突然停止工作,则可能是发生了崩溃。

解决方法#

通过重启失败的 Pod,错误已自行解决。重启 UI 以恢复正常。

Trickle ICE#

检查 ICE 服务器功能是否正常运行的简单方法是使用 WebRTC 的 Trickle ICE 功能的测试工具。Trickle ICE 是一种允许逐步收集和共享 ICE 候选(潜在连接路径)的技术,这可以加快连接过程。Trickle ICE 不适用于 RP 或反向代理的情况。

  • 测试 STUN 服务器:如果收集到类型为 “srflx” 的候选,则 STUN 服务器测试成功。

  • 测试 TURN 服务器:如果收集到类型为 “relay” 的候选,则 TURN 服务器测试成功。

  • 凭据测试:当测试单个 TURN/UDP 服务器时,页面可以检测是否使用了不正确的凭据进行身份验证。

  • 详细信息:页面显示一个表格,其中包含有关每个收集到的候选的详细信息,包括时间、类型、基础、协议、地址、端口、优先级以及适用时的其他详细信息。

ICE Server

添加 stun 或 turn URI 信息,然后单击“添加服务器”。例如,

STUN or TURN URI: turn:15.266.16.245:3478

TURN username: coturn-admin

TURN password: "Uq3CFRYKr6rFVFcc
ICE Server Options

单击 Gather candidates 以生成 ICE 候选。如果您看到正在生成中继候选,则表示 ICE 服务器工作正常。

麦克风或摄像头访问被拒绝#

如果麦克风访问成功,录制图标将出现在浏览器选项卡中。如果图标未出现或 UI 给出麦克风权限被拒绝的错误,请按照以下步骤操作。可能有多种原因。

在 UI 中的外观#

Recording Button

以下情况下会发生此错误。

麦克风未连接到系统#

解决方法#

确保工作正常的麦克风已连接到系统,并且电缆没有松动。

用户在权限提示中拒绝了麦克风访问#

浏览器将询问用户是否允许麦克风访问权限。如果用户单击提示外部或拒绝了该提示,则浏览器将记住此设置,并且每次 UI 尝试访问麦克风时,浏览器都会拒绝。

在 UI 中的外观#
Microphone Access Permission
解决方法#

要解决此问题,用户需要清除或重置尝试访问麦克风的网页的浏览器权限。在 Google Chrome 中重置麦克风权限的设置位于“设置/隐私和安全/网站设置”。

  1. 麦克风故障

尝试使用另一个应用程序从麦克风录音,并检查其是否处于工作状态。访问 Google WebRTC getusermedia 音频 示例网页,并检查麦克风访问是否在那里工作。

  1. GetUserMedia API 存在问题,并且浏览器无法访问麦克风

有时,如果 Web 浏览器的 getUserMedia() API 注意到麦克风访问被滥用,则可能会阻止对麦克风的访问。这种情况很少见。在这些情况下,重启系统(UI 打开的位置)可以解决该问题。访问 Google WebRTC getusermedia 音频 示例网页,并检查麦克风访问是否在那里工作以进行确认。

黑屏 Tokkio UI,非 WebRTC#

如果 Tokkio UI 应用程序无法建立一致的 WebSocket 连接,则视频播放器中可能会出现黑屏。本节将介绍与黑屏相关的非 WebRTC 问题。

以下情况下会发生此错误。

未设置 Chrome 标志(开发设置)#

如果 Tokkio UI 部署不在生产环境中,并且正在使用 UI 开发设置,则设置不正确的 Chrome 标志将导致 WebSocket 连接失败。开发设置并非理想选择,用户需要针对 Web 浏览器中与 CORS 和安全性相关的问题进行解决方法。

解决方法#

为了绕过这些安全问题,用户需要设置 unsafely-treat-insecure-origin-as-secure Chrome 标志。该值应为 Tokkio UI 托管的域名。请注意,更改这些设置后需要重新启动 Chrome。

Ingress 未配置用于 WebSocket#

如果 Ingress 未配置为处理 WebSocket 连接,则 WebSocket 连接将失败。

解决方法#

WebSocket 连接涉及 HTTP 升级请求。Ingress 需要配置为处理此升级请求。

会话在几秒钟内突然结束#

会话可能会开始,但在几秒钟内突然结束。这是 WebSocket 连接在几秒钟内断开连接的结果。一致的 WebSocket 连接是 Tokkio UI 的要求。

WebSocket 连接已关闭,因为没有数据在其中流动#

默认情况下,如果大多数 Ingress 观察到没有数据流过 WebSocket 连接,则会断开该连接。

解决方法#

解决方案是通过 Tokkio UI 配置启用 WebSocket ping 消息。这将确保每隔几秒钟发送一次虚拟数据。

WebSocket 连接已关闭,因为 ping-pong 的频率#

如果 ping 消息的频率低于 Ingress 中设置的 WebSocket 超时时间,则 WebSocket 连接可能会断开。即使在 Tokkio UI 配置中启用了 WebSocket ping,也可能发生发送的 ping 消息的频率低于 Ingress 中配置的断开连接设置。

解决方法#

通过 Tokkio UI 配置增加频率将解决该问题。

头像视频卡顿或冻结,随后偶尔会话关闭#

如果其他一切正常,但出现视频卡顿问题、视频冻结问题和偶尔的连接断开,请检查以下情况。

网络连接速度慢#

如果网络速度慢,则可能会出现此问题。

解决方法#

使用任何在线速度测量工具检查网络速度。确保如果您正在使用 VPN,则 VPN 没有限制连接速度。确保您通过 VPN 连接到的位置不太远。请参阅分辨率与比特率表。

VST 未配置用于头像分辨率#

VST 有一个名为 webrtc_video_quality_tunning 的配置,用于设置不同分辨率的比特率范围。

解决方法#

确保比特率设置是实际的。例如,720p 流的高比特率要求是不切实际的。确保网络可以提供该比特率所需的带宽。

客户端 CPU 使用率过高#

如果 CPU 使用率在打开 Tokkio UI 的客户端过高,UI 可能无法获得足够的资源来流式传输头像。在这种情况下,视频可能会卡顿。

解决方法#

在 Windows 中使用任务管理器检查 CPU 使用率。

网络拥塞#

如果网络拥塞,则会导致频繁丢包和低质量的流媒体。

解决方法#

查看 WebRTC 统计信息,确保网络未拥塞。请参阅 WebRTC 统计信息部分。

Tokkio 视觉调优#

要禁用 VisionAI 或用户注意力功能,请访问 禁用 Tokkio 视觉。要更改用户注意力的灵敏度,请访问:Metropolis 用户占用和参与度警报

从 SDR 手动触发 ADD / REMOVE 调用#

  1. 发送 “CAMERA_ADD” Redis 消息到 vst_events 以触发 SDR ADD 调用

$ xadd vst_events * sensor.id "{\"alert_type\":\"camera_status_change\",\"created_at\":\"2024-09-26T18:00:17Z\",\"event\":{\"camera_id\":\"3477c96b-5e3d-492f-8a5c-3682df2c3b37\",\"camera_name\":\"webcam_3477c96b-5e3d-492f-8a5c-3682df2c3b37\",\"camera_url\":\"rtsp://192.168.33.235:30554/webrtc/3477c96b-5e3d-492f-8a5c-3682df2c3b37\",\"change\":\"camera_add\"},\"source\":\"vst\"}\n"
$ xadd vst_events * sensor.id "{\"alert_type\":\"camera_status_change\",\"created_at\":\"2024-09-26T18:00:19Z\",\"event\":{\"camera_id\":\"3477c96b-5e3d-492f-8a5c-3682df2c3b37\",\"camera_name\":\"webcam_3477c96b-5e3d-492f-8a5c-3682df2c3b37\",\"camera_url\":\"rtsp://192.168.33.235:30554/webrtc/3477c96b-5e3d-492f-8a5c-3682df2c3b37\",\"change\":\"camera_streaming\"},\"source\":\"vst\"}\n"
  1. 检查 SDR 日志以确保已发出 ADD 调用

$ kubectl logs -f chat-controller-sdr-envoy-sdr-deployment-bb5dd6588-rmhp7 --tail 1

2024-09-26 19:44:33 lib.podprovisioner.provisionconfig - INFO - Starting add call
2024-09-26 19:44:33 lib.podprovisioner.provisionconfig - INFO - adding camera at http://192.168.33.193:9010/add
2024-09-26 19:44:33 lib.podprovisioner.provisionconfig - INFO - payload: {
"alert_type": "camera_status_change",
"created_at": "2024-09-26T18:00:17Z",
"event": {
    "camera_id": "3477c96b-5e3d-492f-8a5c-3682df2c3b37",
    "camera_name": "webcam_3477c96b-5e3d-492f-8a5c-3682df2c3b37",
    "camera_url": "rtsp://192.168.33.235:30554/webrtc/3477c96b-5e3d-492f-8a5c-3682df2c3b37",
    "change": "camera_add"
},
"source": "vst"
}
2024-09-26 19:44:33 lib.podprovisioner.provisionconfig - INFO - add operation Response Code: 200
2024-09-26 19:44:33 lib.podprovisioner.provisionconfig - INFO - add operation text return: {
        "status" : "STREAM_ADD_SUCCESS"
}
2024-09-26 19:44:33 __main__ - INFO - add operation success updating
                                    the Route mapping
ace-agent-chat-controller-deployment-0: |-
    [
        {
            "alert_type": "camera_status_change",
            "created_at": "2024-09-26T18:00:17Z",
            "event": {
                "camera_id": "3477c96b-5e3d-492f-8a5c-3682df2c3b37",
                "camera_name": "webcam_3477c96b-5e3d-492f-8a5c-3682df2c3b37",
                "camera_url": "rtsp://192.168.33.235:30554/webrtc/3477c96b-5e3d-492f-8a5c-3682df2c3b37",
                "change": "camera_add"
            },
            "source": "vst"
        }
    ]
  1. 发送 “CAMERA_REMOVE” Redis 消息到 vst_events 以触发 SDR REMOVE 调用

$ xadd vst_events * sensor.id "{\"alert_type\":\"camera_status_change\",\"created_at\":\"2024-09-26T18:01:15Z\",\"event\":{\"camera_id\":\"3477c96b-5e3d-492f-8a5c-3682df2c3b37\",\"camera_name\":\"webcam_3477c96b-5e3d-492f-8a5c-3682df2c3b37\",\"camera_url\":\"rtsp://192.168.33.235:30554/webrtc/3477c96b-5e3d-492f-8a5c-3682df2c3b37\",\"change\":\"camera_remove\"},\"source\":\"vst\"}\n"
  1. 检查 SDR 日志以确保已发出 REMOVE 调用

    • 请参阅类似的说明以检查 ADD 调用

2024-09-26 19:46:01 werkzeug - INFO - 169.254.3.1 - - [26/Sep/2024 19:46:01] "GET /healthz HTTP/1.1" 200 -
2024-09-26 19:46:01 werkzeug - INFO - 169.254.3.1 - - [26/Sep/2024 19:46:01] "GET /healthz HTTP/1.1" 200 -
2024-09-26 19:46:02 __main__ - INFO - id: 1727379962895-0, content: {'sensor.id': '{"alert_type":"camera_status_change","created_at":"2024-09-26T18:01:15Z","event":{"camera_id":"3477c96b-5e3d-492f-8a5c-3682df2c3b37","camera_name":"webcam_3477c96b-5e3d-492f-8a5c-3682df2c3b37","camera_url":"rtsp://192.168.33.235:30554/webrtc/3477c96b-5e3d-492f-8a5c-3682df2c3b37","change":"camera_remove"},"source":"vst"}\n'}
2024-09-26 19:46:02 __main__ - INFO - {'sensor.id': '{"alert_type":"camera_status_change","created_at":"2024-09-26T18:01:15Z","event":{"camera_id":"3477c96b-5e3d-492f-8a5c-3682df2c3b37","camera_name":"webcam_3477c96b-5e3d-492f-8a5c-3682df2c3b37","camera_url":"rtsp://192.168.33.235:30554/webrtc/3477c96b-5e3d-492f-8a5c-3682df2c3b37","change":"camera_remove"},"source":"vst"}\n'}
2024-09-26 19:46:02 __main__ - INFO - {"alert_type":"camera_status_change","created_at":"2024-09-26T18:01:15Z","event":{"camera_id":"3477c96b-5e3d-492f-8a5c-3682df2c3b37","camera_name":"webcam_3477c96b-5e3d-492f-8a5c-3682df2c3b37","camera_url":"rtsp://192.168.33.235:30554/webrtc/3477c96b-5e3d-492f-8a5c-3682df2c3b37","change":"camera_remove"},"source":"vst"}

2024-09-26 19:46:02 __main__ - INFO - deprovision stream

发送到 Tokkio 参考工作流程的查询未收到响应#

  1. 确保用于语音输入的麦克风功能正常

  2. Tokkio 的参考工作流程还需要功能正常的摄像头输入,以检测摄像头视野中是否有人存在

  3. 检查聊天控制器 pod 的日志,以确保检测到输入的语音

  4. 检查聊天引擎 pod 和插件服务器的日志,查找检索响应时是否出现错误

  5. 如果需要更多信息,请联系 Tokkio 支持联系人。

多个并发会话中头像口吃或意外停止说话#

当计算资源负载过高时,头像语音可能会变得不流畅。发生这种情况时,Audio2Face-3D 推理和 blendshape 求解可能会减慢速度,导致动画卡顿。在 Audio2Face-3D 微服务日志中可以找到如下条目的证据

正在以 X FPS 流式传输 <stream ID>

其中 X 低于 30。

如果发生这种情况,请尝试减少并发会话的数量,以获得更流畅的体验。

Tokkio 参考工作流程未检测到用户存在#

  1. 确保用于语音输入的麦克风功能正常

  2. Tokkio 的参考工作流程还需要功能正常的摄像头输入,以检测摄像头视野中是否有人存在

  3. 检查聊天控制器 pod 的日志,以检查是否检测到输入的语音

  4. 重启占用警报 pod 并重试

  5. 如果需要更多信息,请联系 Tokkio 支持联系人。请在您的支持请求中包含系统日志和设置配置的详细描述。

Triton pod 在 T4 GPU 上使用 Parakeet 模型时崩溃#

用户可以尝试以下几种选项。

1. 更改 Tokkio 4.1 使用的模型 asr_conformer_en_us_streaming_throughput_flashlight_vad:2.15.0-tokkio。我们可以通过在部署时传递以下 user_override_value 来实现相同的目的。

riva-api:
  modelRepoGenerator:
    ngcModelConfigs:
      triton0:
        models:
        - nvidia/ace/asr_conformer_en_us_streaming_throughput_flashlight_vad:2.15.0-tokkio
        - nvidia/riva/rmir_tts_fastpitch_hifigan_en_us_ipa:2.17.0

您可以参考如何使用 无需重建即可集成自定义更改 将 user_override_value 传递给 OneClick 脚本。

  1. pod 将重启几次以进行全新部署,然后最终启动。如果 pod 在多次重启后仍未自动启动(在使用一键部署时),则可能需要手动重启 pod。

使用一键式脚本安装新应用程序时,ASR 和 TTS 无法工作#

  1. 检查 GPU 是否对 Riva init 容器不可用(NVML 错误)。模型部署以 ONNX 格式进行,不受支持,因此 Triton 容器随后会失败。

$ kubectl exec -it triton0-bbd77d78f-22dr8 -c riva-model-init /bin/bash -n app group ID 1000 I have no name!@triton0-bbd77d78f-22dr8:/opt/riva$ nvidia-smi Failed to initialize NVML: Unknown Error

请尝试 NVIDIA Github 中的建议

  1. 如果需要更多信息,请联系 Tokkio 支持联系人。请在您的支持请求中包含系统日志和设置配置的详细描述。

UE 应用程序在全新部署中无法在三个流上工作#

在重试之前,删除 renderer-sdr、ue-renderer 和 VMS pod。

即使用户在 FOV 中,也未检测到用户存在#

  1. 卸载 tokkio 应用程序

  2. 删除 pvc vms-local-storage、ds-sdr-envoy-agent-storage 并删除 mongodb、ds-sdr、vms、redis-data 的 pv

  3. 再次部署应用程序并检查。

使用 CSP 指南时的其他故障排除技巧#

  1. 在 AWS 中,在应用程序安装期间,脚本可能会由于 AWS 证书更改而显示 IAC 更改,用户必须重新运行基础架构,然后部署应用程序

  2. 更新密钥不会显示修改后的数据,也不会重启 pod,用户必须手动重启 pod

  3. 升级应用程序不会重启所有 UE pod,必须重启所有 UE pod 才能在所有三个客户端上提供流

  4. 升级 VMS cm 不会重启 pod,必须手动重启 pod

自定义未反映在已部署的体验中#

如果执行的自定义未反映在已部署的体验中,您可以执行以下几项检查来调试

  1. 检查执行的自定义是覆盖还是应用程序规范。部署 Tokkio chart 时,覆盖值文件中的值用于更新应用程序规范。确保预期的自定义在正确的文件中被引用,并且没有被覆盖值文件中的条目覆盖。

  2. 检查预期的自定义是否需要 chart 重建。请参阅 自定义参考工作流程,了解常见自定义及其关于 chart 重建必要性的指示。

头像一直说 “我们遇到了技术难题”#

Tokkio 的默认 chart 使用 LLM-RAG 参考工作流程,该工作流程配置为将查询发送到基于 NIM 的模型 (meta/llama3-8b-instruct)。要访问此 NIM 端点,需要在 API 目录中获得 API 积分。通常,在没有足够积分的情况下,机器人会回复 “我们遇到了技术问题”。可以通过在发出查询时检查 plugin-server-deployment Kubernetes pod 的日志来确认问题。

如果使用自定义 chart,请确保您连接到与为您的 Tokkio LLM RAG 参考工作流程的自定义版本实现的消息解析兼容的 RAG 或 LLM。请参阅 插件服务器资源自定义,以获得有关可以为参考工作流程执行的各种自定义的指导。

确保分析日志,特别是来自 plugin-server-deploymentchat-engine-deployment kubernetes pod 的日志,以便找出问题的根本原因。请参阅 故障排除,以获得有关收集日志的指导。

高级诊断工具和技术#

WebRTC 统计信息#

Chrome 提供了一种以用户友好的方式获取 WebRTC 统计信息的机制。WebRTC 统计信息可以提供有关网络状况、帧率、分辨率、音频信息、编解码器和许多其他有用信息的良好信息。要检查 WebRTC 统计信息,请在单独的 Chrome 标签页中打开 chrome://webrtc-internals。在 WebRTC 内部标签页中,我们可以看到每个对等连接的信息。在下面的图像中,我们可以看到有两个对等连接,一个用于入站流(头像),另一个用于出站流(麦克风)

WebRTC Internal tabs

要检查入站流(头像)统计信息,请查找 inbound-rtp 的“统计信息图表”部分。请查看下面的图像以供参考。

Stats graphs for inbound-rtp

使用这些统计信息,我们可以观察各种有用的指标,如丢帧、nack 计数、pli 计数、帧率、比特率、丢包、抖动等。这些指标对于调试任何网络相关问题都很有用。

使用这些统计信息,我们可以观察各种有用的指标,如丢帧、nack 计数、pli 计数、帧率、比特率、丢包、抖动等。这些指标对于调试任何网络相关问题都很有用。

使用 VST 日志进行调试#

  • VST 配置:VST 配置在 VST 日志的开头打印。它可以用于检查 VST 正在运行的当前配置。

Host HTTP port: 30000 Recorded Video Root: /home/vst/vst_release/vst_video stunurl list: stun.l.google.com:19302, stun1.l.google.com:19302 static_turnurl_list: use_coturn_auth_secret: 0 use_twilio_stun_turn: 0 coturn_turnurl_list_with_secret: twilio_account_sid: twilio_auth_token: use reverse proxy RP: 0

...
  • Redis 服务器连接:此日志可用于检查 VST 是否能够连接到 Redis 服务器。

[2024-12-20T9:49:40.728Z:137990895721664:redis_publisher.cpp:176: redis_init] Radis server address:port= 127.0.0.1;6379 [2024-12-20T9:49:40.728Z:137990895721664:redis_publisher.cpp:187: redis_init] Redis connect success.
  • GRPC 服务器正在监听:此日志可用于检查 VST GRPC 服务器是否已启用并正在监听

[2024-12-20T9:49:40.853Z:137988786882112:nvgrpc.cpp:931: RunServer]     gRPC Server listening on 0.0.0.0:50051
  • 检测到 GPU:此日志可用于检查 VST 是否检测到 GPU

[2024-12-20T9:49:40.557Z:137990895721664:utils.cpp:2227: detectGPU]     ############## GPU ID DETECTED = 0 ##############

[2024-12-20T9:49:40.557Z:137990895721664:utils.cpp:2228: detectGPU]     ############## GPU Device = /dev/nvidia0 ##############
  • 检查 WebSocket 连接:此日志可用于检查 WebSocket 连接是否成功

[2024-12-20T9:50:42.164Z:137990862919232:Websocket.cpp:51: addConnection]       Saving connection ID: 1380cd96-aa97-41b4-8f4f-f64f00fc6568

[2024-12-20T9:50:42.164Z:137990862919232:Websocket.cpp:64: addConnection]       Memory allocated to websocket connection ID: 1380cd96-aa97-41b4-8f4f-f64f00fc6568

[2024-12-20T9:50:42.164Z:137990862919232:Websocket.cpp:66: addConnection]       Total websocket connections: 1
  • 检查对等连接:检查 WebRTC 对等连接是否成功。应该有两个这样的日志。其中一个对等 ID 以下划线一 (“_1”) 结尾的是头像流的对等连接。另一个是对等网络摄像头或麦克风流的连接。

[2024-12-20T9:50:45.223Z:137987255961152:WebrtcCallbacks.cpp:509: OnConnectionChange]    Peer connection state:Connected peerid:1380cd96-aa97-41b4-8f4f-f64f00fc6568

[2024-12-20T9:50:43.484Z:137988304537152:WebrtcCallbacks.cpp:509: OnConnectionChange]    Peer connection state:Connected peerid:1380cd96-aa97-41b4-8f4f-f64f00fc6568_1
  • 头像和麦克风 Redis 事件:此日志指示是否已发送网络摄像头流的 Redis 事件。有两种类型的事件。“Camera add” 和 “Camera streaming”。以下日志与检查 Redis 事件是否工作相关。

[2024-12-20T9:50:43.485Z:137988304537152:PeerConnectionManager.cpp:2653: notify] { "alert_type" : "camera_status_change", "created_at" : "2024-12-20T09:50:43Z", "event" : { "camera_id" : "1380cd96-aa97-41b4-8f4f-f64f00fc6568", "camera_name" : "webcam_1380cd96-aa97-41b4-8f4f-f64f00fc6568", "camera_url" : "rtsp://10.41.25.10:30554/webrtc/1380cd96-aa97-41b4-8f4f-f64f00fc6568", "change" : "camera_add" }, "source" : "vst" }

[2024-12-20T9:50:43.485Z:137989615257152:redis_publisher.cpp:227: sendToRedis] Event sent to Redis Successfully

{ "alert_type" : "camera_status_change", "created_at" : "2024-12-20T09:50:45Z", "event" : { "camera_id" : "1380cd96-aa97-41b4-8f4f-f64f00fc6568", C1380cd96-aa97-41b4-8f4f-f64f00fc6568", "camera_url" : "rtsp://10.41.25.10:30554/webrtc/1380cd96-aa97-41b4-8f4f-f64f00fc6568", "change" : "camera_streaming" }, "source" : "vst" }

[2024-12-20T9:50:45.946Z:137989615257152:redis_publisher.cpp:227: sendToRedis] Event sent to Redis Successfully
  • 头像和麦克风流的 FPS:此日志指示头像和麦克风流的 fps。UUID 以 “_out” 结尾的日志用于头像流,以 “_in” 结尾的日志用于网络摄像头流。请注意,仅当启用视频时才会显示网络摄像头的 fps。如果仅启用麦克风流,则不会打印 fps。请查看下面的示例日志以获取更多上下文。

[2024-12-20T12:32:50.739Z:137325361235520:fps_display.cpp:80: displayFPS] Unique ID = 7c4e2774-e3c2-415c-8c8b-ab3d420b92c9_1:7c4e2774-e3c2-415c-8c8b-ab3d420b92c9_1_out FPS = { 29.988873, 29.988873, 29.994843, 30.249584, 29.916251, 29.994792, 30.061507, 29.988936, 29.994792, 29.988936, 29.994843, 30.153816 }

[2024-12-20T12:33:50.7490Z:137325361235520:fps_display.cpp:80: displayFPS] Unique ID = 7c4e2774-e3c2-415c-8c8b-ab3d420b92c9_1:7c4e2774-e3c2-415c-8c8b-ab3d420b92c9_in FPS = { 29.988873, 29.988873, 29.994843, 30.249584, 29.916251, 29.994792, 30.061507, 29.988936, 29.994792, 29.988936, 29.994843, 30.153816 }
  • 停滞的管道:当 VST 未在 UDP 连接中接收到数据时,它将打印停滞的管道日志。停滞的管道意味着 VST 的 UDP 连接未接收到头像流数据。这意味着 UDP 的 GRPC 调用成功,但 VST 未在该连接上接收到任何数据。

[2024-5-17T6:34:0.614Z:134091898877504:gstnvvideoudpclient.cpp:1192: checkVideoDataFlowStatus] Video data flow is stalled, attempt rest pipeline
  • GRPC 调用:要检查 GRPC 调用是否成功,可以使用以下日志。VST 通过此 GRPC 连接接收头像流数据。

[2024-12-20T9:50:43.508Z:137988407297600:nvgrpc.cpp:217: CreateUDPConnection]   GRPC call CreateUDPConnection

[2024-12-20T9:50:43.508Z:137988407297600:nvgrpc.cpp:304: addDevice]     addDevice

[2024-12-20T9:50:43.508Z:137988407297600:nvgrpc.cpp:141: parseFromClientRequest]        GRPC Client video params codec:h264, fps:30

[2024-12-20T9:50:43.508Z:137988407297600:nvgrpc.cpp:149: parseFromClientRequest]        GRPC Client audio params codec:pcm, sample_rate:16000, bps:32

[2024-12-20T9:50:43.508Z:137988407297600:nvgrpc.cpp:407: addDevice]     audio_enable:1, audio_codec = pcm, sample_rate = 16000, bps = 32

报告未解决的问题#

附加 Tokkio UI 日志#

要收集 Tokkio UI 日志,请打开 Chrome 的开发者工具并转到控制台。右键单击控制台中的任意位置并保存控制台日志。确保在保存日志之前启用所有日志级别,如前所述。

Tokkio UI Logs

附加 WebRTC 统计信息转储文件#

要收集 WebRTC 统计信息以进行日志记录和报告问题,您可以使用“创建 WebRTC 内部转储”选项下载所有 WebRTC 统计信息的转储。这将下载一个 JSON 文件,该文件可用于调试目的。确保让统计信息运行几分钟,以便它可以收集足够的数据点。

NVIDIA WebRTC Internal Stack Dump

附加 VST 日志文件#

收集会话的 VST 日志。VST 日志文件可以在所有服务转储其日志的日志记录卷中找到,也可以通过 kubectl logs 命令收集。以下脚本可以从所有正在运行的容器中收集日志。请参阅 Tokkio 文档的故障排除部分,了解有关收集 pod 日志的更多信息。

#!/bin/bash
for pod in $(kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}')
do
   #depending on logs, this may take a while
   kubectl logs --all-containers $pod > $pod.txt
done

附加 nvidia-smi 输出#

在终端中运行 nvidia-smi 命令并复制其输出。这包含有关 GPU 驱动程序和利用率的信息。nvidia-smi 的典型输出将类似于示例日志。

NVIDIA smi log sample

部署故障排除#

常规故障排除#

使用默认 K8s 命名空间#

在启动 Tokkio 工作流程时,如果您在配置文件中设置了 spec.app.configs.app_settings.k8s_namespace = default,则应用程序可以正常启动。但是,在卸载应用程序组件时(–component app),卸载脚本会抛出以下错误。

fatal: [app-master]: FAILED! => {"changed": false, "error": 403, "msg": "Namespace default: Failed to delete object: b'{\"kind\":\"Status\",\"apiVersion\":\"v1\",\"metadata\":{},\"status\":\"Failure\",\"message\":\"namespaces \\\\\"default\\\\\" is forbidden: this namespace may not be deleted\",\"reason\":\"Forbidden\",\"details\":{\"name\":\"default\",\"kind\":\"namespaces\"},\"code\":403}\\n'", "reason": "Forbidden", "status": 403}

作为建议,避免对 spec.app.configs.app_settings.k8s_namespace 使用默认 kubernetes 命名空间。

裸金属#

某些模型部署以 ONNX 格式而不是 TRT 格式进行#

在仅重新部署 Tokkio 后端应用程序时,有时会观察到某些模型被转换为 ONNX 格式而不是 TRT 格式。这可能会导致诸如头像在 UI 上显示但不响应任何消息的问题。可以通过导航到 triton pod 日志并观察以下内容来确认此问题。

检查 triton pod 下 init 容器 riva-model-init 的日志。示例如下

kubectl logs triton0-7ccdd556bc-62qrr -c riva-model-init -n app

TensorRT is not available! Will use ONNX backend instead

此外,您可以滚动浏览 triton pod 的日志并注意到以下指示不正确转换的行。

kubectl logs triton0-7ccdd556bc-62qrr -n app

.
.
.
.

I0117 17:07:16.983936 30 server.cc:674]
+--------------------------------------------------------------+---------+--------+
| Model                                                        | Version | Status |
+--------------------------------------------------------------+---------+--------+
| fastpitch_hifigan_ensemble-English-US                        | 1       | READY  |
| parakeet-1.1b-en-US-asr-streaming-asr-bls-ensemble           | 1       | READY  |
| riva-onnx-fastpitch_encoder-English-US                       | 1       | READY  |
| riva-onnx-hifigan-English-US                                 | 1       | READY  |
| riva-onnx-parakeet-1.1b-en-US-asr-streaming-am-streaming     | 1       | READY  |
| riva-onnx-parakeet-1.1b-en-US-asr-streaming-vad-nn-streaming | 1       | READY  |
| spectrogram_chunker-English-US                               | 1       | READY  |
| tts_postprocessor-English-US                                 | 1       | READY  |
| tts_preprocessor-English-US                                  | 1       | READY  |
+--------------------------------------------------------------+---------+--------+

当正确转换发生时,triton pod 日志将如下所示

I0114 22:01:19.422007 30 server.cc:674]
+-------------------------------------------------------------+---------+--------+
| Model                                                       | Version | Status |
+-------------------------------------------------------------+---------+--------+
| fastpitch_hifigan_ensemble-English-US                       | 1       | READY  |
| parakeet-1.1b-en-US-asr-streaming-asr-bls-ensemble          | 1       | READY  |
| riva-onnx-fastpitch_encoder-English-US                      | 1       | READY  |
| riva-trt-hifigan-English-US                                 | 1       | READY  |
| riva-trt-parakeet-1.1b-en-US-asr-streaming-am-streaming     | 1       | READY  |
| riva-trt-parakeet-1.1b-en-US-asr-streaming-vad-nn-streaming | 1       | READY  |
| spectrogram_chunker-English-US                              | 1       | READY  |
| tts_postprocessor-English-US                                | 1       | READY  |
| tts_preprocessor-English-US                                 | 1       | READY  |
+-------------------------------------------------------------+---------+--------+

要解决此问题,请卸载整个设置并重新安装。

Microsoft Azure#

来自 CDN 的旧 UI 缓存#

有时,重新安装带有配置更改的 UI 或在现有 UI 上重新安装新 UI,通过 UI 端点浏览时不会反映出来。发生这种情况是因为 Azure CDN 缓存 UI 内容,导致在浏览时仍可见旧的 UI 内容。如果要强制清除 Azure CDN 的缓存,则需要使用以下命令使 Azure CDN 的缓存失效。

source my-env-file.env

az cdn endpoint purge --resource-group '<replace-with-actual-rg-name>' --profile-name '<replace-with-cdn-profile-name>' --name '<replace-with-actual-cdn-endpoint-hostname>' --content-paths '/*'

一旦上述命令成功运行,您可以尝试访问 UI 端点,它应该会反映最新的 UI 更改。