天天看點

解密阿裡雲大規模深度學習性能優化實踐

文 | 阿裡雲異構計算AI加速負責人 遊亮

近日,斯坦福大學公布了最新的 DAWNBench 深度學習榜單,這是人工智能領域最權威的競賽之一,是衡量深度學習優化政策、模型架構、軟體架構、雲和硬體等綜合解決方案實力的标準之一。

在圖像識别(Image Classification on ImageNet)榜單中,阿裡雲包攬了訓練時間、訓練成本、推理延遲以及推理成本四項第一。 DAWNBench 官方顯示,阿裡雲異構計算服務訓練 ImageNet 128 萬張圖檔僅需 2 分 38 秒,基于含光 800 的 AI 服務識别一張圖檔僅需 0.0739ms,同時在訓練成本和推理成本上也實作世界紀錄的突破。

此次,阿裡雲創造四項紀錄得益于阿裡雲自研加速架構 AIACC 及平頭哥含光 800 晶片。

其中,AIACC 是阿裡雲自主研發的飛天 AI 加速引擎,首次實作了統一加速 Tensorflow、PyTorch、MxNet 和 Caffe 等主流深度學習架構,在相同的硬體

平台下,AIACC 能夠顯著提升人工智能訓練與推理的性能。

作為 AIACC 的研發負責人,我将在本文内與大家分享阿裡雲基于 AIACC 的大規模深度學習應用架構和性能優化實踐。

大規模分布式訓練是未來趨勢

随着深度學習模型越來越複雜,對計算力的需求也越來越高。ResNet-50 訓練 ImageNet 128 萬張圖檔 90 個 epoch 可以達到 75% 的 Top-1 精度,用一塊 P100 的 GPU 需要大概 5 天的時間,而各大廠都分别施展了各自的大規模分布式訓練大法來縮短該标杆的訓練時間。

2017 年 7 月,Facebook 自己設計了 Big Basin 伺服器,每台伺服器用了 8 塊 P100 通過 NVLink 互聯,Facebook 用了 32 台合 256 張 P100 用了 1 個小時就訓練完。

2017 年 9 月,UCBerkeley 發表了一篇文章,用了 2048 塊 NKL 将訓練記錄縮短到了 20 分鐘。

2017 年 11 月,日本的 Preferred Network 采用了 1024 塊 P100 将訓練記錄縮短到了 15 分鐘。

2017 年 11 月,Google 也發表了一篇文章,用了 256 個 TPUv2 在 30 分鐘内訓練完。

2018 年 11 月 13 号,Sony 公司使用了 2176 塊 V100,将訓練記錄縮短到 3 分 44 秒。

……

這些大廠都在争奪分布式訓練的戰略制高點,可以看出大規模分布式訓練會是未來業界技術發展的趨勢。

深度學習應用基礎架構

我們先來看看深度學習應用的基礎架構。整個深度學習應用基礎架構圖,分為 4 個層次。

解密阿裡雲大規模深度學習性能優化實踐

從下往上第一層是資源層,資源層包括計算資源、存儲資源和網絡資源。我們在做深度學習應用時,需要 GPU 伺服器的計算資源來做深度學習訓練和推理,需要存儲資源來存訓練代碼和資料,需要網絡資源處理多機之間的通信。

第 2 層是排程層,包括了基于容器的排程和基于實體機排程兩種排程方式,負責向下排程計算資源、存儲資源和網絡資源,向上排程架構層和應用層的計算任務。

第 3 層是架構層,目前主流的深度學習計算架構包括了 Tensorflow、PyTorch、MXNET、Caffe 等主流計算架構。

第 4 層是應用層,應用層包括了圖像識别、人臉識别、目标檢測、視訊識别、CTR 預估、自然語言了解、語音識别等深度學習的應用,應用層是由架構層的計算架構來描述和計算使用者自己的模型和算法。

大規模深度學習應用的架構和挑戰

先來看一下為什麼要做大規模深度學習。

舉個例子,我們曾訓練一個模型,如果用一張 GPU 卡,需要 7 天的時間,意味着調整模型參數之後,可能在 7 天後才知道這個參數是否正确。如果我們用一台 8 卡 GPU 的伺服器,就隻需要不到一天的時間就可以訓練完。如果我們有 10 台這樣的 8 卡伺服器訓練的話,可能兩三個小時就可以訓練完一個模型。這樣就能很快發現參數是否正确。

