You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jetson Nano(JetPack 4.4)Docker镜像中PyTorch导入失败求助

PyTorch导入报错:cannot allocate memory in static TLS block(Jetson Nano + Docker环境)

问题描述

使用4GB版NVIDIA Jetson Nano,JetPack版本4.4,通过.whl文件成功安装PyTorch,Docker镜像可正常构建,但运行镜像时导入PyTorch出现如下报错:

==> Launching app...
Traceback (most recent call last):
  File "/code/catkin_ws/src/duckietown-safe-ml-demo/packages/safe_ml/src/ood_node.py", line 13, in <module>
    import torch
  File "/usr/local/lib/python3.8/dist-packages/torch/__init__.py", line 290, in <module>
    from torch._C import *  # noqa: F403
ImportError: /usr/local/lib/python3.8/dist-packages/torch/lib/../../torch.libs/libgomp-804f19d4.so.1.0.0: cannot allocate memory in static TLS block

我的Dockerfile配置

# parameters
ARG REPO_NAME="duckietown-safe-ml-demo"
ARG DESCRIPTION="Safe ML on the Duckie Town Platform"
ARG MAINTAINER="michaelj004@e.ntu.edu.sg"
# pick an icon from: https://fontawesome.com/v4.7.0/icons/
ARG ICON="cube"

# ==================================================>
# ==> Do not change the code below this line
ARG ARCH=arm32v7
ARG DISTRO=daffy
ARG BASE_TAG=${DISTRO}-${ARCH}
ARG BASE_IMAGE=dt-ros-commons
ARG LAUNCHER=default

# define base image
FROM duckietown/${BASE_IMAGE}:${BASE_TAG} as BASE

# Changed to have the full suite of DT-packages.
#ARG AIDO_REGISTRY=docker.io
#FROM ${AIDO_REGISTRY}/duckietown/dt-car-interface:${BASE_TAG} AS dt-car-interface
#FROM ${AIDO_REGISTRY}/duckietown/dt-core:${BASE_TAG} AS base

# recall all arguments
ARG ARCH
ARG DISTRO
ARG REPO_NAME
ARG DESCRIPTION
ARG MAINTAINER
ARG ICON
ARG BASE_TAG
ARG BASE_IMAGE
ARG LAUNCHER

# check build arguments
RUN dt-build-env-check "${REPO_NAME}" "${MAINTAINER}" "${DESCRIPTION}"

# define/create repository path
ARG REPO_PATH="${CATKIN_WS_DIR}/src/${REPO_NAME}"
ARG LAUNCH_PATH="${LAUNCH_DIR}/${REPO_NAME}"
RUN mkdir -p "${REPO_PATH}"
RUN mkdir -p "${LAUNCH_PATH}"
#WORKDIR "${REPO_PATH}"
WORKDIR /code
#COPY --from=dt-car-interface ${CATKIN_WS_DIR}/src/dt-car-interface ${CATKIN_WS_DIR}/src/dt-car-interface

# keep some arguments as environment variables
ENV DT_MODULE_TYPE "${REPO_NAME}"
ENV DT_MODULE_DESCRIPTION "${DESCRIPTION}"
ENV DT_MODULE_ICON "${ICON}"
ENV DT_MAINTAINER "${MAINTAINER}"
ENV DT_REPO_PATH "${REPO_PATH}"
ENV DT_LAUNCH_PATH "${LAUNCH_PATH}"
ENV DT_LAUNCHER "${LAUNCHER}"

