海光DCU深度计算处理器快速上手使用步骤

目录

快速上手步骤

系统要求

第一步:硬件安装

第二步:驱动安装

第三步:环境部署

容器化部署方式(推荐)

物理机部署方式

第四步:实例测试

训练测试

推理测试

问题排查


快速上手步骤

系统要求

包管理操作系统版本内核参考下载地址
rpmCentOS7.63.10.0-957.el7.x86_64链接:https://pan.baidu.com/s/1cpb3O_5xmvLcAGtekFhxIg 提取码:q2zq
8.54.18.0-348.el8.x86_64
NFS3.23.10.0-957.nfs.5.x86_64链接:https://pan.baidu.com/s/1YyOMbKlr1BiiGVkRNvbPQw 提取码:8h03
4.04.19.113-11.nfs4.x86_64
4.0-Desktop5.4.0-49-generic
Anolis8.44.19.91-23.4.an8.x86_64链接:https://mirrors.openanolis.cn/anolis/
8.64.19.91-26.an8.x86_64
Kylinv10 SP24.19.90-24.4.v2101.ky10.x86_64链接:http://distro-images.kylinos.cn:8802/web_pungi/download/share/wA7vpuh4S5ZrxLWRXVBgGO0d9TfJqijD
UOS1021e4.19.90-2109.1.0.0108.up2.uel20.x86_64链接:https://www.chinauos.com/resource/download-server
openEuler22.035.10.0-60.18.0.50.oe2203.x86_64链接:https://openeuler.org/zh/download/
debUbuntu20.04.15.4.0-42-generic链接:https://pan.baidu.com/s/1CS8nAsOM8zvKIU3eB4WqAg 提取码:ksk3
22.045.15.0-43-generic

注:建议使用Centos7.6或者Ubuntu20.04,内核查看命令:uname -r

您仅需以下几步便可以开始体验DCU加速卡:

第一步:硬件安装

1.将DCU加速卡插入主板的PCIe插槽,并连接好电源线,如图所示:

cc117f26ebce461c8c045768269affe9.png