從這個例子可以看出,大規模深度學習具有以下 4 個優勢:一是大規模分布式訓練可以降低深度學習訓練的時間;二是可以加速深度學習算法研究的效率和程序;三是大規模分布式推理可以提升使用者深度學習應用的并發度和可靠性,四是最終提升使用者産品的競争力,提升使用者産品市場占有率。是以,大規模深度學習對于公司來說,是提高生産力效率的制高點。

解密阿裡雲大規模深度學習性能優化實踐

大規模分布式訓練的基本計算模型大體上分為兩類:一類是 PS 模式的分布式訓練,一類是對等模式的分布式訓練。

解密阿裡雲大規模深度學習性能優化實踐

如圖,PS 分布式有一個參數伺服器,有很多個 worker,參數伺服器負責存儲全局模型,而每個 worker 上都有一份本地模型的副本;在分布式訓練開始的時候,每個 worker 都會讀取自己的訓練資料,然後去更新本地的模型,得到本地的梯度;然後每個 worker 将本地的梯度上傳到參數伺服器上去得到全局梯度,參數伺服器上再用全局梯度去更新全局模型,然後更新後的全局模型會去更新所有 worker 的本地模型,再進行下一次的訓練疊代。

而對等模式沒有參數伺服器,每個 worker 都獲得自己的訓練資料,去更新本地的模型,得到本地的梯度,然後每個 worker 的本地梯度會做一個全局的 all-reduce 計算,進而每個 worker 都可以得到全局梯度,每個 worker 再用全局梯度去更新本地的模型,再進行下一次訓練疊代。

PS 模式比較适合有大量模型參數的情況,一張 GPU 存不下模型大小,通過 PS 的分布式可以将大參數模型存下來,但是缺點是有中心化通信,當規模越來越大的時候,通信效率會越來越低。

而對等模式比較适合于一張 GPU 能夠存下的模型大小,并且是一種去中心式的通信模式,可以通過 Ring-Allreduce 環形通信算法來降低通信複雜度。

不同的計算架構都有不同的計算模式,例如 Tensorflow 既有 PS 模式又有對等模式,PyTorch 以支援對等模式為主,而 MXNET 以支援 KVStore 和 PS-Lite 的 PS 模式為主。

不同架構的不同分布式模式對于使用者來寫分布式代碼、分布式性能優化以及分布式排程都會是非常大的阻礙。

大規模深度學習應用對于基礎架構有着不一樣的需求。

解密阿裡雲大規模深度學習性能優化實踐

在資源層,計算資源上,需要大規模的 GPU 伺服器叢集來做分布式訓練,需要大容量的并行檔案系統來做大規模的檔案存儲和提供并行的檔案通路,還需要建設大規模的 TCP 或者 RDMA 網絡。

在排程層,需要進行大規模的 GPU 叢集和任務排程。

在架構層,需要感覺計算和排程不同深度學習計算架構的分布式計算的模式。

在應用層,我們也需要去拆分訓練資料,或者拆分訓練模型到不同的 worker 上去。

是以,對于大規模深度學習的應用,會存在諸多的困難和挑戰。

對于資源層來說:

首先,建設大規模 GPU 叢集是非常困難的,包括要解決大規模 GPU 機器的機房、機架、電源的問題,以及它們的穩定性和成本的問題。

其次,衆所周知,建設大規模并行檔案系統不僅需要建設大容量的并行檔案系統,而且對于并行檔案系統的穩定性和可靠性的挑戰是非常之高的。

另外,需要建設大規模、高帶寬的 TCP 或者 RDMA 網絡也非常困難,需要規劃和實作大規模交換機和節點的拓撲結構,規劃和實作大規模南北向流量的收斂比,規劃和實作大規模網絡協定和 IP 位址,并且需要保障網絡的可靠性以及大規模網絡的性能。

對于排程層:不管是基于容器的排程還是基于實體機的排程,需要去做 CPU 和 GPU 的混合排程,需要做 GPU 顯存共享排程,以及對不同深度學習計算架構的分布式排程。

對于架構層來說:各種主流的深度學習計算架構都有不同的分布式計算模式,需要在應用層做不同的分布式實作、排程層做不同的分布式排程,同時需要對針對底層的網絡實作對各種架構做分布式性能優化。

