You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 6 Next »





Opis

Tensorflow je python knjižnica namijenjena razvoju aplikacija temeljenih na dubokom učenju koja se oslanja na ubrzanje grafičkim procesorima. Jedna od glavnih značajki ove knjižnice je postojanje API-a za brži razvoj modela strojnog učenja Keras, koja u sebi sadrži module i funkcije za svaki dio pipelinea u tipičnoj ML aplikaciji (preprocessing podataka, definicija modela, načina optimizacije i validacije)

Verzije

verzijamodulred
2.10.1scientific/tensorflow/2.10.1-ngcgpu

Dokumentacija

Primjeri

Ispod se nalaze primjeri aplikacija umjetnog benchmarka koji testira performanse na modelu Resnet50:

  • benchmark.py - python skripta umjetnog benchmarka
  • singlegpu.sh - skripta sustava PBS koja koristi jedan grafički procesor
  • multigpu-singlenode.sh - skripta sustava PBS koja koristi više grafičkih procesora na jednom čvoru


benchmark.py
#!/usr/bin/env python3

# source:
# - https://github.com/leondgarse/Keras_insightface/discussions/17

import sys
import time
import argparse
import numpy as np
import tensorflow as tf

# input arguments
parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)
parser.add_argument("-s",
                    "--strategy",
                    type=int, help="{1: OneDeviceStrategy, 2: MirroredStrategy}",
                    default=1)
parser.add_argument("-i",
                    "--images",
                    type=int,
                    help="batch size",
                    default=1024)
parser.add_argument("-b",
                    "--batch_size",
                    type=int,
                    help="batch size",
                    default=8)
parser.add_argument("-e",
                    "--epochs",
                    type=int,
                    help="epochs",
                    default=10)
parser.add_argument("-m",
                    "--model_name",
                    type=str,
                    help="model name",
                    default="ResNet50")
parser.add_argument("-f",
                    "--use_fp16",
                    action="store_true",
                    help="Use fp16")
args = parser.parse_known_args(sys.argv[1:])[0]

# do not allocate all GPU memory
gpus = tf.config.experimental.list_physical_devices('GPU')
for gpu in gpus:
    tf.config.experimental.set_memory_growth(gpu, True)

# use fp16 for faster inference
if args.use_fp16:
    tf.keras.mixed_precision.set_global_policy('mixed_float16')

# strategy
gpus = tf.config.experimental.list_physical_devices('GPU')
devices = [ gpu.name[-5:] for gpu in gpus ]
if args.strategy == 2:
    strategy = tf.distribute.MirroredStrategy(devices=devices)
else:
    strategy = tf.distribute.OneDeviceStrategy(device=devices[0])

# dummy dataset
batch_size = args.batch_size * strategy.num_replicas_in_sync
data = np.random.uniform(size=[args.images, 224, 224, 3])
target = np.random.uniform(size=[args.images, 1], low=0, high=999).astype("int64")
dataset = tf.data.Dataset.from_tensor_slices((data, target)).batch(batch_size)

# define model
with strategy.scope():
    model = getattr(tf.keras.applications, args.model_name)(weights=None)
    opt = tf.optimizers.SGD(0.01)
    model.compile(optimizer=opt,
                  loss=tf.keras.losses.SparseCategoricalCrossentropy())

# fit
model.fit(dataset,
          epochs=args.epochs,
          verbose=2)
singlegpu.sh
#!/bin/bash

#PBS -q gpu
#PBS -l select=1:ncpus=8:ngpus=1:mem=10GB
#PBS -o output/
#PBS -e output/

# pozovi modul
module load scientific/tensorflow/2.10.1-ngc

# pomakni se u direktorij gdje se nalazi skripta
cd $PBS_O_WORKDIR

# potjeraj skriptu
run-singlenode.sh singlegpu.py \
  --strategy 1 \
  --images 10240 \
  --batch_size 256 \
  --epochs 10 \
  --use_fp16 
multigpu-singlenode.sh
#!/bin/bash

#PBS -q gpu
#PBS -l select=1:ncpus=32:ngpus=4	:mem=10GB
#PBS -o output/
#PBS -e output/

# pozovi modul
module load scientific/tensorflow/2.10.1-ngc

# pomakni se u direktorij gdje se nalazi skripta
cd $PBS_O_WORKDIR

# potjeraj skriptu
run-singlenode.sh benchmark.py \
  --strategy 2 \
  --images 10240 \
  --batch_size 512 \
  --epochs 10 \
  --use_fp16 

Napomene

Apptainer i run-singlenode.sh

Ova knjižnica je dostavljena u obliku kontejnera, zbog opterećenja koje pip/conda virtualna okruženja stvaraju na Lustre dijeljenim datotečnim sustavima.

Za ispravno izvršavanje python aplikacija, potrebno ih je koristiti wrapper run-singlenode.sh u skriptama sustava PBS:

...
run-singlenode.sh moja_python_skripta.py
...

Korištenje više grafičkih procesora

Tensorflow ne raspodjeljuje automatski aplikaciju na više grafičkih procesora.

Pri razvoju aplikacije, bitno je koristiti odgovarajuće funkcionalnosti poput primjera iznad:

MirroredStrategy primjer
...
strategy = tf.distribute.MirroredStrategy()
with strategy.scope():
	model = ... definirati model ...
	model.compile()
  • No labels