0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何通過Docker和K8S集群實(shí)現(xiàn)高效調(diào)用GPU

馬哥Linux運(yùn)維 ? 來源:博客園 ? 2025-03-18 16:50 ? 次閱讀

環(huán)境查看

系統(tǒng)環(huán)境

# lsb_release -a
No LSB modules are available.
Distributor ID:Ubuntu
Description:Ubuntu 22.04.4 LTS
Release:22.04
Codename:jammy
# cat /etc/redhat-release 
Rocky Linux release 9.3 (Blue Onyx)

軟件環(huán)境

# kubectl version
Client Version: v1.30.2
Kustomize Version: v5.0.4-0.20230601165947-6ce0bf390ce3
Server Version: v1.25.16
WARNING: version difference between client (1.30) and server (1.25) exceeds the supported minor version skew of +/-1

安裝Nvidia的Docker插件
在有GPU資源的主機(jī)安裝,改主機(jī)作為K8S集群的Node
設(shè)置源

# curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg 
  && curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | 
    sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | 
    sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list

配置存儲(chǔ)庫(kù)以使用實(shí)驗(yàn)性軟件包

# sed -i -e '/experimental/ s/^#//g' /etc/apt/sources.list.d/nvidia-container-toolkit.list

修改后把以下注釋取消
78d3b630-0265-11f0-9310-92fbcf53809c.png
更新

# sudo apt-get update

安裝Toolkit

# sudo apt-get install -y nvidia-container-toolkit

配置Docker以使用Nvidia

# sudo nvidia-ctk runtime configure --runtime=docker
INFO[0000] Loading config from /etc/docker/daemon.json  
INFO[0000] Wrote updated config to /etc/docker/daemon.json 
INFO[0000] It is recommended that docker daemon be restarted. 

這條命令會(huì)修改配置文件/etc/docker/daemon.json添加runtimes配置

