

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 机器学习推理故障排除
<a name="ml-troubleshooting"></a>

使用本节中的故障排除信息和解决方案可帮助解决机器学习组件问题。有关公有机器学习推理组件，请参阅以下组件日志中的错误消息：

------
#### [ Linux or Unix ]
+ `/greengrass/v2/logs/aws.greengrass.DLRImageClassification.log`
+ `/greengrass/v2/logs/aws.greengrass.DLRObjectDetection.log`
+ `/greengrass/v2/logs/aws.greengrass.TensorFlowLiteImageClassification.log`
+ `/greengrass/v2/logs/aws.greengrass.TensorFlowLiteObjectDetection.log`

------
#### [ Windows ]
+ `C:\greengrass\v2\logs\aws.greengrass.DLRImageClassification.log`
+ `C:\greengrass\v2\logs\aws.greengrass.DLRObjectDetection.log`
+ `C:\greengrass\v2\logs\aws.greengrass.TensorFlowLiteImageClassification.log`
+ `C:\greengrass\v2\logs\aws.greengrass.TensorFlowLiteObjectDetection.log`

------

如果组件安装正确，则组件日志将包含用于推理的库的位置。

**Topics**
+ [无法获取库](#rpi-update-error)
+ [Cannot open shared object file](#rpi-import-cv-error)
+ [Error: ModuleNotFoundError: No module named '<library>'](#troubleshooting-venv-errors-not-found)
+ [未检测到支持 CUDA 的设备](#troubleshooting-cuda-error)
+ [没有此类文件或目录](#troubleshooting-venv-errors-no-such-file)
+ [RuntimeError: module compiled against API version 0xf but this version of NumPy is <version>](#troubleshooting-rpi-numpy-version-error)
+ [picamera.exc.PiCameraError: Camera is not enabled](#troubleshooting-rpi-camera-stack-error)
+ [内存错误](#troubleshooting-memory-errors)
+ [磁盘空间错误](#troubleshooting-disk-space-errors)
+ [超时错误](#troubleshooting-timeout-errors)

## 无法获取库
<a name="rpi-update-error"></a>

在 Raspberry Pi 设备上部署期间，如果安装程序脚本无法下载所需的库，则会发生以下错误。

```
Err:2 http://raspbian.raspberrypi.org/raspbian buster/main armhf python3.7-dev armhf 3.7.3-2+deb10u1
404 Not Found [IP: 93.93.128.193 80] 
E: Failed to fetch http://raspbian.raspberrypi.org/raspbian/pool/main/p/python3.7/libpython3.7-dev_3.7.3-2+deb10u1_armhf.deb 404 Not Found [IP: 93.93.128.193 80]
```

再次运行 `sudo apt-get update` 并部署您的组件。

## Cannot open shared object file
<a name="rpi-import-cv-error"></a>

在 Raspberry Pi 设备上部署期间，如果安装程序脚本无法下载所需的 `opencv-python` 依赖关系，您可能会看到类似以下内容的错误。

```
ImportError: libopenjp2.so.7: cannot open shared object file: No such file or directory
```

运行以下命令以手动安装 `opencv-python` 依赖关系：

```
sudo apt-get install libopenjp2-7 libilmbase23 libopenexr-dev libavcodec-dev libavformat-dev libswscale-dev libv4l-dev libgtk-3-0 libwebp-dev
```

## Error: ModuleNotFoundError: No module named '<library>'
<a name="troubleshooting-venv-errors-not-found"></a>

当 ML 运行时库或其依赖关系未正确安装时，您可能会在 ML 运行时组件日志（`variant.DLR.log` 或 `variant.TensorFlowLite.log`）中看到此错误。以下情况下可能会出现此错误：
+ 如果您使用默认处于启用状态的 `UseInstaller` 选项，则此错误表示 ML 运行时组件无法安装运行时或其依赖关系。执行以下操作：

  1. 配置 ML 运行时组件以禁用 `UseInstaller` 选项。

  1. 安装 ML 运行时及其依赖关系，并使其可供运行 ML 组件的系统用户使用。有关更多信息，请参阅下列内容：
     + [DLR 运行时选项 UseInstaller ](dlr-component.md#dlr-component-config-useinstaller-term)
     + [TensorFlow精简版运行时 UseInstaller 选项](tensorflow-lite-component.md#tensorflow-lite-component-config-useinstaller-term)
+ 如果您不使用 `UseInstaller` 选项，则此错误表示没有为运行 ML 组件的系统用户安装 ML 运行时或其依赖关系。执行以下操作：

  1. 检查是否为运行 ML 组件的系统用户安装了该库。*ggc\$1user*替换为系统用户的名称，然后*tflite\$1runtime*替换为要检查的库的名称。

------
#### [ Linux or Unix ]

     ```
     sudo -H -u ggc_user bash -c "python3 -c 'import tflite_runtime'"
     ```

------
#### [ Windows ]

     ```
     runas /user:ggc_user "py -3 -c \"import tflite_runtime\""
     ```

------

  1. 如果未安装该库，请为该用户安装。*ggc\$1user*替换为系统用户的名称，然后*tflite\$1runtime*替换为库的名称。

------
#### [ Linux or Unix ]

     ```
     sudo -H -u ggc_user bash -c "python3 -m pip install --user tflite_runtime"
     ```

------
#### [ Windows ]

     ```
     runas /user:ggc_user "py -3 -m pip install --user tflite_runtime"
     ```

------

     有关每个 ML 运行时的依赖关系的更多信息，请参阅以下内容：
     + [DLR 运行时选项 UseInstaller ](dlr-component.md#dlr-component-config-useinstaller-term)
     + [TensorFlow精简版运行时 UseInstaller 选项](tensorflow-lite-component.md#tensorflow-lite-component-config-useinstaller-term)

  1. 如果问题仍然存在，请为其他用户安装该库，以确认此设备是否可以安装该库。例如，该用户可以是您的用户、根用户或管理员用户。如果您无法为任何用户成功安装该库，则可能是您的设备不支持该库。请查阅库的文档，查看要求并排查安装问题。

## 未检测到支持 CUDA 的设备
<a name="troubleshooting-cuda-error"></a>

当您使用 GPU 加速时，可能会看到以下错误。运行以下命令为 Greengrass 用户启用 GPU 访问权限。

```
sudo usermod -a -G video ggc_user
```

## 没有此类文件或目录
<a name="troubleshooting-venv-errors-no-such-file"></a>

以下错误表示运行时组件无法正确设置虚拟环境：
+ `MLRootPath/greengrass_ml_dlr_conda/bin/conda: No such file or directory `
+ `MLRootPath/greengrass_ml_dlr_venv/bin/activate: No such file or directory ` 
+ `MLRootPath/greengrass_ml_tflite_conda/bin/conda: No such file or directory ` 
+ `MLRootPath/greengrass_ml_tflite_venv/bin/activate: No such file or directory `

检查日志，确保所有运行时依赖关系均已正确安装。有关安装程序脚本所安装库的更多信息，请参阅以下主题：
+ [DLR 运行时](dlr-component.md)
+ [TensorFlow 精简版运行时](tensorflow-lite-component.md)

默认情况下*MLRootPath*，设置为`/greengrass/v2/work/component-name/greengrass_ml`。要更改此位置，请直接在部署中包含 [DLR 运行时](dlr-component.md) 或 [TensorFlow 精简版运行时](tensorflow-lite-component.md) 运行时组件，并在配置合并更新中为 `MLRootPath` 参数指定修改后的值。有关配置组件的更多信息，请参阅[更新组件配置](update-component-configurations.md)。

**注意**  
对于 DLR 组件 v1.3.x，您可以在推理组件的配置中设置 `MLRootPath` 参数，默认值为 `$HOME/greengrass_ml`。

## RuntimeError: module compiled against API version 0xf but this version of NumPy is <version>
<a name="troubleshooting-rpi-numpy-version-error"></a>

在运行 Raspberry Pi OS Bullseye 的 Raspberry Pi 上运行机器学习推理时，您可能会看到以下错误。

```
RuntimeError: module compiled against API version 0xf but this version of numpy is 0xd
ImportError: numpy.core.multiarray failed to import
```

之所以出现此错误，是因为 Raspberry Pi OS Bullseye 包含的版本早 NumPy于 OpenCV 要求的版本。要修复此问题，请运行以下命令升级 NumPy 到最新版本。

```
pip3 install --upgrade numpy
```

## picamera.exc.PiCameraError: Camera is not enabled
<a name="troubleshooting-rpi-camera-stack-error"></a>

在运行 Raspberry Pi OS Bullseye 的 Raspberry Pi 上运行机器学习推理时，您可能会看到以下错误。

```
picamera.exc.PiCameraError: Camera is not enabled. Try running 'sudo raspi-config' and ensure that the camera has been enabled.
```

之所以出现此错误，是因为 Raspberry Pi OS Bullseye 包含一个与 ML 组件不兼容的新摄像机堆栈。要修复这一问题，请启用旧摄像机堆栈。<a name="raspberry-pi-bullseye-enable-legacy-camera-stack"></a>

**启用旧摄像机堆栈**

1. 运行以下命令以打开 Raspberry Pi 配置工具。

   ```
   sudo raspi-config
   ```

1. 选择**接口选项**。

1. 选择**旧摄像机**以启用旧摄像机堆栈。

1. 重启 Raspberry Pi。

## 内存错误
<a name="troubleshooting-memory-errors"></a>

当设备内存不足，组件进程中断时，通常会出现以下错误。
+ `stderr. Killed.`
+ `exitCode=137`

我们建议至少有 500 MB 的内存来部署公有机器学习推理组件。

## 磁盘空间错误
<a name="troubleshooting-disk-space-errors"></a>

`no space left on device` 错误通常在设备没有足够的存储时发生。在再次部署组件之前，请确保设备上有足够的可用磁盘空间。我们建议至少有 500 MB 的可用磁盘空间来部署公有机器学习推理组件。

## 超时错误
<a name="troubleshooting-timeout-errors"></a>

公有机器学习组件会下载大于 200 MB 的大型机器学习模型文件。如果在部署期间下载超时，请检查您的互联网连接速度并重试部署。