這其中的任何一項,無不需要專業知識非常深厚的技術專家、架構師、工程師來部署和實作。

基于雲計算的大規模深度學習應用架構

這些高深技術的實作和應用如何能夠飛入尋常百姓家呢?幸好有雲計算。

解密阿裡雲大規模深度學習性能優化實踐

拿阿裡雲舉例說明,從基于雲計算的大規模深度學習應用的架構可以看出,在資源層,我們對于大規模 GPU 伺服器叢集的需求直接建立大規模 GPU 雲計算伺服器;對于這種大容量并行檔案系統,直接可以建立并行檔案系統 CPFS;對于大規模 TCP、RDMA 網絡可以直接采用阿裡雲網絡資源。

在排程層,我們對于大規模 GPU 叢集的排程的需求,可以直接使用雲容器排程 ACK 或者使用雲虛機排程 EHPC。可以說目前雲計算的産品基本能夠快速解決大規模資源和排程層面的問題,并且不需要多高深的技術功底。

雲計算對于大規模深度學習具有易用、彈性和穩定等天然優勢。

首先是易用性。如果我們有一個非常緊急的需求需要在短時間内使用大量的 GPU 計算、存儲和網絡資源,阿裡雲在可以在十幾分鐘内按需開啟大規模的 GPU 計算資源、大規模存儲資源和大規模網絡資源,而自己采購和部署的話一方面需要計算、存儲、網絡領域的技術高手,另一方面周期是按月來計。

第二是彈性。當業務高峰來的時候,可以彈性擴充出更多的基礎資源來承接新增業務,而當業務高峰過去之後,就可以釋放多餘的基礎資源,這樣可以達到業務和基礎資源成本的最佳配比。

第三是穩定性。阿裡雲提供的計算服務、存儲服務和網絡服務的穩定性都遠超實體資源,阿裡雲的計算 + 網絡服務的可靠性是 99.95%,而存儲服務的可靠性是 99.9999999999%。

第四是成本優勢。因為雲計算本身具有規模性的優勢,是以它具備實體硬體集中采購的成本優勢,以及實體硬體集中管理、運維的成本優勢,對業務來講,則通過彈性伸縮達到業務成本最優配比。

對于大規模深度學習應用,除了雲計算帶來的這些優勢之外,我們團隊還做了兩個基于雲計算的架構更新,第 1 個是飛天 AI 加速引擎 AIACC,第 2 個是 FastGPU 即刻建構。

解密阿裡雲大規模深度學習性能優化實踐

首先給大家介紹飛天 AI 加速引擎 AIACC,前面提到了不同架構的不同分布式模式對使用者寫分布式代碼、分布式性能優化以及分布式排程都産生極大的學習成本和困難,而 AIACC 主要解決架構層面的大規模深度學習的統一性能加速和統一排程問題。它是業界首次統一加速 Tensorflow、PyTorch、MXNET、Caffe 等主流開源架構的性能加速引擎,具有四大優勢。

第 1 個優勢是統一加速。

前面提到,各種計算架構的不同的分布式模式會對統一的排程和應用層分布式的實作,都産生極大的阻礙。

而 AIACC 可以做到統一的分布式模式和分布式性能加速,這樣排程層可以做到統一的分布式排程,應用層可以做到統一的分布式計算,同時對于底層分布式通信的優化隻需要一份工作,各種架構都能享受到性能提升的好處。

第 2 個優勢就是針對網絡和 GPU 加速器都做了極緻的優化,這個後面一節會詳細的講。

第 3 個優勢是結合雲端做彈性伸縮,讓使用者業務的成本最優。

第 4 個優勢是和開源相容的,使用者用開源深度學習計算架構寫的代碼大部分都不用修改,直接采用 AIACC 庫就可以得到性能上的飛躍。

AIACC 主要是利用了基于通信的性能優化技術。通過前面的分享我們知道,在做分布式訓練的時候我們需要在機器之間、GPU 之間交換梯度資料,需要做到非常高效的資料通信。

我們的分布式通信優化分為三個方面的優化。

第 1 個方面是做通訊和計算的重疊。我們梯度是做異步通信的,在計算的時候并行去做梯度通信,進而将通信的時間隐藏在計算後面。