# cat /etc/docker/daemon.json 
{
    "insecure-registries": [
        "192.168.3.61"
    ],
    "registry-mirrors": [
        "https://7sl94zzz.mirror.aliyuncs.com",
        "https://hub.atomgit.com",
        "https://docker.awsl9527.cn"
    ],
    "runtimes": {
        "nvidia": {
            "args": [],
            "path": "nvidia-container-runtime"
        }
    }

重啟docker

# systemctl daemon-reload
# systemctl restart docker

使用Docker調(diào)用GPU
驗(yàn)證配置
啟動(dòng)一個(gè)鏡像查看GPU信息

~#   docker run --rm --runtime=nvidia --gpus all ubuntu nvidia-smi
Sat Oct 12 01:33:33 2024       
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 555.42.06              Driver Version: 555.42.06      CUDA Version: 12.5     |
|-----------------------------------------+------------------------+----------------------+
| GPU  Name                 Persistence-M | Bus-Id          Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |           Memory-Usage | GPU-Util  Compute M. |
|                                         |                        |               MIG M. |
|=========================================+========================+======================|
|   0  NVIDIA GeForce RTX 4090        Off |   00000000:01:00.0 Off |                  Off |
|  0%   53C    P2             59W /  450W |    4795MiB /  24564MiB |      0%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+
                                                                                         
+-----------------------------------------------------------------------------------------+
| Processes:                                                                              |
|  GPU   GI   CI        PID   Type   Process name                              GPU Memory |
|        ID   ID                                                               Usage      |
|=========================================================================================|
|  No running processes found                                                             |
+-----------------------------------------------------------------------------------------+

該輸出結(jié)果顯示了 GPU 的詳細(xì)信息,包括型號(hào)、溫度、功率使用情況和內(nèi)存使用情況等。這表明 Docker 容器成功地訪問到了 NVIDIA GPU,并且 NVIDIA Container Toolkit 安裝和配置成功。
4. 使用K8S集群Pod調(diào)用GPU
以下操作在K8S機(jī)器的Master節(jié)點(diǎn)操作
安裝K8S插件
下載最新版本

$ kubectl create -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/v0.16.1/deployments/static/nvidia-device-plugin.yml

yml文件內(nèi)容如下

# cat nvidia-device-plugin.yml 
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: nvidia-device-plugin-daemonset
  namespace: kube-system
spec:
  selector:
    matchLabels:
      name: nvidia-device-plugin-ds
  updateStrategy:
    type: RollingUpdate
  template:
    metadata:
      labels:
        name: nvidia-device-plugin-ds
    spec:
      tolerations:
      - key: nvidia.com/gpu
        operator: Exists
        effect: NoSchedule
      # Mark this pod as a critical add-on; when enabled, the critical add-on
      # scheduler reserves resources for critical add-on pods so that they can
      # be rescheduled after a failure.
      # See https://kubernetes.io/docs/tasks/administer-cluster/guaranteed-scheduling-critical-addon-pods/
      priorityClassName: "system-node-critical"
      containers:
      - image: nvcr.io/nvidia/k8s-device-plugin:v0.16.1
        name: nvidia-device-plugin-ctr
        env:
          - name: FAIL_ON_INIT_ERROR
            value: "false"
        securityContext:
          allowPrivilegeEscalation: false
          capabilities:
            drop: ["ALL"]
        volumeMounts:
        - name: device-plugin
          mountPath: /var/lib/kubelet/device-plugins
      volumes:
      - name: device-plugin
        hostPath:
          path: /var/lib/kubelet/device-plugins

使用DaemonSet方式部署在每一臺(tái)node服務(wù)器部署
查看Pod日志

# kubectl logs -f nvidia-device-plugin-daemonset-8bltf -n kube-system
I1012 02:15:37.171056       1 main.go:199] Starting FS watcher.
I1012 02:15:37.171239       1 main.go:206] Starting OS watcher.
I1012 02:15:37.172177       1 main.go:221] Starting Plugins.
I1012 02:15:37.172236       1 main.go:278] Loading configuration.
I1012 02:15:37.173224       1 main.go:303] Updating config with default resource matching patterns.
I1012 02:15:37.173717       1 main.go:314] 
Running with config:
{
  "version": "v1",
  "flags": {
    "migStrategy": "none",
    "failOnInitError": false,
    "mpsRoot": "",
    "nvidiaDriverRoot": "/",
    "nvidiaDevRoot": "/",
    "gdsEnabled": false,
    "mofedEnabled": false,
    "useNodeFeatureAPI": null,
    "deviceDiscoveryStrategy": "auto",
    "plugin": {
      "passDeviceSpecs": false,
      "deviceListStrategy": [
        "envvar"
      ],
      "deviceIDStrategy": "uuid",
      "cdiAnnotationPrefix": "cdi.k8s.io/",
      "nvidiaCTKPath": "/usr/bin/nvidia-ctk",
      "containerDriverRoot": "/driver-root"
    }
  },
  "resources": {
    "gpus": [
      {
        "pattern": "*",
        "name": "nvidia.com/gpu"
      }
    ]
  },
  "sharing": {
    "timeSlicing": {}
  }
}
I1012 02:15:37.173760       1 main.go:317] Retrieving plugins.
E1012 02:15:37.174052       1 factory.go:87] Incompatible strategy detected auto
E1012 02:15:37.174086       1 factory.go:88] If this is a GPU node, did you configure the NVIDIA Container Toolkit?
E1012 02:15:37.174096       1 factory.go:89] You can check the prerequisites at: https://github.com/NVIDIA/k8s-device-plugin#prerequisites
E1012 02:15:37.174104       1 factory.go:90] You can learn how to set the runtime at: https://github.com/NVIDIA/k8s-device-plugin#quick-start
E1012 02:15:37.174113       1 factory.go:91] If this is not a GPU node, you should set up a toleration or nodeSelector to only deploy this plugin on GPU nodes
I1012 02:15:37.174123       1 main.go:346] No devices found. Waiting indefinitely.

