From 22464fe670f0859b359fc323100ef48c317874cb Mon Sep 17 00:00:00 2001 From: GuangJie1 Date: Fri, 23 Aug 2024 16:36:33 +0800 Subject: [PATCH 1/3] openeuler-pytorch: Add pytorch's image to the openeuler image repository --- .../22.03-lts-sp4/Dockerfile | 22 +++++ pytorch/README.md | 91 +++++++++++++++---- pytorch/doc/image-info.yml | 43 +++++++-- pytorch/meta.yml | 3 + 4 files changed, 132 insertions(+), 27 deletions(-) create mode 100644 pytorch/2.2.0-cann8.0.RC1/22.03-lts-sp4/Dockerfile diff --git a/pytorch/2.2.0-cann8.0.RC1/22.03-lts-sp4/Dockerfile b/pytorch/2.2.0-cann8.0.RC1/22.03-lts-sp4/Dockerfile new file mode 100644 index 00000000..58ec6081 --- /dev/null +++ b/pytorch/2.2.0-cann8.0.RC1/22.03-lts-sp4/Dockerfile @@ -0,0 +1,22 @@ +ARG BASE=openeuler/cann:8.0.RC1-oe2203sp4 +FROM ${BASE} + +# Arguments +ARG VERSION=2.2.0 +ARG TORCH_AUDIO_VERSION=2.2.0 +ARG TORCH_NPU_VERSION=2.2.0 +ARG TORCH_VISION_VERSION=0.17.0 + +# Change the default shell +SHELL [ "/bin/bash", "-c" ] + +# Install pytorch, torch-npu and related packages +# Uninstall the latest numpy and sympy first, as the right versions will be installed again \ +# after installing following packages \ +RUN pip uninstall -y numpy sympy && \ + pip install --no-cache-dir --index-url https://download.pytorch.org/whl/cpu \ + torch==${VERSION} \ + torchvision==${TORCH_VISION_VERSION} \ + torchaudio==${TORCH_AUDIO_VERSION} && \ + pip install --no-cache-dir \ + torch-npu==${TORCH_NPU_VERSION} \ No newline at end of file diff --git a/pytorch/README.md b/pytorch/README.md index f236e04e..43b3f67f 100644 --- a/pytorch/README.md +++ b/pytorch/README.md @@ -1,30 +1,83 @@ -# pytorch - # Quick reference -- The official pytorch docker image. +- The official PyTorch docker image. -- Maintained by: [openEuler CloudNative SIG](https://gitee.com/openeuler/cloudnative) +- Maintained by: [openEuler CloudNative SIG](https://gitee.com/openeuler/cloudnative). -- Where to get help: [openEuler CloudNative SIG](https://gitee.com/openeuler/cloudnative), [openEuler](https://gitee.com/openeuler/community) +- Where to get help: [openEuler CloudNative SIG](https://gitee.com/openeuler/cloudnative), [openEuler](https://gitee.com/openeuler/community). -# Build reference +# PyTorch | openEuler +Current PyTorch docker images are built on the [openEuler](https://repo.openeuler.org/). This repository is free to use and exempted from per-user rate limits. -1. Build images and push: -```shell -docker buildx build -t "openeuler/pytorch:$TAG" --platform linux/arm64 ./$TAG --push -``` +PyTorch is a Python package that provides two high-level features: +- Tensor computation (like NumPy) with strong GPU acceleration +- Deep neural networks built on a tape-based autograd system -We are using `buildx` in here to generate ARM64 images on different host, see more in [Docker Buildx](https://docs.docker.com/buildx/working-with-buildx/) +You can reuse your favorite Python packages such as NumPy, SciPy, and Cython to extend PyTorch when needed. -# How to use this image -Please run container with this image on Ascend platform of ARM64. -```shell -docker run --device $DEVICE --device /dev/davinci_manager --device /dev/devmm_svm --device /dev/hisi_hdc -v /usr/local/dcmi:/usr/local/dcmi -v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi -v /usr/local/Ascend/driver/lib64/:/usr/local/Ascend/driver/lib64/ -v /usr/local/Ascend/driver/version.info:/usr/local/Ascend/driver/version.info -it openeuler/pytorch:$TAG -``` +Learn more about on [PyTorch Website](https://pytorch.org/docs/stable/index.html). # Supported tags and respective Dockerfile links -- pytorch2.1.0.a1-cann7.0.RC1.alpha002-oe2203sp2: pytorch pytorch2.1.0.a1-cann7.0.RC1.alpha002, openEuler 22.03 LTS SP2 +The tag of each `pytorch` docker image is consist of the complete software stack version. The details are as follows +| Tag | Currently | Architectures | +|----------|-------------|------------------| +|[pytorch2.1.0.a1-cann7.0.RC1.alpha002-oe2203sp2](https://gitee.com/openeuler/openeuler-docker-images/blob/master/pytorch/2.1.0.a1-cann7.0.RC1.alpha002/22.03-lts-sp2/Dockerfile)| pyTorch 2.1.0.a1 with cann 7.0.RC1.alpha002 on openEuler 22.03-LTS-SP2 | arm64 | +|[2.2.0-cann8.0.RC1-oe2203sp4](https://gitee.com/openeuler/openeuler-docker-images/blob/master/pytorch/2.2.0-cann8.0.RC1-py3.8/22.03-lts-sp2/Dockerfile)| PyTorch 2.2.0 with cann 8.0.RC1 on openEuler 22.03-LTS-SP4 | arm64,amd64 | + +# Usage +In this usage, users can select the corresponding `{Tag}` and `container startup options` based on their requirements. + +- Pull the `openeuler/pytorch` image from docker + + ```bash + docker pull openeuler/pytorch:{Tag} + ``` + +- Start a pytorch instance + + ```bash + docker run \ + --name my-pytorch \ + --device /dev/davinci1 \ + --device /dev/davinci_manager \ + --device /dev/devmm_svm \ + --device /dev/hisi_hdc \ + -v /usr/local/dcmi:/usr/local/dcmi \ + -v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \ + -v /usr/local/Ascend/driver/lib64/:/usr/local/Ascend/driver/lib64/ \ + -v /usr/local/Ascend/driver/version.info:/usr/local/Ascend/driver/version.info \ + -v /etc/ascend_install.info:/etc/ascend_install.info \ + -it openeuler/pytorch:{Tag} bash + ``` + +- Container startup options + + | Option | Description | + |--|--| + | `--name my-pytorch` | Names the container `my-pytorch`. | + | `--device /dev/davinciX` | NPU device, where `X` is the physical ID number of the chip, e.g., davinci1. | + | `--device /dev/davinci_manager` | Davinci-related management device. | + | `--device /dev/devmm_svm` | Memory management-related device. | + | `--device /dev/hisi_hdc` | HDC-related management device. | + | `-v /usr/local/dcmi:/usr/local/dcmi` | Mounts the host's DCMI .so and interface file directory /usr/local/dcmi to the container. Please modify according to actual situation. | + | `-v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi` | Mount the host npu-smi tool "/usr/local/bin/npu-smi" into the container. Please modify it according to the actual situation. | + | `-v /usr/local/Ascend/driver/lib64/:/usr/local/Ascend/driver/lib64/` | Mounts the host directory /usr/local/Ascend/driver/lib64/driver to the container. Please modify according to the path where the driver's .so files are located. | + | `-v /usr/local/Ascend/driver/version.info:/usr/local/Ascend/driver/version.info` | Mounts the host's version information file /usr/local/Ascend/driver/version.info to the container. Please modify according to actual situation. | + | `-v /etc/ascend_install.info:/etc/ascend_install.info` | Mounts the host's installation information file /etc/ascend_install.info to the container. | + | `-it` | Starts the container in interactive mode with a terminal (bash). | + | `openeuler/pytorch:{Tag}` | Specifies the Docker image to run, replace `{Tag}` with the specific version or tag of the `openeuler/pytorch` image you want to use. | + +- View container running logs + + ```bash + docker logs -f my-pytorch + ``` + +- To get an interactive shell + + ```bash + docker exec -it my-pytorch /bin/bash + ``` -## Operating System -Linux/Unix, ARM64 architecture. +# Question and answering +If you have any questions or want to use some special features, please submit an issue or a pull request on [openeuler-docker-images](https://gitee.com/openeuler/openeuler-docker-images). \ No newline at end of file diff --git a/pytorch/doc/image-info.yml b/pytorch/doc/image-info.yml index f4a53bf8..3afb6e11 100644 --- a/pytorch/doc/image-info.yml +++ b/pytorch/doc/image-info.yml @@ -1,17 +1,18 @@ -name: pyTorch +name: pytorch category: ai -description: pyTorch是一个开源的Ppython机器学习库,基于torch,用于自然语言处理等应用程序。pyTorch既可以看作加入了GPU支持的numpy,同时也可以看成一个拥有自动求导功能的强大的深度神经网络。 +description: PyTorch是一个开源的Python机器学习库,基于torch,用于自然语言处理等应用程序。PyTorch既可以看作加入了GPU支持的numpy,同时也可以看成一个拥有自动求导功能的强大的深度神经网络。 environment: | 本应用在Docker环境中运行,安装Docker执行如下命令 ``` yum install -y docker ``` tags: | - pyTorch镜像的Tag由其版本信息和基础镜像版本信息组成,详细内容如下 + PyTorch镜像的Tag由其版本信息和基础镜像版本信息组成,详细内容如下 | Tag | Currently | Architectures | |----------|-------------|------------------| - |[pytorch2.1.0.a1-cann7.0.RC1.alpha002-oe2203sp2](https://gitee.com/openeuler/openeuler-docker-images/blob/master/pytorch/2.1.0.a1-cann7.0.RC1.alpha002/22.03-lts-sp2/Dockerfile)| pyTorch pytorch2.1.0.a1-cann7.0.RC1.alpha002 on openEuler 22.03-LTS-SP2 | arm64 | + |[pytorch2.1.0.a1-cann7.0.RC1.alpha002-oe2203sp2](https://gitee.com/openeuler/openeuler-docker-images/blob/master/pytorch/2.1.0.a1-cann7.0.RC1.alpha002/22.03-lts-sp2/Dockerfile)| PyTorch pytorch2.1.0.a1-cann7.0.RC1.alpha002 on openEuler 22.03-LTS-SP2 | arm64 | + |[2.2.0-cann8.0.RC1-oe2203sp4](https://gitee.com/openeuler/openeuler-docker-images/blob/master/pytorch/2.2.0-cann8.0.RC1/22.03-lts-sp4/Dockerfile)| PyTorch 2.2.0 with CANN 8.0.RC1 on openEuler 22.03-LTS-SP4 | arm64,amd64 | download: | 拉取镜像到本地 @@ -22,9 +23,36 @@ download: | usage: | - 启动容器 ``` - docker run -d --name my-pytorch openeuler/pytorch:{Tag} + docker run \ + --name my-pytorch \ + --device ${device} \ + --device /dev/davinci_manager \ + --device /dev/devmm_svm \ + --device /dev/hisi_hdc \ + -v /usr/local/dcmi:/usr/local/dcmi \ + -v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \ + -v /usr/local/Ascend/driver/lib64/:/usr/local/Ascend/driver/lib64/ \ + -v /usr/local/Ascend/driver/version.info:/usr/local/Ascend/driver/version.info \ + -v /etc/ascend_install.info:/etc/ascend_install.info \ + -it openeuler/pytorch:{Tag} bash ``` - 用户可根据自身需求选择对应版本的{Tag}、容器启动的选项。 + 用户可根据自身需求选择对应的硬件设备{device}和对应版本的{Tag}、容器启动的选项。 + + - 参数说明 + | 配置项 | 描述 | + |--|--| + | `--name my-pytorch` | 容器名称。| + | `--device /dev/davinci1` | NPU设备,X是芯片物理ID号,例如davinci1。 | + | `--device /dev/davinci_manager` | davinci相关的管理设备。 | + | `--device /dev/devmm_svm` | 内存管理相关设备。 | + | `--device /dev/hisi_hdc` | hdc相关管理设备。 | + | `-v /usr/local/dcmi:/usr/local/dcmi` | 将宿主机dcmi的.so和接口文件目录`/usr/local/dcmi`挂载到容器中,请根据实际情况修改。 | + | `-v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi` | 将宿主机`npu-smi`工具`/usr/local/bin/npu-smi`挂载到容器中,请根据实际情况修改。 | + | `-v /usr/local/Ascend/driver/lib64/:/usr/local/Ascend/driver/lib64/` | 将宿主机目录`/usr/local/Ascend/driver/lib64/driver`挂载到容器中。请根据driver的驱动.so所在路径修改。 | + | `-v /usr/local/Ascend/driver/version.info:/usr/local/Ascend/driver/version.info` | 将宿主机版本信息文件`/usr/local/Ascend/driver/version.info`挂载到容器中,请根据实际情况修改。 | + | `-v /etc/ascend_install.info:/etc/ascend_install.info` |将宿主机安装信息文件`/etc/ascend_install.info`挂载到容器中。 | + | `-it` | 以交互模式启动容器。 | + | `openeuler/pytorch:{Tag}` | 指定要运行的镜像为 `openeuler/pytorch`,其中` {Tag}` 是需要替换的镜像标签。 | - 容器测试 @@ -40,8 +68,7 @@ usage: | license: BSD 3-Clause license similar_packages: - - TensorFlow: TensorFlow是一个基于数据流编程(dataflow programming)的符号数学系统,被广泛应用于各类机器学习(machine learning)算法的编程实现,其前身是谷歌的神经网络算法库DistBelief。 - - OpenCV: OpenCV是一个基于Apache2.0许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux、Windows、Android和Mac OS操作系统上。 + - MindSpore: 昇思MindSpore是由华为于2019年8月推出的新一代全场景AI框架,2020年3月28日,华为宣布昇思MindSpore正式开源。昇思MindSpore是一个全场景AI框架,旨在实现易开发、高效执行、全场景统一部署三大目标 dependency: - astunparse - expecttest diff --git a/pytorch/meta.yml b/pytorch/meta.yml index c3ea7b24..3f7016d0 100644 --- a/pytorch/meta.yml +++ b/pytorch/meta.yml @@ -1,2 +1,5 @@ pytorch2.1.0.a1-cann7.0.RC1.alpha002-oe2203sp2: path: pytorch/2.1.0.a1-cann7.0.RC1.alpha002/22.03-lts-sp2/Dockerfile + arch: aarch64 +2.2.0-cann8.0.RC1-oe2203sp4: + path: pytorch/2.2.0-cann8.0.RC1/22.03-lts-sp4/Dockerfile -- Gitee From 9188c39483e2136e2fbc064c50d10e026481c8c6 Mon Sep 17 00:00:00 2001 From: GuangJie1 Date: Fri, 23 Aug 2024 16:49:36 +0800 Subject: [PATCH 2/3] openeuler-mindspore: Add mindspore's image to the openeuler image repository --- .../22.03-lts-sp4/Dockerfile | 12 +++ mindspore/README.md | 78 +++++++++++++++ mindspore/doc/image-info.yml | 90 ++++++++++++++++++ mindspore/doc/picture/logo.png | Bin 0 -> 47092 bytes mindspore/meta.yml | 2 + .../22.03-lts-sp4/Dockerfile | 12 +-- pytorch/README.md | 2 +- pytorch/doc/image-info.yml | 4 +- 8 files changed, 191 insertions(+), 9 deletions(-) create mode 100644 mindspore/2.3.0.rc1-cann8.0.RC1/22.03-lts-sp4/Dockerfile create mode 100644 mindspore/README.md create mode 100644 mindspore/doc/image-info.yml create mode 100644 mindspore/doc/picture/logo.png create mode 100644 mindspore/meta.yml diff --git a/mindspore/2.3.0.rc1-cann8.0.RC1/22.03-lts-sp4/Dockerfile b/mindspore/2.3.0.rc1-cann8.0.RC1/22.03-lts-sp4/Dockerfile new file mode 100644 index 00000000..ef278427 --- /dev/null +++ b/mindspore/2.3.0.rc1-cann8.0.RC1/22.03-lts-sp4/Dockerfile @@ -0,0 +1,12 @@ +ARG BASE=openeuler/cann:8.0.RC1-oe2203sp4 +FROM ${BASE} + +# Arguments +ARG VERSION=2.3.0rc1 + +# Change the default shell +SHELL [ "/bin/bash", "-c" ] + +# Install mindspore +RUN pip install --no-cache-dir \ + mindspore==${VERSION} \ No newline at end of file diff --git a/mindspore/README.md b/mindspore/README.md new file mode 100644 index 00000000..fb5444b5 --- /dev/null +++ b/mindspore/README.md @@ -0,0 +1,78 @@ +# Quick reference + +- The official MindSpore docker image. + +- Maintained by: [openEuler CloudNative SIG](https://gitee.com/openeuler/cloudnative). + +- Where to get help: [openEuler CloudNative SIG](https://gitee.com/openeuler/cloudnative), [openEuler](https://gitee.com/openeuler/community). + +# MindSpore | openEuler +Current MindSpore docker images are built on the [openEuler](https://repo.openeuler.org/). This repository is free to use and exempted from per-user rate limits. + +MindSpore is a new open source deep learning training/inference framework that could be used for mobile, edge and cloud scenarios. MindSpore is designed to provide development experience with friendly design and efficient execution for the data scientists and algorithmic engineers, native support for Ascend AI processor, and software hardware co-optimization. At the meantime MindSpore as a global AI open source community, aims to further advance the development and enrichment of the AI software/hardware application ecosystem. + +For more details please check out our [Architecture Guide](https://www.mindspore.cn/tutorials/en/master/beginner/introduction.html)⁠. + +# Supported tags and respective Dockerfile links +The tag of each `mindspore` docker image is consist of the complete software stack version. The details are as follows +| Tag | Currently | Architectures | +|----------|-------------|------------------| +|[2.3.0rc1-cann8.0.RC1-oe2203sp4](https://gitee.com/openeuler/openeuler-docker-images/blob/master/mindspore/2.3.0.rc1-cann8.0.RC1/22.03-lts-sp4/Dockerfile)| MindSpore 2.3.0.rc1 with CANN 8.0.RC1 on openEuler 22.03-LTS-SP4 | amd64, arm64 | + +# Usage +In this usage, users can select the corresponding `{Tag}` and `container startup options` based on their requirements. + +- Pull the `openeuler/mindspore` image from docker + + ```bash + docker pull openeuler/mindspore:{Tag} + ``` + +- Start a mindspore instance + + ```bash + docker run \ + --name my-mindspore \ + --device /dev/davinci1 \ + --device /dev/davinci_manager \ + --device /dev/devmm_svm \ + --device /dev/hisi_hdc \ + -v /usr/local/dcmi:/usr/local/dcmi \ + -v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \ + -v /usr/local/Ascend/driver/lib64/:/usr/local/Ascend/driver/lib64/ \ + -v /usr/local/Ascend/driver/version.info:/usr/local/Ascend/driver/version.info \ + -v /etc/ascend_install.info:/etc/ascend_install.info \ + -it openeuler/mindspore:{Tag} bash + ``` + +- Container startup options + + | Option | Description | + |--|--| + | `--name my-mindspore` | Names the container `my-mindspore`. | + | `--device /dev/davinciX` | NPU device, where `X` is the physical ID number of the chip, e.g., davinci1. | + | `--device /dev/davinci_manager` | Davinci-related management device. | + | `--device /dev/devmm_svm` | Memory management-related device. | + | `--device /dev/hisi_hdc` | HDC-related management device. | + | `-v /usr/local/dcmi:/usr/local/dcmi` | Mounts the host's DCMI .so and interface file directory /usr/local/dcmi to the container. Please modify according to actual situation. | + | `-v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi` | Mount the host npu-smi tool "/usr/local/bin/npu-smi" into the container. Please modify it according to the actual situation. | + | `-v /usr/local/Ascend/driver/lib64/:/usr/local/Ascend/driver/lib64/` | Mounts the host directory /usr/local/Ascend/driver/lib64/driver to the container. Please modify according to the path where the driver's .so files are located. | + | `-v /usr/local/Ascend/driver/version.info:/usr/local/Ascend/driver/version.info` | Mounts the host's version information file /usr/local/Ascend/driver/version.info to the container. Please modify according to actual situation. | + | `-v /etc/ascend_install.info:/etc/ascend_install.info` | Mounts the host's installation information file /etc/ascend_install.info to the container. | + | `-it` | Starts the container in interactive mode with a terminal (bash). | + | `openeuler/mindspore:{Tag}` | Specifies the Docker image to run, replace `{Tag}` with the specific version or tag of the `openeuler/mindspore` image you want to use. | + +- View container running logs + + ```bash + docker logs -f my-mindspore + ``` + +- To get an interactive shell + + ```bash + docker exec -it my-mindspore /bin/bash + ``` + +# Question and answering +If you have any questions or want to use some special features, please submit an issue or a pull request on [openeuler-docker-images](https://gitee.com/openeuler/openeuler-docker-images). \ No newline at end of file diff --git a/mindspore/doc/image-info.yml b/mindspore/doc/image-info.yml new file mode 100644 index 00000000..fb4f37d4 --- /dev/null +++ b/mindspore/doc/image-info.yml @@ -0,0 +1,90 @@ +name: mindspore +category: ai +description: 昇思MindSpore是由华为于2019年8月推出的新一代全场景AI框架,2020年3月28日,华为宣布昇思MindSpore正式开源。昇思MindSpore是一个全场景AI框架,旨在实现易开发、高效执行、全场景统一部署三大目标。 +environment: | + 本应用在Docker环境中运行,安装Docker执行如下命令 + ``` + yum install -y docker + ``` +tags: | + MindSpore镜像的Tag由其版本信息和基础镜像版本信息组成,详细内容如下 + + | Tag | Currently | Architectures | + |----------|-------------|------------------| + |[2.3.0rc1-cann8.0.RC1-oe2203sp4](https://gitee.com/openeuler/openeuler-docker-images/blob/master/mindspore/2.3.0.rc1-cann8.0.RC1/22.03-lts-sp4/Dockerfile)| MindSpore 2.3.0.rc1 with CANN 8.0.RC1 on openEuler 22.03-LTS-SP4 | amd64, arm64 | + +download: | + 拉取镜像到本地 + ``` + docker pull openeuler/mindspore:{Tag} + ``` + +usage: | + + - 启动容器 + ``` + docker run \ + --name my-mindspore \ + --device ${device} \ + --device /dev/davinci_manager \ + --device /dev/devmm_svm \ + --device /dev/hisi_hdc \ + -v /usr/local/dcmi:/usr/local/dcmi \ + -v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \ + -v /usr/local/Ascend/driver/lib64/:/usr/local/Ascend/driver/lib64/ \ + -v /usr/local/Ascend/driver/version.info:/usr/local/Ascend/driver/version.info \ + -v /etc/ascend_install.info:/etc/ascend_install.info \ + -it openeuler/mindspore:{Tag} bash + ``` + 用户可根据自身需求选择对应的硬件设备{device}、对应版本的{Tag}以及容器启动的选项。 + + - 参数说明 + | 配置项 | 描述 | + |--|--| + | `--name my-mindspore` | 容器名称。| + | `--device /dev/davinci1` | NPU设备,X是芯片物理ID号,例如davinci1。 | + | `--device /dev/davinci_manager` | davinci相关的管理设备。 | + | `--device /dev/devmm_svm` | 内存管理相关设备。 | + | `--device /dev/hisi_hdc` | hdc相关管理设备。 | + | `-v /usr/local/dcmi:/usr/local/dcmi` | 将宿主机dcmi的.so和接口文件目录`/usr/local/dcmi`挂载到容器中,请根据实际情况修改。 | + | `-v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi` | 将宿主机`npu-smi`工具`/usr/local/bin/npu-smi`挂载到容器中,请根据实际情况修改。 | + | `-v /usr/local/Ascend/driver/lib64/:/usr/local/Ascend/driver/lib64/` | 将宿主机目录`/usr/local/Ascend/driver/lib64/driver`挂载到容器中。请根据driver的驱动.so所在路径修改。 | + | `-v /usr/local/Ascend/driver/version.info:/usr/local/Ascend/driver/version.info` | 将宿主机版本信息文件`/usr/local/Ascend/driver/version.info`挂载到容器中,请根据实际情况修改。 | + | `-v /etc/ascend_install.info:/etc/ascend_install.info` |将宿主机安装信息文件`/etc/ascend_install.info`挂载到容器中。 | + | `-it` | 以交互模式启动容器。 | + | `openeuler/mindspore:{Tag}` | 指定要运行的镜像为 `openeuler/mindspore`,其中` {Tag}` 是需要替换的镜像标签。 | + + - 容器测试 + + 查看运行日志 + ``` + docker logs -f my-mindspore + ``` + + 使用shell交互 + ``` + docker exec -it my-mindspore /bin/bash + ``` + +license: Apache-2.0 license +similar_packages: + - PyTorch: PyTorch是一个开源的Python机器学习库,基于torch,用于自然语言处理等应用程序。PyTorch既可以看作加入了GPU支持的numpy,同时也可以看成一个拥有自动求导功能的强大的深度神经网络。 +dependency: + - numpy + - protobuf + - asttokens + - pillow + - scipy + - decorator + - matplotlib + - opencv-python + - scikit-learn + - pandas + - packaging + - pycocotools + - tables + - easydict + - onnxruntime + - psutil + - astunparse + - safetensors \ No newline at end of file diff --git a/mindspore/doc/picture/logo.png b/mindspore/doc/picture/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..5582332707b3544481e1959a8486a08b8fb04738 GIT binary patch literal 47092 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%0A1z(<5T4v24d%A|XX5`*?xD;CkO* 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 literal 0 HcmV?d00001 diff --git a/mindspore/meta.yml b/mindspore/meta.yml new file mode 100644 index 00000000..3fcf3da5 --- /dev/null +++ b/mindspore/meta.yml @@ -0,0 +1,2 @@ +2.3.0rc1-cann8.0.RC1-oe2203sp4: + path: mindspore/2.3.0rc1-cann8.0.RC1/22.03-lts-sp4/Dockerfile diff --git a/pytorch/2.2.0-cann8.0.RC1/22.03-lts-sp4/Dockerfile b/pytorch/2.2.0-cann8.0.RC1/22.03-lts-sp4/Dockerfile index 58ec6081..de405727 100644 --- a/pytorch/2.2.0-cann8.0.RC1/22.03-lts-sp4/Dockerfile +++ b/pytorch/2.2.0-cann8.0.RC1/22.03-lts-sp4/Dockerfile @@ -3,9 +3,9 @@ FROM ${BASE} # Arguments ARG VERSION=2.2.0 -ARG TORCH_AUDIO_VERSION=2.2.0 -ARG TORCH_NPU_VERSION=2.2.0 -ARG TORCH_VISION_VERSION=0.17.0 +ARG AUDIO_VERSION=2.2.0 +ARG NPU_VERSION=2.2.0 +ARG TORCH_VERSION=0.17.0 # Change the default shell SHELL [ "/bin/bash", "-c" ] @@ -16,7 +16,7 @@ SHELL [ "/bin/bash", "-c" ] RUN pip uninstall -y numpy sympy && \ pip install --no-cache-dir --index-url https://download.pytorch.org/whl/cpu \ torch==${VERSION} \ - torchvision==${TORCH_VISION_VERSION} \ - torchaudio==${TORCH_AUDIO_VERSION} && \ + torchvision==${TORCH_VERSION} \ + torchaudio==${AUDIO_VERSION} && \ pip install --no-cache-dir \ - torch-npu==${TORCH_NPU_VERSION} \ No newline at end of file + torch-npu==${NPU_VERSION} \ No newline at end of file diff --git a/pytorch/README.md b/pytorch/README.md index 43b3f67f..717f006c 100644 --- a/pytorch/README.md +++ b/pytorch/README.md @@ -22,7 +22,7 @@ The tag of each `pytorch` docker image is consist of the complete software stack | Tag | Currently | Architectures | |----------|-------------|------------------| |[pytorch2.1.0.a1-cann7.0.RC1.alpha002-oe2203sp2](https://gitee.com/openeuler/openeuler-docker-images/blob/master/pytorch/2.1.0.a1-cann7.0.RC1.alpha002/22.03-lts-sp2/Dockerfile)| pyTorch 2.1.0.a1 with cann 7.0.RC1.alpha002 on openEuler 22.03-LTS-SP2 | arm64 | -|[2.2.0-cann8.0.RC1-oe2203sp4](https://gitee.com/openeuler/openeuler-docker-images/blob/master/pytorch/2.2.0-cann8.0.RC1-py3.8/22.03-lts-sp2/Dockerfile)| PyTorch 2.2.0 with cann 8.0.RC1 on openEuler 22.03-LTS-SP4 | arm64,amd64 | +|[2.2.0-cann8.0.RC1-oe2203sp4](https://gitee.com/openeuler/openeuler-docker-images/blob/master/pytorch/2.2.0-cann8.0.RC1/22.03-lts-sp4/Dockerfile)| PyTorch 2.2.0 with CANN 8.0.RC1 on openEuler 22.03-LTS-SP4 | arm64,amd64 | # Usage In this usage, users can select the corresponding `{Tag}` and `container startup options` based on their requirements. diff --git a/pytorch/doc/image-info.yml b/pytorch/doc/image-info.yml index 3afb6e11..c23d6169 100644 --- a/pytorch/doc/image-info.yml +++ b/pytorch/doc/image-info.yml @@ -36,7 +36,7 @@ usage: | -v /etc/ascend_install.info:/etc/ascend_install.info \ -it openeuler/pytorch:{Tag} bash ``` - 用户可根据自身需求选择对应的硬件设备{device}和对应版本的{Tag}、容器启动的选项。 + 用户可根据自身需求选择对应的硬件设备{device}、对应版本的{Tag}以及容器启动的选项。 - 参数说明 | 配置项 | 描述 | @@ -68,7 +68,7 @@ usage: | license: BSD 3-Clause license similar_packages: - - MindSpore: 昇思MindSpore是由华为于2019年8月推出的新一代全场景AI框架,2020年3月28日,华为宣布昇思MindSpore正式开源。昇思MindSpore是一个全场景AI框架,旨在实现易开发、高效执行、全场景统一部署三大目标 + - MindSpore: 昇思MindSpore是由华为于2019年8月推出的新一代全场景AI框架,2020年3月28日,华为宣布昇思MindSpore正式开源。昇思MindSpore是一个全场景AI框架,旨在实现易开发、高效执行、全场景统一部署三大目标。 dependency: - astunparse - expecttest -- Gitee From 4d77196eaf3403785651810e30f5e2152f62ae55 Mon Sep 17 00:00:00 2001 From: GuangJie1 Date: Wed, 28 Aug 2024 15:02:21 +0800 Subject: [PATCH 3/3] openeuler-ai: Add AI related images --- .../22.03-lts-sp4/Dockerfile | 26 ++++++++++++++----- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/pytorch/2.2.0-cann8.0.RC1/22.03-lts-sp4/Dockerfile b/pytorch/2.2.0-cann8.0.RC1/22.03-lts-sp4/Dockerfile index de405727..9d135c84 100644 --- a/pytorch/2.2.0-cann8.0.RC1/22.03-lts-sp4/Dockerfile +++ b/pytorch/2.2.0-cann8.0.RC1/22.03-lts-sp4/Dockerfile @@ -11,12 +11,24 @@ ARG TORCH_VERSION=0.17.0 SHELL [ "/bin/bash", "-c" ] # Install pytorch, torch-npu and related packages -# Uninstall the latest numpy and sympy first, as the right versions will be installed again \ -# after installing following packages \ -RUN pip uninstall -y numpy sympy && \ +RUN if [ "${VERSION}" == "2.1.0" ]; then \ + TORCH_VERSION=0.16.0; \ + AUDIO_VERSION=2.1.0; \ + NPU_VERSION=2.1.0; \ + elif [ "${VERSION}" == "2.2.0" ]; then \ + TORCH_VERSION=0.17.0; \ + AUDIO_VERSION=2.2.0; \ + NPU_VERSION=2.2.0; \ + else \ + echo "Not supported version: ${VERSION}. Feel free to submit an issue to us: https://github.com/cosdt/dockerfiles/issues"; \ + exit 1; \ + fi && \ + # Uninstall the latest numpy and sympy first, as the right versions will be installed again \ + # after installing following packages \ + pip uninstall -y numpy sympy && \ pip install --no-cache-dir --index-url https://download.pytorch.org/whl/cpu \ - torch==${VERSION} \ - torchvision==${TORCH_VERSION} \ - torchaudio==${AUDIO_VERSION} && \ + torch==${VERSION} \ + torchvision==${TORCH_VERSION} \ + torchaudio==${AUDIO_VERSION} && \ pip install --no-cache-dir \ - torch-npu==${NPU_VERSION} \ No newline at end of file + torch-npu==${NPU_VERSION} \ No newline at end of file -- Gitee