第 2 個方面是做了延遲的優化。我們在做梯度通信之前需要去做梯度協商,需要知道每台機器上 GPU 裡的梯度是不是 ready,然後再做通信。傳統的做法是通過一個中心化的節點去做所有節點梯度協商,這樣當規模上來時,延遲會非常高。而我們的優化方法是去中心化的方式去做梯度協商,這樣的效率更高,大規模下延遲也不會提高。

第 3 方面的優化是做帶寬的優化,帶寬方面有 5 種優化方法:

第 1 種優化方法是基于拓撲結構的分級通信優化。我們知道在一台機器上的 GPU 之間的通信帶寬是很高的,而跨機的 GPU 通訊的帶寬是很低的,是以我們通過分級通信優化。先在機器内部做 GPU 之間的通信,然後再在 GPU 機器之間做通訊。

第 2 種優化方法是做混合精度傳輸。原始的梯度的精度都是 float32 類型的,我們在做計算的時候還是保持 float32 的精度,但是在梯度傳輸的時候可以把它轉成 float16 的精度去做梯度傳輸,這樣要傳輸的資料量直接減少一半。同時,我們通過 scaling 的方式保持精度不下降。

第 3 種優化方法,是做多梯度融合通信。一個模型在做分布式通信的時候需要對很多層的梯度都來做通信,如果每計算出來一個梯度就去做一次通信的話,很多層的梯度資料包是非常小的,對帶寬的使用率是非常低的。于是,我們做了梯度融合,等到一批梯度融合之後,再做一批梯度的多機通信,這樣對帶寬使用率是很高的。

第 4 種優化方法是做多流通訊。在高帶寬的 TCP 網絡情況下,單個通信流是沒有辦法把帶寬打滿的,是以我們用多流來做通信。然而,我們發現,多流的情況下多流之間的傳輸速率是不一樣的,于是做了負載均衡,傳得更快的流會自動拿更多的梯度通信,傳得更慢的流會通信更少的梯度。

第 5 種優化方法是對融合的粒度以及通信的流數作了一個動态的 tuning 過程。我們在開始訓練開始的幾個 batch 的時候,會根據目前網絡的情況對這些參數做動态的調整進而達到最優性能,這樣我們就可以動态的适配在不同網絡情況下達到最優的性能。

解密阿裡雲大規模深度學習性能優化實踐

這個圖是我們做動态調優的過程,綠色部分是做計算,紅色部分是做通信,我們可以看到在訓練剛開始的幾個 batch 隻有一個流作通信,而且它的通信時間會比較長。在中間這一段我們開出了兩個流來做通信,在後面這一段我們開出了 4 個流來做通信,并且 4 個流之間是做了負載均衡,在最後一個 batch 的時候,我們達到了一個最佳的性能。

解密阿裡雲大規模深度學習性能優化實踐

經過這些性能優化工作,我們也小試牛刀,訓練上述大廠的 ResNet-50 模型 +ImageNet 資料集的任務,在 512 張 P100 上的性能比單卡性能能夠加速 462 倍,基本上達到了接近線性的加速比,将訓練時間從原來的 5 天時間縮短到了 16 分鐘。

這次 DWANBench 打榜,我們也釋出了基于 V100 的大規模訓練時間,訓練達到 top5 的 93% 的精度隻需要 2 分 38 秒。

而我們另一個架構更新 FastGPU 即刻建構主要幫助使用者快速搭建大規模分布式訓練叢集,并且幫助客戶在雲端做到業務成本最優化,接下來和大家介紹通過 FastGPU 即刻建構雲端大規模分布式訓練叢集。

因為現在阿裡雲的雲計算服務都會提供 OpenAPI 的接口直接建立計算資源、存儲資源和網絡資源。我們可以通過 FastGPU 來封裝這些 OpenAPI 接口來直接建立出一個雲端的大規模分布式的叢集,同時可以開始大規模分布式的訓練任務。

解密阿裡雲大規模深度學習性能優化實踐

如上圖所示,綠色部分代表使用者,藍色部分代表阿裡雲資源,橙色部分代表 FastGPU。使用者在起始狀态的時候,先把訓練資料集上傳到雲存儲 OSS 裡,開一台 ECS 做為開發主機來存訓練代碼(或者放在 Cloud Shell 上)。然後在這台開發機上一鍵就可以通過 FastGPU 來建立深度學習應用需要的基礎資源,包括大規模 GPU 計算資源、雲盤和并行檔案系統的存儲資源、Tmux 和 Tensorboard 的互動式資源,都可以建立出來,使用者可以通過互動式資源實時檢視訓練過程。