驅(qū)動(dòng)失敗,錯(cuò)誤提示已經(jīng)清楚說明了失敗原因

該Node部署GPU節(jié)點(diǎn)即該Node沒有GPU資源

該Node有GPU資源,沒有安裝Docker驅(qū)動(dòng)
沒有GPU資源的節(jié)點(diǎn)肯定無法使用,但是已經(jīng)有GPU資源的Node節(jié)點(diǎn)也會(huì)報(bào)這個(gè)錯(cuò)誤
有GPU節(jié)點(diǎn)的修復(fù)方法,修改配置文件添加配置

# cat /etc/docker/daemon.json
{
    "insecure-registries": [
        "192.168.3.61"
    ],
    "registry-mirrors": [
        "https://7sl94zzz.mirror.aliyuncs.com",
        "https://hub.atomgit.com",
        "https://docker.awsl9527.cn"
    ],
    "default-runtime": "nvidia",
    "runtimes": {
        "nvidia": {
            "args": [],
            "path": "/usr/bin/nvidia-container-runtime"
        }
    }
}

關(guān)鍵配置是以下行
78e9d4b0-0265-11f0-9310-92fbcf53809c.png

再次查看Pod日志

# kubectl logs -f nvidia-device-plugin-daemonset-mp5ql -n kube-system
I1012 02:22:00.990246       1 main.go:199] Starting FS watcher.
I1012 02:22:00.990278       1 main.go:206] Starting OS watcher.
I1012 02:22:00.990373       1 main.go:221] Starting Plugins.
I1012 02:22:00.990382       1 main.go:278] Loading configuration.
I1012 02:22:00.990692       1 main.go:303] Updating config with default resource matching patterns.
I1012 02:22:00.990776       1 main.go:314] 
Running with config:
{
  "version": "v1",
  "flags": {
    "migStrategy": "none",
    "failOnInitError": false,
    "mpsRoot": "",
    "nvidiaDriverRoot": "/",
    "nvidiaDevRoot": "/",
    "gdsEnabled": false,
    "mofedEnabled": false,
    "useNodeFeatureAPI": null,
    "deviceDiscoveryStrategy": "auto",
    "plugin": {
      "passDeviceSpecs": false,
      "deviceListStrategy": [
        "envvar"
      ],
      "deviceIDStrategy": "uuid",
      "cdiAnnotationPrefix": "cdi.k8s.io/",
      "nvidiaCTKPath": "/usr/bin/nvidia-ctk",
      "containerDriverRoot": "/driver-root"
    }
  },
  "resources": {
    "gpus": [
      {
        "pattern": "*",
        "name": "nvidia.com/gpu"
      }
    ]
  },
  "sharing": {
    "timeSlicing": {}
  }
}
I1012 02:22:00.990780       1 main.go:317] Retrieving plugins.
I1012 02:22:01.010950       1 server.go:216] Starting GRPC server for 'nvidia.com/gpu'
I1012 02:22:01.011281       1 server.go:147] Starting to serve 'nvidia.com/gpu' on /var/lib/kubelet/device-plugins/nvidia-gpu.sock
I1012 02:22:01.012376       1 server.go:154] Registered device plugin for 'nvidia.com/gpu' with Kubelet

查看GPU節(jié)點(diǎn)信息

# kubectl describe node aiserver003087

78f8af26-0265-11f0-9310-92fbcf53809c.png
在k8s中測(cè)試GPU資源調(diào)用
測(cè)試Pod

# cat gpu_test.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: ffmpeg-pod
spec:
  nodeName: aiserver003087 #指定有g(shù)pu的節(jié)點(diǎn)
  containers:
    - name: ffmpeg-container
      image: nightseas/ffmpeg:latest #k8s中配置阿里的私有倉(cāng)庫(kù)遇到一些問題,暫時(shí)用公共鏡像
      command: [ "/bin/bash", "-ce", "tail -f /dev/null" ]
      resources:
        limits:
          nvidia.com/gpu: 1 # 請(qǐng)求分配 1個(gè) GPU