# Daniel - Add some dependencies
RUN apt-get update -y && apt-get install -y --no-install-recommends \
         gcc \
         libc-dev\
         git \
         bzip2 \
         python3-tk \
         python3-wheel \
         python3-pip  \
         python3-pillow  \
         software-properties-common \
         #Pytorch dependencies
         libopenblas-dev \
         libblas-dev \
         libcairo2-dev \
         pkg-config \
         m4 \
         cmake \
         cython \
         python3-dev \
         python3-yaml \
         curl \
         python3-setuptools && \
     rm -rf /var/lib/apt/lists/*

RUN echo PYTHONPATH=$PYTHONPATH
RUN pip3 install -U "pip>=20.2" pipdeptree setuptools wheel
RUN pip3 install pycairo
COPY ./libraries "${REPO_PATH}/libraries"
RUN pip3 install "${REPO_PATH}/libraries/numpy-1.20.0-cp38-cp38-manylinux2014_aarch64.whl"
RUN pip3 install "${REPO_PATH}/libraries/torch-2.1.0a0+41361538.nv23.06-cp38-cp38-linux_aarch64.whl"
RUN pip3 install "${REPO_PATH}/libraries/torchvision-0.19.0-cp38-cp38-manylinux2014_aarch64.whl"

RUN pipdeptree
RUN pip list

RUN echo "deb https://packages.cloud.google.com/apt coral-edgetpu-stable main" | sudo tee /etc/apt/sources.list.d/coral-edgetpu.list && \
    curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add - && \
    sudo apt-get update && \
    sudo apt-get install libedgetpu1-std


# install apt dependencies
COPY ./dependencies-apt.txt "${REPO_PATH}/"
RUN dt-apt-install ${REPO_PATH}/dependencies-apt.txt

# install python3 dependencies
COPY ./dependencies-py3.txt "${REPO_PATH}/"
RUN pip3 install -r ${REPO_PATH}/dependencies-py3.txt

# copy the source code
COPY ./packages "${REPO_PATH}/packages"

# build packages
RUN . /opt/ros/${ROS_DISTRO}/setup.sh && \
  catkin build \
    --workspace ${CATKIN_WS_DIR}/

# install launcher scripts
COPY ./launchers/. "${LAUNCH_PATH}/"
COPY ./launchers/default.sh "${LAUNCH_PATH}/"
RUN dt-install-launchers "${LAUNCH_PATH}"

# define default command
CMD ["bash", "-c", "dt-launcher-${DT_LAUNCHER}"]

# store module metadata
LABEL org.duckietown.label.module.type="${REPO_NAME}" \
    org.duckietown.label.module.description="${DESCRIPTION}" \
    org.duckietown.label.module.icon="${ICON}" \
    org.duckietown.label.architecture="${ARCH}" \
    org.duckietown.label.code.location="${REPO_PATH}" \
    org.duckietown.label.code.version.distro="${DISTRO}" \
    org.duckietown.label.base.image="${BASE_IMAGE}" \
    org.duckietown.label.base.tag="${BASE_TAG}" \
    org.duckietown.label.maintainer="${MAINTAINER}"
# <== Do not change the code above this line
# <==================================================

解决方案

1. 修正架构不匹配问题(核心)

Dockerfile指定了ARG ARCH=arm32v7(ARM32位架构),但安装的numpy、PyTorch、torchvision都是manylinux2014_aarch64(ARM64位)的包,架构不兼容是报错的主要原因。

修改步骤:

  • 下载对应armv7l/arm32v7架构的whl包:
    • numpy:选择cp38版本的arm32包,如numpy-1.20.0-cp38-cp38-linux_armv7l.whl
    • PyTorch:选用JetPack4.4兼容的ARM32版本,如PyTorch 1.9.0的armv7l包
    • torchvision:匹配PyTorch版本的armv7l包,如0.10.0版本
  • 替换Dockerfile中的安装命令:
RUN pip3 install "${REPO_PATH}/libraries/numpy-1.20.0-cp38-cp38-linux_armv7l.whl"
RUN pip3 install "${REPO_PATH}/libraries/torch-1.9.0-cp38-cp38-linux_armv7l.whl"
RUN pip3 install "${REPO_PATH}/libraries/torchvision-0.10.0-cp38-cp38-linux_armv7l.whl"

2. 预加载libgomp库解决TLS内存问题

架构修正后若仍报错,可通过预加载libgomp库解决:
在Dockerfile中PyTorch安装完成后添加环境变量:

ENV LD_PRELOAD=/usr/local/lib/python3.8/dist-packages/torch.libs/libgomp-804f19d4.so.1.0.0

(若文件名有变动,替换为实际路径即可)

3. 安装系统版libgomp

安装系统自带的libgomp1,替换PyTorch打包的版本避免冲突:

  • 在Dockerfile的apt依赖安装部分添加libgomp1:
RUN apt-get update -y && apt-get install -y --no-install-recommends \
    # 原有依赖...
    libgomp1 \
    # 其他依赖...
  • 设置预加载系统库:
ENV LD_PRELOAD=/usr/lib/arm-linux-gnueabihf/libgomp.so.1

4. 调整容器内存限制(可选)

Jetson Nano内存有限,运行容器时可增加内存限制:

docker run --memory=3g --memory-swap=4g [你的镜像名]

内容的提问来源于stack exchange,提问作者Vivek Velachhawala

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 21:05:53