2.通过lspci | grep -i Display命令查看是否检测到DCU加速卡,如图所示一张DCU加速卡被识别:(问题排查1

第二步:驱动安装

➡rpm系列系统(CentOS,NFS,Anolis,Kylin,UOS,openEuler)

  1. 安装驱动依赖包

    yum install -y \
    cmake \
    automake \
    gcc \
    gcc-c++ \
    rpm-build \
    autoconf \
    kernel-devel-`uname -r` \
    kernel-headers-`uname -r`
  2. 获取驱动

    注:可前往开发者社区资源工具驱动,获取latest驱动下载地址。

  3. 安装驱动

    注:卸载驱动请执行命令rpm -e rock

    chmod 755 rock*.run \
    && ./rock*.run \
    && reboot
  4. 验证问题排查2、3

    通过lsmod | grep dcu命令验证驱动是否安装成功,如图所示:

c16160d5f06244af81aa0e64d96fb019.png

➡deb系列系统(Ubuntu)

  1. 安装驱动依赖包

    apt update \
    && apt install -y \
    cmake \
    automake \
    rpm \
    gcc \
    g++ \
    autoconf \
    linux-headers-`uname -r`
  2. 获取驱动

    注:可前往开发者社区资源工具驱动,获取latest驱动下载地址

2776e7d29b1d4080b0de2cc0089fd715.png

  1. 安装驱动

    注:卸载驱动请执行命令`apt-get remove rock`。*

    chmod 755 rock*.run \
    && ./rock*.run \
    && reboot
  2. 验证问题排查2、3

    通过lsmod | grep dcu命令验证驱动是否安装成功,如图所示:

af11ca4f28104914bf605da79b2c9fa2.png

第三步:环境部署

注:非root用户请务必加入39组,才能正确调用DCU加速卡,通过命令usermod -a -G 39 $USER完成设置。

容器化部署方式(推荐)

➡rpm系列系统(CentOS,NFS,Anolis,Kylin,UOS,openEuler)

  1. 安装docker

    注:Docker 要求内核版本不低于 3.10,建议安装docker-19.03以上版本;若安装失败,建议使用docker国内源。

    yum install -y docker-ce docker-ce-cli containerd.io \
    && systemctl daemon-reload \
    && systemctl restart docker
  2. 获取镜像

    注:镜像获取可以前往镜像仓库—光源,挑选所需DCU镜像,复制相应带有latest标签的命令,并在命令行执行,例如拉取pytorch镜像。

d96268f7ad2d4d7a8076ceb82d68ecea.png

2.

docker pull image.sourcefind.cn:5000/dcu/admin/base/pytorch:1.10.0-centos7.6-dtk-22.10-py38-latest

bcf76ec0f5c94b10bcef4009e5220514.png

3.启动容器环境

注:该启动参数可根据实际情况进行删减,参数如下:

-i         打开容器标准输入

-t        分配一个伪终端

-v       挂载数据卷

--network  连接网络(none|host|自定义网络...)

--name   为容器添加名字

--ipc     设置IPC模式(none|shareable|host...)

--shm-size    设置/dev/shm大小

--group-add    设置用户附加组(DCU需要添加39组)

--device     指定访问设备(DCU需要添加/dev/kfd以及/dev/dri)

--cap-add     添加权限(SYS_PTRACE|NET_ADMIN...)

--security-opt 安全配置(seccomp=unconfined|label=disable...)

--privileged 特权模式

...

docker run \
-it \
--name=test \
--device=/dev/kfd \
--device=/dev/dri \
--security-opt seccomp=unconfined \
--cap-add=SYS_PTRACE \
--ipc=host \
--network host \
--shm-size=16G \
--group-add 39 \
-v /opt/hyhal:/opt/hyhal \
image.sourcefind.cn:5000/dcu/admin/base/pytorch:1.10.0-centos7.6-dtk-22.10-py38-latest

2e630a64560d49d293a071a7ee417af9.png

➡deb系列系统(Ubuntu)

  1. 安装docker

    注:推荐使用ubuntu的LTS版,建议安装docker-19.03以上版本;若安装失败,建议使用docker国内源。或者下载脚本curl -fsSL get.docker.com -o get-docker.sh,简化安装流程。

    apt-get install -y docker-ce docker-ce-cli containerd.io \
    && systemctl daemon-reload \
    && systemctl restart docker
  2. 获取镜像(同rpm系列系统,选择带有ubuntu名称的镜像即可)

  3. 启动容器环境(同rpm系列系统)

物理机部署方式

➡rpm系列系统(CentOS,NFS,Anolis,Kylin,UOS,openEuler)

  1. 安装DTK(DCU Toolkit,DCU软件平台)依赖包(问题排查4

    yum install -y \
        epel-release \
        centos-release-scl \
        && yum clean all \
        && yum makecache \
    && yum groupinstall -y "Development tools" \
    && yum install -y \
        vim \
        curl \
        bzip2 \
        bzip2-devel \
        sudo \
        gcc \
        uuid-devel \
        gdbm-devel \
        readline-devel \
        tk-devel \
        openssl \
        openssl-devel \
        openssl-static \
        rpm-build \
        patch \
        ninja-build \
        glog-devel \
        lmdb-devel \
        opencv-devel \
        openblas-devel \
        libibverbs-devel \
        gflags-devel \
        gstreamer1 \
        gstreamer1-devel \
        gstreamer1-plugins-base \
        gstreamer1-plugins-base-devel \
        gstreamer1-plugins-bad-free \
        gstreamer1-plugins-bad-free-devel \
        gstreamer1-plugins-good \
        gstreamer1-plugins-ugly-free \
        gstreamer1-plugins-ugly-free-devel \
        gst123 \
        libibverbs-devel \
        libibverbs-utils \
        libffi-devel \
        zlib-devel \
        openssl-devel \
        ncurses-devel \
        sqlite-devel \
        devtoolset-7-gcc* \
        numactl \
        numactl-devel \
        wget \
        openssh \
        openssh-server
  2. python安装

    cd /tmp \
    && wget -O python.tgz https://registry.npmmirror.com/-/binary/python/3.8.12/Python-3.8.12.tgz \
    && mkdir python-tmp \
    && tar -xvf python.tgz -C ./python-tmp --strip-components 1 \
    && cd python-tmp \
    && ./configure \
        --enable-shared \
    && make -j$(nproc) \
    && make install \
    && rm -rf /tmp/python* \
    && ln -s /usr/local/bin/python3 /usr/local/bin/python \
    && ln -sf /usr/local/bin/pip3 /usr/local/bin/pip
  3. pip更新

    pip install --no-cache-dir --upgrade pip
    
  4. cmake安装

    cd /tmp \
    && wget -O cmake.tar.gz https://cmake.org/files/v3.19/cmake-3.19.3-Linux-x86_64.tar.gz \
    && mkdir /opt/cmake \
    && tar -xvf cmake.tar.gz -C /opt/cmake --strip-components 1 \
    && rm -rf /tmp/cmake*
  5. hwloc安装

    cd /tmp \
    && wget -O hwloc.tar.gz https://download.open-mpi.org/release/hwloc/v2.7/hwloc-2.7.1.tar.gz \
    && mkdir hwloc-tmp \
    && tar -xvf hwloc.tar.gz -C ./hwloc-tmp --strip-components 1 \
    && cd hwloc-tmp \
    && ./configure --prefix=/opt/hwloc \
    && make -j$(nproc) \
    && make install \
    && rm -rf /tmp/hwloc*
  6. mpi安装

    cd /tmp \
    && wget -O openmpi.tar.gz https://download.open-mpi.org/release/open-mpi/v4.0/openmpi-4.0.1.tar.gz \
    && mkdir openmpi-tmp \
    && tar -xvf openmpi.tar.gz -C ./openmpi-tmp --strip-components 1 \
    && cd openmpi-tmp \
    && ./configure \
       --prefix=/opt/mpi/ \
       --with-hwloc=/opt/hwloc/ \
       --enable-orterun-prefix-by-default \
       --enable-mpi-thread-multiple \
       --enable-dlopen \
    && make -j$(nproc) \
    && make install \
    && rm -rf /tmp/openmpi*
  7. 获取DTK

    注:可前往开发者社区资源工具DCU Toolkit,获取latest DTK下载地址。

6de748ec2b264848805b0f12f61844ae.png

  1. 安装DTK

    tar -xvf DTK-*.tar.gz -C /opt/ \
    && ln -s /opt/dtk-* /opt/dtk
  2. 设置环境变量

    cat > /etc/profile.d/dtk.sh <<-"EOF"
    #!/bin/bash
    
    #gcc
    source /opt/rh/devtoolset-7/enable
    
    #python3
    export LD_LIBRARY_PATH=/usr/local/lib/:/usr/local/lib64/:$LD_LIBRARY_PATH
    export PATH=/usr/local/bin:$PATH
    export PYTHONPATH=/usr/local/:$PYTHONPATH
    
    #cmake
    export PATH=/opt/cmake/bin/:$PATH
    
    #hwloc
    export PATH=/opt/hwloc/bin/:${PATH} \
    export LD_LIBRARY_PATH=/opt/hwloc/lib:${LD_LIBRARY_PATH}
    
    #mpi
    export LD_LIBRARY_PATH=/opt/mpi/lib:$LD_LIBRARY_PATH
    export PATH=/opt/mpi/bin:$PATH
    
    #DTK
    source /opt/dtk/env.sh
    EOF
    source /etc/profile.d/dtk.sh
  3. 验证DCU环境问题排查5、6

    通过rocm-smi以及rocminfo | grep gfx命令验证DCU环境安装完毕,如图所示:

83591fa065424b8daa00475575dd69f7.png

de9010e8971c44e79eaedc2e94293de9.png

➡deb系列系统(Ubuntu)

  1. 安装DTK(DCU Toolkit,DCU软件平台)依赖包(问题排查4

    apt-get update -y \
        && apt-get install --no-install-recommends -y \
           build-essential \
               git \
               wget \
               gfortran \
               elfutils \
               libelf-dev \
               libdrm-dev \
               kmod \
               libtinfo5 \
               sqlite3 \
               libsqlite3-dev \
               libnuma-dev \
               libgl1-mesa-dev \
               alien \
               rsync \
               libpci-dev \
               pciutils \
               libpciaccess-dev \
               libbabeltrace-dev \
               pkg-config \
               libfile-which-perl \
               libfile-basedir-perl \
               libfile-copy-recursive-perl \
               libfile-listing-perl \
               libprotobuf-dev \
               libio-digest-perl \
               libdigest-md5-file-perl \
               libdata-dumper-simple-perl \
               vim \
               curl \
               libcurlpp-dev \
               openssh-server \
               sudo \
               locales \
               openssl \
               libssl-dev \
               patch \
               ninja-build \
               libgoogle-glog-dev \
               liblmdb-dev \
               libopenblas-dev \
               libgflags-dev \
               libibverbs-dev \
               ibverbs-utils \
               libffi-dev \
               zlib1g \
               zlib1g-dev \
               libbz2-dev \
               libncurses-dev \
               libsqlite3-dev \
               read-edid \
               numactl \
               libjpeg62 \
               liblzma-dev \
               libgdbm-dev \
               libgdbm-compat-dev \
               libnss3-dev \
               libreadline-dev \
               libncurses5-dev \
               libncursesw5-dev \
               xz-utils \
               tk-dev \
           && apt-get clean \
           && rm -rf /var/lib/apt/lists/*
  2. python安装

    cd /tmp \
    && wget -O python.tgz https://registry.npmmirror.com/-/binary/python/3.8.12/Python-3.8.12.tgz \
    && mkdir python-tmp \
    && tar -xvf python.tgz -C ./python-tmp --strip-components 1 \
    && cd python-tmp \
    && ./configure \
        --enable-shared \
    && make -j$(nproc) \
    && make install \
    && rm -rf /tmp/python* \
    && ln -s /usr/local/bin/python3 /usr/local/bin/python \
    && ln -sf /usr/local/bin/pip3 /usr/local/bin/pip \
    && apt-get update -y \
        && apt-get install --no-install-recommends -y \
           libgstreamer1.0-dev \
           libgstreamer-plugins-base1.0-dev \
           libgstreamer-plugins-bad1.0-dev \
           gstreamer1.0-plugins-base \
           gstreamer1.0-plugins-good \
           gstreamer1.0-plugins-bad \
           gstreamer1.0-plugins-ugly \
           gstreamer1.0-libav \
           gstreamer1.0-tools \
           gstreamer1.0-x \
           gstreamer1.0-alsa \
           gstreamer1.0-gl \
           gstreamer1.0-gtk3 \
           gstreamer1.0-qt5 \
           gstreamer1.0-pulseaudio \
           gst123 \
           libopencv-dev \
           python3-opencv \
        && apt-get clean \
        && rm -rf /var/lib/apt/lists/*
  3. pip更新

    pip install --no-cache-dir --upgrade pip
    
  4. cmake安装

    cd /tmp \
    && wget -O cmake.tar.gz https://cmake.org/files/v3.19/cmake-3.19.3-Linux-x86_64.tar.gz \
    && mkdir /opt/cmake \
    && tar -xvf cmake.tar.gz -C /opt/cmake --strip-components 1 \
    && rm -rf /tmp/cmake*
  5. hwloc安装

    cd /tmp \
    && wget -O hwloc.tar.gz https://download.open-mpi.org/release/hwloc/v2.7/hwloc-2.7.1.tar.gz \
    && mkdir hwloc-tmp \
    && tar -xvf hwloc.tar.gz -C ./hwloc-tmp --strip-components 1 \
    && cd hwloc-tmp \
    && ./configure --prefix=/opt/hwloc \
    && make -j$(nproc) \
    && make install \
    && rm -rf /tmp/hwloc*
  6. mpi安装

    cd /tmp \
    && wget -O openmpi.tar.gz https://download.open-mpi.org/release/open-mpi/v4.0/openmpi-4.0.1.tar.gz \
    && mkdir openmpi-tmp \
    && tar -xvf openmpi.tar.gz -C ./openmpi-tmp --strip-components 1 \
    && cd openmpi-tmp \
    && ./configure \
       --prefix=/opt/mpi/ \
       --with-hwloc=/opt/hwloc/ \
       --enable-orterun-prefix-by-default \
       --enable-mpi-thread-multiple \
       --enable-dlopen \
    && make -j$(nproc) \
    && make install \
    && rm -rf /tmp/openmpi*
  7. 获取DTK

    注:可前往开发者社区资源工具DCU Toolkit,获取latest DTK下载地址。

901d0ebd19ad43dba6f59d317c7a6dee.png

  1. 安装DTK

    tar -xvf DTK-*.tar.gz -C /opt/ \
    && ln -s /opt/dtk-* /opt/dtk
  2. 设置环境变量

    cat > /etc/profile.d/dtk.sh <<-"EOF"
    #!/bin/bash
    
    #python3
    export LD_LIBRARY_PATH=/usr/local/lib/:/usr/local/lib64/:$LD_LIBRARY_PATH
    export PATH=/usr/local/bin:$PATH
    export PYTHONPATH=/usr/local/:$PYTHONPATH
    
    #cmake
    export PATH=/opt/cmake/bin/:$PATH
    
    #hwloc
    export PATH=/opt/hwloc/bin/:${PATH} \
    export LD_LIBRARY_PATH=/opt/hwloc/lib:${LD_LIBRARY_PATH}
    
    #mpi
    export LD_LIBRARY_PATH=/opt/mpi/lib:$LD_LIBRARY_PATH
    export PATH=/opt/mpi/bin:$PATH
    
    #DTK
    source /opt/dtk/env.sh
    EOF
    source /etc/profile.d/dtk.sh
  3. 验证DCU环境问题排查5、6

    通过rocm-smi以及rocminfo | grep gfx命令验证DCU环境安装完毕,如图所示:

c7625b6cc22d49ab9cc367f804d99cb9.png

第四步:实例测试

注:HIP_VISIBLE_DEVICES—设置DCU加速卡可见性,类似CUDA_VISIBLE_DEVICES。例如:export HIP_VISIBLE_DEVICES=0表示设置第一块DCU可见。

训练测试

  1. 训练环境搭建

    注:若在光源拉取相应框架镜像后则无需搭建环境,进入后即得到完整训练环境,可直接跳转至环境验证推荐)。本次环境搭建以Pytorch框架为例,各类框架(pytorch,tensorflow,paddlepaddle,oneflow...)请前往开发者社区资源工具AI 生态包下获取最新whl包并安装。

    • 下载Pytorch以及TorchVision框架包

      注:各种框架的whl包应与上述安装过程中DTK版本对应,例如已安装dtk-22.10,则需要到AI 生态包pytorchdtk-22.10以及AI 生态包visiondtk-22.10文件夹中下载whl包并安装。

      878e2d67420c40e6a7ddc1b98b6443d6.png
    • 安装Pytorch以及TorchVision(问题排查7

      pip3 install torch-*.whl \
      && pip3 install torchvision-*.whl \
      && pip3 install numpy
  2. 环境验证问题排查8

    python3 -c "import torch;print('pytorch version:',torch.__version__);print('DCU is',torch.cuda.is_available())"
    
    23f5281b4c2848babc16f8d4dcab2bb9.png
  3. 训练代码获取

    注:可前往ModelZoo获取实例代码,本次以flavr_pytorch为例;同时,DCU也兼容GPU开源深度学习代码

    a0a578ad4721477d89c9e872fb3c4d2a.png
  4. 克隆训练代码

    git clone http://developer.hpccube.com/codes/modelzoo/flavr_pytorch.git
    
  5. 代码依赖安装

    cd flavr_pytorch \
    && pip install -r requirements.txt
  6. 启动测试

    python main.py --batch_size 32 --test_batch_size 32 --dataset vimeo90K_septuplet --loss 1*L1 --max_epoch 200 --lr 0.0002 --data_root datasets --n_outputs 1 --num_gpu 1
    
    98478bb70e2944209a726cb55f5f7222.png

推理测试

  1. 推理环境搭建

    注:若在光源拉取相应框架镜像后则无需搭建环境,进入后即得到完整推理环境,可直接跳转至环境验证推荐)。本次环境搭建以MIGraphX框架为例。

    • 安装half

      wget https://github.com/ROCmSoftwarePlatform/half/archive/1.12.0.tar.gz \
      && tar -xvf 1.12.0.tar.gz \
      && cp half-1.12.0/include/half.hpp /opt/dtk/include/
    • 安装sqlite

      cd /tmp \
      && wget --no-cookie --no-check-certificate -O sqlite.tar.gz https://www.sqlite.org/2023/sqlite-autoconf-3410000.tar.gz \
      && mkdir sqlite-tmp \
      && tar -xvf sqlite.tar.gz -C ./sqlite-tmp --strip-components 1 \
      && cd sqlite-tmp \
      && ./configure \
      && make -j$(nproc) \
      && make install \
      && cd \
      && rm -rf /tmp/sqlite*
    • 下载MIGraphX

      注:MIGraphX框架安装包应与安装过程中系统版本以及DTK版本对应,例如centos7.6系统中安装dtk-23.10.1,则需要到AI 生态包migraphxdtk-23.10.1CentOS7.6文件夹下载rpm安装包并安装。

      dc971625e49d472e8e1d6fc113043e5f.png
    • 安装MIGraphX

      rpm -ivh migraphx-*.rpm --nodeps --force \
      && rpm -ivh migraphx-devel-*.rpm --nodeps --force
    • 设置环境变量

      cat > /etc/profile.d/migraphx.sh <<-"EOF"
      #!/bin/bash
      
      export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH
      export LD_LIBRARY_PATH=/usr/local/lib/:$LD_LIBRARY_PATH
      export PYTHONPATH=/opt/dtk/lib:$PYTHONPATH
      EOF
      source /etc/profile.d/migraphx.sh
  2. 环境验证

    /opt/dtk/bin/migraphx-driver onnx -l
    
    c5dce2dcb3f74e0fb5335d72a82c215e.png
  3. 推理代码获取

    注:可前往ModelZoo获取实例代码,本次以yolov7_migraphx为例。

  4. 克隆推理代码

    git clone http://developer.hpccube.com/codes/modelzoo/yolov7_migraphx.git
    
  5. 代码依赖安装

    cd yolov7_migraphx/Python/ \
    && pip install -r requirements.txt
  6. 启动测试

    python YoloV7_infer_migraphx.py
    
    7ae2f583b74f4f0da1b502ab491cab99.png

问题排查

1.问:lspci | grep -i Display无显示

:清理DCU加速卡金手指,确保各插槽插紧无松动。

2.问:lsmod | grep hydcu无显示

:请先执行驱动安装步骤;若仍无显示,通过命令modprobe hydcu手动加载驱动并重启机器;若驱动仍未加载,请查看/etc/modprobe.d/hydcu.conf是否存在,不存在可通过命令echo “options hydcu hygon_vbios=0” > /etc/modprobe.d/hydcu.conf手动创建。

3.问: 驱动加载失败,如下图:

39f8c4d65d804ee099bf32601fedfc9c.png

:请检查系统启动项中是否包含nomodeset选项,若存在,请删除。通常在系统启动时,按 e进入内核启动修改页面,找到以 linux16 /vmlinuz 开始的行,删除 nomodeset 字段,然后按Ctrl+x启动,如图所示:

9d4751050e1d4f78ab58322d093d83e3.png

在系统启动之后,根据不同版本的系统要求修改 grub 文件,确保该启动项永久生效。

4.问: 某些依赖包无法安装

:建议换国内源。其中lmdb-devel、glog-devel、opencv-devel、openblas-devel、gflags-devel、gstreamer等,或liblmdb-dev、libopenblas-dev、 libgflags-dev、libopencv-dev、gstreamer等无法安装,无需担心,该依赖包已导入框架内;其中若devtoolset-7安装失败,可以进入DCU Toolkit下载后离线安装:

b8456459c197478a8be914e5feeb7fd4.png
mkdir /opt/rh \
&& tar xvf devtoolset-7.3.1.tar.gz -C /opt/rh

5.问: rocm-smi显示正常,rocminfo出现如下图报错:

d8a50efdae354fb79740a24c0e30f253.png

:请通过命令usermod -a -G 39 $USER将用户加入39组。

6.问:rocm-smirocminfo命令都查找不到

:请根据系统执行DTK安装中的设置环境变量步骤。

7.问:pip install 安装出现如图不支持提示

5b73131e869a41ccaadf5d5a5dc1c93d.png

:请通过命令pip install --upgrade pip将pip升级,若未解决,请查看下载的whl包py版本是否与环境中的python版本一致,以及检查环境中是否已正确安装DTK软件包。

8.问:使用期间出现如下导入hsa相关库报错

a6aed7406ce246c4b619b34480513c23.png

:dtk23.10系列设计如此,请在启动容器时挂载hyhal:-v /opt/hyhal:/opt/hyhal,或在开发者社区下载hyhal,放入容器/opt/下,并解压。

  • 22
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

技术瘾君子1573

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值