創(chuàng)建Pod

# kubectl apply -f gpu_test.yaml 
pod/ffmpeg-pod configured

往Pod內(nèi)倒入一個(gè)視頻進(jìn)行轉(zhuǎn)換測(cè)試

# kubectl cp test.mp4 ffmpeg-pod:/root

進(jìn)入Pod

# kubectl exec -it ffmpeg-pod bash

轉(zhuǎn)換測(cè)試視頻

# ffmpeg -hwaccel cuvid -c:v h264_cuvid -i test.mp4 -vf scale_npp=1280:720 -vcodec h264_nvenc out.mp4

成功轉(zhuǎn)換并且輸出out.mp4則代表調(diào)用GPU資源成功
為保證DaemonSet至部署至帶GPU資源的服務(wù)器可以做一個(gè)node標(biāo)簽選擇器
設(shè)置給節(jié)點(diǎn)標(biāo)簽

# kubectl label nodes aiserver003087 gpu=true

修改DaemonSet配置文件添加標(biāo)簽選擇保證DaemonSet至部署至帶gpu=true標(biāo)簽的Node上

deployment配置文件修改位置是一致的

7906bfd0-0265-11f0-9310-92fbcf53809c.png
修改gpu測(cè)試Pod的yaml文件使用標(biāo)簽選擇器

# cat gpu_test.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: ffmpeg-pod
spec:
  #nodeName: aiserver003087 #指定有g(shù)pu的節(jié)點(diǎn)
  containers:
    - name: ffmpeg-container
      image: nightseas/ffmpeg:latest #k8s中配置阿里的私有倉(cāng)庫(kù)遇到一些問題,暫時(shí)用公共鏡像
      command: [ "/bin/bash", "-ce", "tail -f /dev/null" ]
      resources:
        limits:
          nvidia.com/gpu: 1
  nodeSelector:
    gpu: "true"
    #kubernetes.io/os: linux

注意: 標(biāo)簽選擇器需要值需要添加雙引號(hào)"true"否則apply會(huì)報(bào)錯(cuò),不能把bool值作為對(duì)應(yīng)的值應(yīng)用至標(biāo)簽選擇器

K8S集群會(huì)自動(dòng)調(diào)用GPU資源,但是如果一個(gè)GPU設(shè)備已經(jīng)被使用,再啟動(dòng)一個(gè)應(yīng)用時(shí)可能調(diào)用到改設(shè)備導(dǎo)致顯存溢出
可以修改配置指定GPU設(shè)備啟動(dòng)
指定第8塊顯卡啟動(dòng)應(yīng)用,設(shè)備號(hào)從0開始計(jì)算
7916e72a-0265-11f0-9310-92fbcf53809c.png

鏈接:https://www.cnblogs.com/minseo/p/18460107

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • gpu
    gpu
    +關(guān)注

    關(guān)注

    28

    文章

    4855

    瀏覽量

    130052
  • 集群
    +關(guān)注

    關(guān)注

    0

    文章

    97

    瀏覽量

    17300
  • 命令
    +關(guān)注

    關(guān)注

    5

    文章

    712

    瀏覽量

    22388
  • Docker
    +關(guān)注

    關(guān)注

    0

    文章

    499

    瀏覽量

    12357

原文標(biāo)題:AI時(shí)代GPU加速:如何通過Docker和K8S集群實(shí)現(xiàn)高效調(diào)用GPU