等訓練所需要的資源都 ready 之後,就可以自動的啟動分布式訓練任務。當分布式訓練任務結束之後,可以自動的釋放這些基礎資源,訓練得到的模型和 log 檔案可以存在 OSS 或者開發機上供使用者使用。

FastGPU 能夠做到既省時、又省錢、又易用。

首先是節省時間,舉個例子,我們之前要配置一個分布式的深度學習環境的話,需要先準備 GPU 的基礎資源、網絡資源,再準備存儲資源,然後需要配置每台機器的深度學習環境:包括某版本的作業系統、某版本的 GPU 驅動、某版本的 CUDA、某版本的 cuDNN、某版本的 Tensorflow 等,然後再把訓練資料上傳到每台機器上,然後再把多台機器之間的網絡打通,這個可能要耗費一個工程師一天的時間來準備環境,而用 FastGPU 的話隻需要 5 分鐘的時間就可以完成。

其次是省錢,我們可以做到讓 GPU 資源的生命周期和訓練的生命周期保持同步,也就是說隻有在我們的訓練或者推理任務準備好時才去開啟 GPU 資源,而當訓練或者推理任務結束之後,就會自動的釋放掉 GPU 的資源,不會造成 GPU 資源的閑置,同時也支援可搶占 GPU 執行個體(低價格執行個體)的建立和管理。

第三是易用,我們建立的所有的資源都是 IaaS(基礎設施)的資源,所有建立的資源和運作的任務都是可通路、可調式、可複現和可回溯的。

大規模深度學習應用架構和性能優化實踐

在做大規模分布式訓練的時候,我們希望訓練的性能能夠随着 GPU 數量的增長而線性增長,但是實際情況下往往達不到這麼理想的加速比,甚至往往在增加 GPU 伺服器時,性能卻沒有相應增加。

其中主要有兩方面的瓶頸,一方面在多台 GPU 伺服器同時讀取訓練檔案的時候,檔案系統的并行通路能力包括 IOPS 和帶寬會是瓶頸;另外一方面,GPU 伺服器之間的通信會是瓶頸。

在阿裡雲上可以一鍵建立高并發的并行檔案系統 CPFS 解決檔案高并發通路的問題,而通過 AIACC 來解決大規模分布式通信的性能問題。

最後,跟大家分享圖像識别、大規模 CTR 預估、大規模人臉識别、大規模自然語言了解,這 4 個大規模深度學習場景的應用架構和性能優化的實踐。

第 1 個案例是一鍵建構大規模圖像識别的分布式訓練任務。

這個場景需要訓練 128 萬張 ImageNet 的圖檔,模型是 ResNet-50 和 VGG-16,訓練架構是 Tensorflow。

通過 FastGPU 一鍵拉起右邊的架構,包括多台 8 卡 P100 的 GPU 伺服器、25Gb 網絡和并行檔案系統 CPFS,并且通過 AIACC-Tensorflow 架構來做分布式訓練。

多台 GPU 伺服器上的 worker 會并行的做訓練,并且并行的從 CPFS 上讀取訓練資料。CPFS 可以提供多台 GPU 伺服器并行通路資料的聚合 IOPS 和聚合帶寬,而 AIACC 可以讓多 GPU 之間的通信能夠達到性能最優。

解密阿裡雲大規模深度學習性能優化實踐

下圖是大規模圖像識别分布式訓練性能優化的結果。Uber 開源的 Horovod 也是一個分布式訓練優化的架構,主要做的是基于 ring-allreduce 環形通信的優化。它的分布式性能會比原生的 Tensorflow 和其他架構分布式性能要好。在我們這個案例裡,基于 32 張 P100 的訓練訓練性能比 Horovod 的性能可以提升 65%,基于 128 張卡 P100 訓練性能比 Horovod 提升 80%。

解密阿裡雲大規模深度學習性能優化實踐

第 2 個案例是大規模 CTR 預估的分布式訓練。

CTR 預估會根據每個人在網上的行為做千人千面的推薦,例如根據每個人的點選、停留、點贊、轉發、購買等行為,推薦使用者可能感興趣的内容、商品或者廣告。

