Contents
De NVIDIA A100, gebaseerd op de NVIDIA Ampere GPU-architectuur, biedt een reeks opwindende nieuwe functies: Tensor van de derde generatie Cores, Multi-Instance GPU (MIG) en derde generatie NVLink.
Ampere Tensor Cores introduceren een nieuwe wiskundige modus speciaal voor AI-training: de TensorFloat-32 (TF32). TF32 is ontworpen om de verwerking van FP32-gegevenstypen, die vaak worden gebruikt in DL-workloads, te versnellen. Op NVIDIA A100 Tensor Cores is de doorvoer van wiskundige bewerkingen die in TF32-indeling worden uitgevoerd tot 10x meer dan die van FP32 op de eerdere Volta-generatie V100 GPU, wat resulteert in tot 5,7x hogere prestaties voor DL-workloads.
Elke maand geeft NVIDIA containers vrij voor DL-frameworks op NVIDIA NGC, allemaal geoptimaliseerd voor NVIDIA GPU’s: TensorFlow 1, TensorFlow 2, PyTorch en “NVIDIA Optimized Deep Learning Framework, powered by Apache MXNet”. Vanaf release 20.06 hebben we ondersteuning toegevoegd voor de nieuwe NVIDIA A100-functies, nieuwe CUDA 11- en cuDNN 8-bibliotheken in alle deep learning framework-containers.
In dit bericht richten we ons op TensorFlow 1.15-gebaseerde containers en pipwheels met ondersteuning voor NVIDIA GPU’s, inclusief de A100. We blijven NVIDIA TensorFlow 1.15 elke maand uitbrengen om het aanzienlijke aantal NVIDIA-klanten te ondersteunen die nog steeds TensorFlow 1.x gebruiken.
De NVIDIA TensorFlow 1.15.2 van 20.06 release is gebaseerd op upstream TensorFlow versie 1.15.2. Met deze release bieden we kant-en-klare ondersteuning voor TF32 op GPU’s met NVIDIA Ampere-architectuur, terwijl we ook de ondersteuning voor GPU’s van de vorige generatie, zoals Volta en Turing, verbeteren. Met deze release kunt u het snelheidsvoordeel van TF32 op NVIDIA Ampere-architectuur GPU’s realiseren zonder codewijziging voor DL-workloads. Deze release bevat ook belangrijke updates voor automatische mixed precision (AMP), XLA en TensorFlow-TensorRT-integratie.
Numerieke precisies ondersteund door NVIDIA A100
Diepe neurale netwerken (DNN’s) kunnen vaak worden getraind met een gemengde precisiestrategie, waarbij voornamelijk FP16 wordt gebruikt, maar indien nodig ook FP32-precisie. Deze strategie resulteert in een aanzienlijke vermindering van de vereisten voor berekening, geheugen en geheugenbandbreedte, terwijl ze meestal convergeren naar de vergelijkbare uiteindelijke nauwkeurigheid. Zie voor meer informatie de Mixed Precision Training-whitepaper van NVIDIA Research.
NVIDIA Tensor Cores zijn gespecialiseerde rekeneenheden op NVIDIA Volta en nieuwere generatie GPU’s. Ze kunnen een volledige matrixvermenigvuldiging en accumulatiebewerking (MMA) uitvoeren in een enkele klokcyclus. Op Volta en Turing zijn de invoer twee matrices van 4×4 in FP16-formaat, terwijl de accumulator in FP32 is.
De Tensor Cores van de derde generatie op Ampere ondersteunen een nieuwe wiskundige modus: TF32. TF32 is een hybride formaat dat is gedefinieerd om het werk van FP32 efficiënter af te handelen. In het bijzonder gebruikt TF32 dezelfde 10-bits mantisse als FP16 om nauwkeurigheid te garanderen terwijl het hetzelfde bereik heeft als FP32, dankzij het gebruik van een 8-bits exponent.
Een groter representatief bereik dat overeenkomt met FP32 elimineert de noodzaak van een verliesschaalbewerking bij gebruik van TF32, waardoor de workflow voor gemengde precisietraining wordt vereenvoudigd. Afbeelding 1 toont een vergelijking tussen verschillende numerieke formaten.
Figuur 1. Numerieke formaten ondersteund door Ampere GPU’s.
Op Ampere Tensor Cores is TF32 de standaard wiskundige modus voor DL-workloads, in tegenstelling tot FP32 op Volta/Turing GPU’s. Intern, wanneer ze in de TF32-modus werken, accepteren Ampere Tensor Cores twee FP32-matrices als invoer, maar voeren ze intern matrixvermenigvuldiging uit in TF32-formaat. Het resultaat wordt verzameld in een FP32-matrix.
Wanneer ze in de FP16/BF16-modus werken, accepteren Ampere Tensor Cores in plaats daarvan FP16/BF16-matrices en accumuleren ze in een FP32-matrix. FP16/BF16-modus op Ampere biedt 2x doorvoer in vergelijking met TF32. Afbeelding 2 toont deze werkingsmodi.
Afbeelding 2. Twee werkingsmodi op Ampere Tensor Cores: TF32 en FP16.
TF32 is ontworpen om de verwerkingskracht van NVIDIA Tensor Cores-technologieën naar alle DL-workloads te brengen zonder dat er codewijzigingen nodig zijn. Voor meer slimme ontwikkelaars die de hoogste doorvoer willen ontgrendelen, blijft AMP-training met FP16 de meest performante optie en kan toch eenvoudig worden ingeschakeld zonder codewijziging (bij gebruik van de NVIDIA NGC TensorFlow-container) of slechts een enkele regel extra code.
Onze uitgebreide experimenten met een breed scala aan netwerkarchitecturen hebben aangetoond dat elk netwerk dat met succes kan worden getraind in convergentie met AMP op FP16/BF16, ook kan worden getraind in convergentie met TF32. In dergelijke gevallen is de uiteindelijke TF32-getrainde modelnauwkeurigheid vergelijkbaar met die getraind met FP32.
Verbeteringen aan TensorFlow 1.15.2
TensorFlow 1.15.2 biedt de volgende verbeteringen:
Verbeteringen aan TensorFlow 1.15.2
TensorFlow 1.15.2 biedt de volgende verbeteringen:
- TF32-ondersteuning
- AMP
- XLA
- TensorFlow-TensorRT-integratie
TF32-ondersteuning
NVIDIA TensorFlow 1.15.2 van 20.06 release gebruikt Ampere TF32-mogelijkheden out-of-the-box om alle DL-trainingsworkloads te versnellen. Dit is de standaardoptie en vereist geen codewijziging van ontwikkelaars. Op pre-Ampere GPU-architecturen is FP32 nog steeds de standaardprecisie.
Je kunt ook de standaard wiskundige modus wijzigen in FP32 op Ampere GPU’s door een omgevingsvariabele in te stellen:
export NVIDIA_ENABLE_TF32=0
Deze optie wordt niet aanbevolen. Gebruik het voornamelijk voor foutopsporingsdoeleinden.
Automatische mixed-precision training
AMP-training met FP16 blijft de meest performante optie voor DL-training. Voor TensorFlow werd AMP-training geïntegreerd na TensorFlow 1.14, waardoor beoefenaars gemakkelijk gemengde precisietraining kunnen uitvoeren, hetzij programmatisch, hetzij door een omgevingsvariabele in te stellen.
Gebruik een enkele API-aanroep om de optimizer af te sluiten:
opt = tf.train.experimental.enable_mixed_precision_graph_rewrite(opt)
Deze wijziging past automatische verliesschaal toe op uw model en maakt automatisch casten tot halve precisie mogelijk, zoals aangetoond in het voorbeeld van Mixed Precision Training van CNN.
Gebruik de volgende opdracht om een omgevingsvariabele in de NVIDIA NGC TensorFlow 1 in te schakelen container:
export TF_ENABLE_AUTO_MIXED_PRECISION=1
Dit past automatisch gemengde precisietraining toe op alle TensorFlow-workloads. Voor meer informatie over het uitvoeren van handmatige gemengde precisietraining, zie Tensor Core Math.
XLA
XLA is een DL-grafiekcompiler voor TensorFlow. In native TensorFlow wordt elke laag van het netwerk onafhankelijk verwerkt. XLA daarentegen maakt het clusteren van delen van het netwerk mogelijk in “subgrafieken” die kunnen worden geoptimaliseerd en gecompileerd. Dit biedt prestatievoordelen ten koste van enige compilatieoverhead. Afbeelding 3 toont de workflow voor XLA.
Figuur 3. XLA-workflow.
Bij uitvoering op GPU voert XLA optimalisaties uit zoals de volgende:
- Kernelfusie: Bandbreedtegebonden kernels met een relatie tussen consument en producent worden verticaal en horizontaal gefuseerd tot een enkele CUDA-kernel. Dit verbetert de prestaties door de toegang tot algemeen geheugen te verminderen en biedt de meeste waargenomen prestatievoordelen.
- Aanroepen naar geoptimaliseerde bibliotheekkernels: XLA-GPU richt zich op sterk geoptimaliseerde en prestatiegerichte cuDNN/cuBLAS-kernels en combineert meerdere operators in één geoptimaliseerde cuDNN/cuBLAS-kernel.
Voor meer informatie informatie over XLA:GPU, zie XLA Best Practices in de Deep Learning Frameworks-documentatie.
TensorFlow-TensorRT-integratie
NVIDIA TensorRT is een SDK voor hoogwaardige DL-inferentie. Het bevat een DL-inferentie-optimizer en runtime die lage latentie en hoge doorvoer levert voor DL-inferentietoepassingen.
TensorRT is nauw geïntegreerd in TensorFlow 1. We noemen het TensorFlow-TensorRT-integratie (TF-TRT). In TF-versie 1.15 maakt het deel uit van het pakket tensorflow.python.compiler. Een getraind neuraal netwerk kan eenvoudig worden geconverteerd naar een TF-TRT-model met een eenvoudige API-aanroep, zoals weergegeven in het volgende codeblok.
van tensorflow.python.compiler.tensorrt import trt_convert as trt converter = trt.TrtGraphConverter( input_saved_model_dir=input_saved_model_dir, precision_mode=trt.TrtPrecisionMode. ) converter.convert() converter.save>model_dir)TF-TRT kan modellen omzetten in verschillende precisies: FP32, FP16 en INT8. In het geval van INT8 moet een kleine kalibratiedataset door het netwerk worden gevoerd om de beste kwantisatieparameters te bepalen. Wanneer u een model converteert van FP32 naar INT8, biedt TF-TRT tot 11x inferentieversnelling op de Turing-generatie T4 GPU. Voor meer informatie over TF-TRT, zie GTC 2020: TensorRT-inferentie met TensorFlow 2.0.
Wanneer u het model converteert naar FP32 op Ampere, is de interne wiskundige modus die TF-TRT gebruikt TF32 en vereist geen elke code-interventie.
Aan de slag met TensorFlow 1.15.2
NVIDIA TensorFlow 1.15.2 van de 20.06-release is beschikbaar als een NGC Docker-image of via een pipwheel-pakket.
Het NGC Docker-beeld trekken
De NVIDIA TensorFlow-release is eenvoudig toegankelijk door een NGC Docker-containerimage te trekken. Gebruik de volgende opdracht:
docker pull nvcr.io/nvidia/tensorflow:20.06-tf1-py3
Deze Docker-containerimage bevat alle vereiste TensorFlow-GPU-afhankelijkheden, zoals CUDA, CuDNN en TensorRT. Het bevat ook de NCCL- en Horovod-bibliotheken voor training met meerdere GPU’s en meerdere knooppunten en NVIDIA DALI voor versnelde gegevensvoorverwerking en laden.
Het pipwheel-pakket installeren
NVIDIA TensorFlow 1.15.2 van de 20.06-release kan ook worden geïnstalleerd via een wielpakket. Wanneer u deze installatiemethode gebruikt, vereist NVIDIA TensorFlow alleen een bare metal-omgeving met Ubuntu, zoals Ubuntu 18.04, of een minimale Docker-container, zoals ubuntu:18.04. Bovendien moet de grafische driver van NVIDIA ook beschikbaar zijn en moet je nvidia-smi kunnen bellen om de GPU-status te controleren. Alle andere afhankelijkheden die vereist zijn voor NVIDIA TensorFlow 1.15.2 van de 20.06-release worden geïnstalleerd door het wielpakket.
Basissoftware om te installeren
Of u zich nu op bare metal of in een container bevindt, u moet mogelijk de volgende bewerkingen uitvoeren:
apt update apt install -y python3-dev python3-pip git pip3 install –upgrade pip setuptools requests
Virtuele omgevingen< /h4>
Sommige mensen gebruiken virtuele omgevingen om pip-pakketten te isoleren van conflicten. Conceptueel lijkt het op een Docker-image, maar het is in wezen een aparte installatiemap met gerichte zoekpaden.
De virtuele omgeving instellen:
pip install -U virtualenv virtualenv –system-site-packages -p python3 /venv
Een virtuele omgeving starten:
source /venv/bin/activate
Installeren van de index voor het TensorFlow-wiel
h4>
Installatie van deze index is vereist, zodat pip weet dat hij naar de NVIDIA-website moet gaan om de wielen te verkrijgen. Anders staat pip standaard op PyPI.org. Gebruik de volgende opdracht:
pip install nvidia-pyindex
Het TensorFlow-wiel installeren
Door de software te gebruiken, gaat u ermee akkoord te voldoen aan de voorwaarden van de licentieovereenkomst die bij de software wordt geleverd. Als u niet akkoord gaat met de voorwaarden van de licentieovereenkomst, gebruik de software dan niet.
Gebruik de volgende opdracht:
pip install nvidia-tensorflow[horovod]
Controleer of de pakketten zijn geïnstalleerd:
pip lijst | grep nvidia
De uitvoer zou als volgt moeten zijn:
nvidia-cublas 11.1.0.213 nvidia-cuda-cupti 11.0.167 nvidia-cuda-nvcc 11.0.167 nvidia-cuda-nvrtc 11.0.167 nvidia-cuda-runtime 11.0.167 nvidia-cudnn 8.0.1.13 nvidia-cufft 10.1.3.191 nvidia-curand 10.2.0.191 nvidia-cusolver 10.4.0.191 nvidia-cusparse 11.0.0.191 nvidia-dali 0.22.0 nvidia-dali-tf-plugin 0.22.0 nvidia-horovod 0.19.1 nvidia-nccl 2.7.5 nvidia-pyindex 1.0 .0 nvidia-tensorflow 1.15.2+nv20.6 nvidia-tensorrt 7.1.2.8
Controleer of TensorFlow laadt:
python -c ‘import tensorflow als tf; print(tf.__version__)’
De uitvoer moet zijn:
1.15.2
Controleer of de GPU wordt gezien door TensorFlow:
python -c “import tensorflow als tf; print(‘ Aantal beschikbare GPU’s: ‘, len(tf.config.experimental.list_physical_devices(‘GPU’)))”
De uitvoer zou ongeveer als volgt moeten zijn:
2020-05-16 22:03:35.428277: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1639] Gevonden apparaat 0 met eigenschappen: naam: Tesla V100- SXM2-16GB groot: 7 klein: 0 geheugenClockRate(GHz): 1,53
Prestatiebenchmarks
In deze sectie bespreken we de nauwkeurigheid en prestaties van TF32 op de NVIDIA A100, in vergelijking met FP32 en gemengde precisietraining met AMP, bij gebruik in de NVIDIA TensorFlow 1.15.2 NGC-container.
TF32-nauwkeurigheid
TF32 komt overeen met FP32-resultaten voor elk netwerk dat met succes is getraind met FP16 of BF16 gemengde precisie. We hebben geëxperimenteerd met een uitgebreide lijst van netwerkarchitecturen en hebben nog geen uitzondering gezien.
Figuren 4-6 tonen de trainingsverliescurves voor ResNet50, SSD en Transformer-XL wanneer getraind met TF32, FP32 en AMP. TF32 produceert vergelijkbare trainingscurves in termen van stabiliteit en eindnauwkeurigheid. Deze resultaten kunnen worden gereproduceerd met behulp van de modelscripts die te vinden zijn in NVIDIA Deep Learning-voorbeelden.
<Figuur 4. ResNet50 trainingsverliescurves met TF32, FP32 en AMP.
Figuur 5. Verliescurves voor SSD-training met TF32, FP32 en AMP.
Figuur 6. Transformer-XL trainingsverliescurves met TF32, FP32 en AMP.
Prestaties: TF32 op NVIDIA A100
Afbeelding 7 toont de snelheid die wordt waargenomen bij het trainen met TF32 op A100 in vergelijking met FP32 op V100, op verschillende netwerkarchitecturen. We zagen een typische doorvoersnelheid tot 6x terwijl ze convergeerden naar dezelfde uiteindelijke nauwkeurigheid.
Afbeelding 7. Prestaties van TF32 op NVIDIA 8xA100 vs. FP32 op 8xV100 GPU. Staven vertegenwoordigen de versnellingsfactor van TF32 ten opzichte van FP32. Hoe hoger, hoe beter.
Prestaties: FP16 op NVIDIA A100
AMP met FP16 blijft de best presterende optie voor DL-training op de A100. Afbeelding 8 laat zien dat AMP op A100 voor verschillende modellen een doorvoersnelheid tot 4,5x hoger biedt dan AMP op V100, terwijl het convergeert naar dezelfde uiteindelijke nauwkeurigheid.
Figuur 8. Prestaties van gemengde precisietraining op NVIDIA 8xA100 vs. 8xV100 GPU. Staven vertegenwoordigen de versnellingsfactor van A100 boven V100. Hoe hoger, hoe beter.
Oproep tot actie
De NVIDIA A100 GPU zit boordevol geavanceerde functies die zorgen voor een gezonde versnelling van alle DL-trainingsworkloads.
Je kunt NVIDIA TensorFlow 1.15.2 vanaf 20.06 uitproberen met de NVIDIA Deep Learning-voorbeelden en de voordelen ervaren van TF32-, XLA- en TensorFlow-TensorRT-integratie op de Ampere-generatie NVIDIA A100 GPU. NVIDIA TensorFlow is beschikbaar vanaf de TensorFlow NGC-containerversie 20.06 en wordt ook vrijgegeven als open source-code op https://github.com/NVIDIA/tensorflow.
Vinh Nguyen
Deep Learning Engineer and Data Wetenschapper, NVIDIA
Chetan Tekur
Productmanager, DL Software Team, NVIDIA