文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 0人收藏

    評(píng)論

    相關(guān)推薦

    全面提升,阿里云Docker/Kubernetes(K8S) 日志解決方案與選型對(duì)比

    方案簡(jiǎn)介如上圖所示,我們只需要在Kubernetes集群中的每個(gè)節(jié)點(diǎn)上部署一個(gè)Logtail的容器,即可實(shí)現(xiàn)該節(jié)點(diǎn)上宿主機(jī)日志、容器日志、容器stdout等所有數(shù)據(jù)源的一站式采集。我們針對(duì)k8s提供了
    發(fā)表于 02-28 12:49

    全面提升,阿里云Docker/Kubernetes(K8S) 日志解決方案與選型對(duì)比

    方案簡(jiǎn)介如上圖所示,我們只需要在Kubernetes集群中的每個(gè)節(jié)點(diǎn)上部署一個(gè)Logtail的容器,即可實(shí)現(xiàn)該節(jié)點(diǎn)上宿主機(jī)日志、容器日志、容器stdout等所有數(shù)據(jù)源的一站式采集。我們針對(duì)k8s提供了
    發(fā)表于 02-28 12:50

    K8s 從懵圈到熟練 – 集群網(wǎng)絡(luò)詳解

    ,不同的地方在于 terway 支持 Pod 彈性網(wǎng)卡,以及 NetworkPolicy 功能。本文中,作者基于當(dāng)前的 1.12.6 版本,以 flannel 為例,深入分析阿里云 K8S 集群網(wǎng)絡(luò)的實(shí)現(xiàn)方法
    發(fā)表于 10-14 15:06

    搭建K8s環(huán)境平臺(tái)的步驟

    1 搭建K8s環(huán)境平臺(tái)規(guī)劃1.1 單master集群1.2 多master集群
    發(fā)表于 11-04 06:03

    k8s容器運(yùn)行時(shí)演進(jìn)歷史

    docker/k8s時(shí)代,經(jīng)常聽到CRI, OCI,containerd和各種shim等名詞,看完本篇博文,您會(huì)有個(gè)徹底的理解。 典型的K8S Runtime架構(gòu) 從最常見的Docker
    的頭像 發(fā)表于 02-02 13:50 ?2015次閱讀
    <b class='flag-5'>k8s</b>容器運(yùn)行時(shí)演進(jìn)歷史

    Docker不香嗎為什么還要用K8s

    Docker 雖好用,但面對(duì)強(qiáng)大的集群,成千上萬的容器,突然感覺不香了。 這時(shí)候就需要我們的主角 Kubernetes 上場(chǎng)了,先來了解一下 K8s 的基本概念,后面再介紹實(shí)踐,由淺入深步步為營(yíng)
    的頭像 發(fā)表于 06-02 11:56 ?3558次閱讀

    簡(jiǎn)單說明k8sDocker之間的關(guān)系

    這篇文章主要介紹了k8sDocker關(guān)系簡(jiǎn)單說明,本文利用圖文講解的很透徹,有需要的同學(xué)可以研究下 最近項(xiàng)目用到kubernetes(以下簡(jiǎn)稱k8sk
    的頭像 發(fā)表于 06-24 15:48 ?3557次閱讀

    K8S集群服務(wù)訪問失敗怎么辦 K8S故障處理集錦

    問題1:K8S集群服務(wù)訪問失?。?? ? 原因分析:證書不能被識(shí)別,其原因?yàn)椋鹤远x證書,過期等。 解決方法:更新證書即可。 問題2:K8S集群服務(wù)訪問失敗? curl: (7) Fa
    的頭像 發(fā)表于 09-01 11:11 ?1.6w次閱讀
    <b class='flag-5'>K8S</b><b class='flag-5'>集群</b>服務(wù)訪問失敗怎么辦 <b class='flag-5'>K8S</b>故障處理集錦

    k8s集群環(huán)境中工作有多快

    命令就會(huì)很低效。 今天介紹3個(gè)工具會(huì)讓你在多k8s集群環(huán)境中工作的很輕松。我將從以下幾個(gè)方面來評(píng)估工具實(shí)用性: 速度 如果你有多個(gè)k8s集群可選擇,你切換
    的頭像 發(fā)表于 05-29 14:28 ?679次閱讀
    多<b class='flag-5'>k8s</b><b class='flag-5'>集群</b>環(huán)境中工作有多快

    k8s是什么意思?kubeadm部署k8s集群k8s部署)|PetaExpres

    ),Kubernetes提供了應(yīng)用部署,規(guī)劃,更新,維護(hù)的一種機(jī)制。 在Kubernetes中,我們可以創(chuàng)建多個(gè)容器,每個(gè)容器里面運(yùn)行一個(gè)應(yīng)用實(shí)例,然后通過內(nèi)置的負(fù)載均衡策略,實(shí)現(xiàn)對(duì)這一組應(yīng)用實(shí)例的管理、發(fā)現(xiàn)、訪問,而這些細(xì)節(jié)都不需要運(yùn)維人員去進(jìn)行復(fù)雜的手工配置和處理。
    發(fā)表于 07-19 13:14 ?1212次閱讀

    K8s集群管理:為什么需要多集群、多集群的優(yōu)勢(shì)是什么

    隨著K8s和云原生技術(shù)的快速發(fā)展,以及各大廠商在自己的數(shù)據(jù)中心使用K8s的API進(jìn)行容器化應(yīng)用編排和管理,讓應(yīng)用交付本身變得越來越標(biāo)準(zhǔn)化和統(tǒng)一化,并且實(shí)現(xiàn)了與底層基礎(chǔ)設(shè)施的完全解耦,為多集群
    發(fā)表于 09-14 10:48 ?1757次閱讀
    <b class='flag-5'>K8s</b>多<b class='flag-5'>集群</b>管理:為什么需要多<b class='flag-5'>集群</b>、多<b class='flag-5'>集群</b>的優(yōu)勢(shì)是什么

    k8s云原生開發(fā)要求

    IO性能。網(wǎng)絡(luò)要求穩(wěn)定,建議使用私有網(wǎng)絡(luò)VPC,并配置與Kubernetes兼容的網(wǎng)絡(luò)插件。操作系統(tǒng)需與K8s版本匹配,虛擬化平臺(tái)支持Docker等。此外,還需關(guān)注安全配置,如禁用Swap、調(diào)整Sysctl等,以及etcd數(shù)據(jù)存儲(chǔ)后端的配置。合理配置硬件可確保
    的頭像 發(fā)表于 10-24 10:03 ?424次閱讀
    <b class='flag-5'>k8s</b>云原生開發(fā)要求

    混合云部署k8s集群方法有哪些?

    混合云部署k8s集群方法是首先需在本地與公有云分別建立K8s集群,并確保網(wǎng)絡(luò)連接。接著,配置kubeconfig文件連接兩集群,并安裝云服務(wù)
    的頭像 發(fā)表于 11-07 09:37 ?329次閱讀

    k8sdocker區(qū)別對(duì)比,哪個(gè)更強(qiáng)?

    部署、擴(kuò)展、管理和應(yīng)用生命周期管理能力,可實(shí)現(xiàn)高可用性和自動(dòng)伸縮,兩者常結(jié)合使用以優(yōu)化容器化和應(yīng)用管理。UU云小編將對(duì)k8sdocker區(qū)別進(jìn)行詳細(xì)對(duì)比:
    的頭像 發(fā)表于 12-11 13:55 ?376次閱讀

    自建K8S集群認(rèn)證過期

    今天使用kubectl命令查看pod信息時(shí),一直正常運(yùn)行的k8s集群突然不能訪問了,輸入任何命令都提示以下報(bào)錯(cuò)。
    的頭像 發(fā)表于 02-07 12:32 ?242次閱讀

    電子發(fā)燒友

    中國(guó)電子工程師最喜歡的網(wǎng)站

    • 2931785位工程師會(huì)員交流學(xué)習(xí)
    • 獲取您個(gè)性化的科技前沿技術(shù)信息
    • 參加活動(dòng)獲取豐厚的禮品