這個案例需要訓練的資料量有 1 千億,它的模型是 Wide&Deep 的模型,用的分布式架構是 Tensorflow。

解密阿裡雲大規模深度學習性能優化實踐

我們先通過 FastGPU 一鍵拉起架構,包括多台 2 卡 M40 的 GPU 伺服器、10Gb 網絡和檔案系統 HDFS,并且通過 AIACC-Tensorflow 架構來做分布式訓練。

解密阿裡雲大規模深度學習性能優化實踐

可右邊這張圖中,綠色的部分是原始 Tensorflow 的性能,随着節點數的增加并沒有太多的性能加速,在 1 天内訓練 1 千億的資料量根本不可能。

我們定位了一下應用到性能瓶頸,瓶頸主要來自兩個方面:一個方面是從 HDFS 上讀取檔案的 IO 瓶頸,另一個方面來自于多機之間的通信瓶頸。

我們通過多線程并行讀取和多緩沖隊列來優化檔案的 IO,通過 AIACC 的通信優化技術來優化多機之間的通信性能。

最終我們在 4 張 GPU 卡上獲得了 3.5 倍的性能提升,在 64 張 GPU 卡上獲得了 8.5 倍的性能提升,在 128 張 GPU 卡上獲得了 13.4 倍的性能提升,5 小時可以訓練 1 千億的資料量。

解密阿裡雲大規模深度學習性能優化實踐

第 3 個案例是大規模人臉識别分布式訓練。

在人臉識别的場景下,分布式訓練的複雜度會随着人臉識别的分類數的增加而增加,這個案例的人臉分類數達到了千萬級人臉,模型是 InsightFace,計算架構式是 MXNET。

我們先用 FastGPU 一鍵拉起多台 8 卡 P100 的 GPU 伺服器、25Gb 網絡和并行檔案系統 CPFS,并且用 AIACC-MXNET 來做分布式訓練。

解密阿裡雲大規模深度學習性能優化實踐

在千萬級人臉分類的場景下沒有辦法做純粹的資料并行,需要做資料并行和模型并行的混合并行。是以我們擴充了 AIACC 的接口,一方面支援 MXNET 的 kvstore 接口,一方面支援資料并行和模型并行的混合并行,這樣通過 AIACC-MXNET 将人臉識别的能力提升到千萬級别,最終在 16 張 GPU 卡上性能可以提升 56%,在 32 張 GPU 卡上性能可以提升 135%,在 64 張 GPU 卡上性能可以提升 280%。

解密阿裡雲大規模深度學習性能優化實踐

第 4 個案例是大規模自然語言了解分布式訓練。

這個案例的模型有 Transformer 和 Bert 模型,其中 Bert 是 Google 開源的一個非常大的模型,在 NLP 的競賽中取得了非常好的成績。它有 1.1 億個參數,對于分布式訓練的加速比是一個非常大的挑戰。我們通過 FastGPU 一鍵拉起多台 8 卡 P100 的 GPU 伺服器、25Gb 網絡和并行檔案系統 CPFS,并且通過 AIACC-Tensorflow 來做分布式訓練。

解密阿裡雲大規模深度學習性能優化實踐

我們擴充了 AIACC 的接口來支援 Transformer 和 Bert 模型的分布式訓練,最終 Transformer 模型在 16 張 GPU 卡上,取得了 7.8 倍的性能提升,Bert 模型在 16 張 GPU 卡上取得了 7.4 倍的性能提升。

解密阿裡雲大規模深度學習性能優化實踐

FastGPU 一鍵部署和訓練手勢識别應用的源碼:

https://github.com/aliyun/alibabacloud-aiacc-demo/tree/master/pytorch/gtc-demo

上文介紹的大規模人臉識别分布式訓練源碼:

https://github.com/aliyun/alibabacloud-aiacc-demo/tree/master/mxnet/insightface

上文介紹的大規模自然語言了解分布式訓練源碼:

https://github.com/aliyun/alibabacloud-aiacc-demo/tree/master/tensorflow/bert

後續還會開源更多大規模深度學習源碼,敬請期待。

我們是異構計算飛天 AI 加速團隊,我們團隊的願景是讓天下沒有難算的 AI,誠邀各界有志之士加入,待遇優厚,前景遠大,有興趣的朋友加微信 youliang_2008。

繼續閱讀