From 5897398455adefdac9405360590a3662e61cc9bb Mon Sep 17 00:00:00 2001 From: zhuyuhua-v Date: Sun, 10 Dec 2023 22:23:50 -0800 Subject: [PATCH 1/3] nvidia_deeprecommender: fix cuda bias code --- .../models/nvidia_deeprecommender/nvinfer.py | 30 ++++++++++--- .../models/nvidia_deeprecommender/nvtrain.py | 45 ++++++++++++++----- 2 files changed, 57 insertions(+), 18 deletions(-) diff --git a/torchbenchmark/models/nvidia_deeprecommender/nvinfer.py b/torchbenchmark/models/nvidia_deeprecommender/nvinfer.py index 74e7333c72..34116270a3 100644 --- a/torchbenchmark/models/nvidia_deeprecommender/nvinfer.py +++ b/torchbenchmark/models/nvidia_deeprecommender/nvinfer.py @@ -44,6 +44,8 @@ def getCommandLineArgs() : help='jit-ify model before running') parser.add_argument('--forcecuda', action='store_true', help='force cuda use') + parser.add_argument('--forcexpu', action='store_true', + help='force xpu use') parser.add_argument('--forcecpu', action='store_true', help='force cpu use') parser.add_argument('--nooutput', action='store_true', @@ -57,7 +59,7 @@ def getCommandLineArgs() : return args -def getBenchmarkArgs(forceCuda): +def getBenchmarkArgs(forceCuda, forceXpu): class Args: pass @@ -76,7 +78,8 @@ class Args: args.batch_size = 1 args.jit = False args.forcecuda = forceCuda - args.forcecpu = not forceCuda + args.forcexpu = forceXpu + args.forcecpu = not (forceCuda or forceXpu) args.nooutput = True args.silent = True args.profile = False @@ -93,20 +96,26 @@ def processArgState(args) : quit() args.use_cuda = torch.cuda.is_available() # global flag + args.use_xpu = torch.xpu.is_available() # global flag if not args.silent: - if args.use_cuda: + if args.use_cuda or args.use_xpu: print('GPU is available.') else: print('GPU is not available.') if args.use_cuda and args.forcecpu: args.use_cuda = False + device = 'cpu' + + if args.use_xpu and args.forcecpu: + args.use_xpu = False + device = 'cpu' if not args.silent: - if args.use_cuda: + if args.use_cuda or args.use_xpu: print('Running On GPU') else: - print('Running On CUDA') + print('Running On CPU') if args.profile: print('Profiler Enabled') @@ -127,18 +136,24 @@ def __init__(self, device = 'cpu', jit=False, batch_size=256, usecommandlineargs if self.toytest: self.toyinputs = torch.randn(self.batch_size,self.node_count).to(device) + print("device:", device) if usecommandlineargs: self.args = getCommandLineArgs() else: if device == "cpu": forcecuda = False + forcexpu = False elif device == "cuda": forcecuda = True + forcexpu = False + elif device == "xpu": + forcecuda = False + forcexpu = True else: # unknown device string, quit init return - self.args = getBenchmarkArgs(forcecuda) + self.args = getBenchmarkArgs(forcecuda, forcexpu) args = processArgState(self.args) @@ -199,6 +214,7 @@ def __init__(self, device = 'cpu', jit=False, batch_size=256, usecommandlineargs if self.args.use_cuda: self.rencoder = self.rencoder.cuda() + if self.args.use_xpu: self.rencoder = self.rencoder.xpu() if self.toytest == False: self.inv_userIdMap = {v: k for k, v in self.data_layer.userIdMap.items()} @@ -214,7 +230,7 @@ def eval(self, niter=1): continue for i, ((out, src), majorInd) in enumerate(self.eval_data_layer.iterate_one_epoch_eval(for_inf=True)): - inputs = Variable(src.cuda().to_dense() if self.args.use_cuda else src.to_dense()) + inputs = Variable(src.to(device).to_dense()) targets_np = out.to_dense().numpy()[0, :] out = self.rencoder(inputs) diff --git a/torchbenchmark/models/nvidia_deeprecommender/nvtrain.py b/torchbenchmark/models/nvidia_deeprecommender/nvtrain.py index 7a73956f36..626e454a12 100644 --- a/torchbenchmark/models/nvidia_deeprecommender/nvtrain.py +++ b/torchbenchmark/models/nvidia_deeprecommender/nvtrain.py @@ -101,6 +101,8 @@ def getTrainCommandLineArgs() : help='disable all messages') parser.add_argument('--forcecuda', action='store_true', help='force cuda use') + parser.add_argument('--forcexpu', action='store_true', + help='force xpu use') parser.add_argument('--forcecpu', action='store_true', help='force cpu use') parser.add_argument('--profile', action='store_true', @@ -120,18 +122,23 @@ def processTrainArgState(args) : quit() args.use_cuda = torch.cuda.is_available() # global flag + args.use_xpu = torch.xpu.is_available() # global flag if not args.silent: - if args.use_cuda: + if args.use_cuda or args.use_xpu: print('GPU is available.') else: print('GPU is not available.') if args.use_cuda and args.forcecpu: args.use_cuda = False + if args.use_xpu and args.forcecpu: + args.use_xpu = False if not args.silent: if args.use_cuda: print('Running On CUDA') + elif args.use_xpu: + print('Running On XPU') else: print('Running On CPU') @@ -164,13 +171,13 @@ def log_var_and_grad_summaries(logger, layers, global_step, prefix, log_histogra logger.histo_summary(tag="Gradients/{}_{}".format(prefix, ind), values=w.grad.data.cpu().numpy(), step=global_step) -def DoTrainEval(encoder, evaluation_data_layer, use_cuda): +def DoTrainEval(encoder, evaluation_data_layer, device): encoder.eval() denom = 0.0 total_epoch_loss = 0.0 for i, (eval, src) in enumerate(evaluation_data_layer.iterate_one_epoch_eval()): - inputs = Variable(src.cuda().to_dense() if use_cuda else src.to_dense()) - targets = Variable(eval.cuda().to_dense() if use_cuda else eval.to_dense()) + inputs = Variable(src.to(device).to_dense()) + targets = Variable(eval.to(device).to_dense()) outputs = encoder(inputs) loss, num_ratings = model.MSEloss(outputs, targets) total_epoch_loss += loss.item() @@ -181,6 +188,7 @@ class DeepRecommenderTrainBenchmark: def __init__(self, device="cpu", jit=False, batch_size=256, processCommandLine = False): self.TrainInit(device, jit, batch_size, processCommandLine) + print("device:", device) def TrainInit(self, device="cpu", jit=False, batch_size=256, processCommandLine = False): @@ -201,14 +209,25 @@ def TrainInit(self, device="cpu", jit=False, batch_size=256, processCommandLine if device == "cpu": forcecuda = False + forcecpu = True + forcexpu = False elif device == "cuda": forcecuda = True + forcecpu = False + forcexpu = False + elif device == 'xpu': + forcecuda = False + forcecpu = False + forcexpu = True else: # unknown device string, quit init + print('warning: skip by unknown device:', device) return self.args.forcecuda = forcecuda - self.args.forcecpu = not forcecuda + self.args.forcecpu = forcecpu + self.args.forcexpu = forcexpu + print("forcexpu:", forcexpu) self.args = processTrainArgState(self.args) @@ -274,7 +293,7 @@ def TrainInit(self, device="cpu", jit=False, batch_size=256, processCommandLine gpu_ids = [int(g) for g in self.args.gpu_ids.split(',')] if not self.args.silent: print('Using GPUs: {}'.format(gpu_ids)) - + if len(gpu_ids)>1: self.rencoder = nn.DataParallel(self.rencoder, device_ids=gpu_ids) @@ -282,7 +301,11 @@ def TrainInit(self, device="cpu", jit=False, batch_size=256, processCommandLine self.rencoder = self.rencoder.cuda() self.toyinputs = self.toyinputs.to(device) - + if self.args.use_xpu: + print("-----using xpu devices----") + self.rencoder = self.rencoder.xpu() + self.toyinputs = self.toyinputs.to('xpu') + if self.args.optimizer == "adam": self.optimizer = optim.Adam(self.rencoder.parameters(), lr=self.args.lr, @@ -326,7 +349,7 @@ def DoTrain(self): for i, mb in enumerate(self.data_layer.iterate_one_epoch()): - inputs = Variable(mb.cuda().to_dense() if self.args.use_cuda else mb.to_dense()) + inputs = Variable(mb.to(device).to_dense()) self.optimizer.zero_grad() @@ -404,7 +427,7 @@ def train(self, niter=1) : self.logger.scalar_summary("Training_RMSE_per_epoch", sqrt(self.total_epoch_loss/self.denom), self.epoch) self.logger.scalar_summary("Epoch_time", e_end_time - e_start_time, self.epoch) if self.epoch % self.args.save_every == 0 or self.epoch == self.args.num_epochs - 1: - eval_loss = DoTrainEval(self.rencoder, self.eval_data_layer, self.args.use_cuda) + eval_loss = DoTrainEval(self.rencoder, self.eval_data_layer, device) print('Epoch {} EVALUATION LOSS: {}'.format(self.epoch, eval_loss)) self.logger.scalar_summary("EVALUATION_RMSE", eval_loss, self.epoch) @@ -417,13 +440,13 @@ def train(self, niter=1) : # save to onnx dummy_input = Variable(torch.randn(self.params['batch_size'], self.data_layer.vector_dim).type(torch.float)) - torch.onnx.export(self.rencoder.float(), dummy_input.cuda() if self.args.use_cuda else dummy_input, + torch.onnx.export(self.rencoder.float(), dummy_input.to(device), self.model_checkpoint + ".onnx", verbose=True) print("ONNX model saved to {}!".format(self.model_checkpoint + ".onnx")) def TimedTrainingRun(self): if self.args.profile: - with profiler.profile(record_shapes=True, use_cuda=self.args.use_cuda) as prof: + with profiler.profile(record_shapes=True, use_cuda=self.args.use_cuda, use_xpu=self.args.use_xpu) as prof: with profiler.record_function("training_epoch"): self.train(self.args.num_epochs) else: From b5620ff2ae1569723e67f432fe8f95728f6cbe6a Mon Sep 17 00:00:00 2001 From: weishi-deng Date: Sun, 10 Dec 2023 22:31:37 -0800 Subject: [PATCH 2/3] fix format --- torchbenchmark/models/nvidia_deeprecommender/nvtrain.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/torchbenchmark/models/nvidia_deeprecommender/nvtrain.py b/torchbenchmark/models/nvidia_deeprecommender/nvtrain.py index 626e454a12..026583cf9e 100644 --- a/torchbenchmark/models/nvidia_deeprecommender/nvtrain.py +++ b/torchbenchmark/models/nvidia_deeprecommender/nvtrain.py @@ -131,8 +131,10 @@ def processTrainArgState(args) : if args.use_cuda and args.forcecpu: args.use_cuda = False + device = 'cpu' if args.use_xpu and args.forcecpu: args.use_xpu = False + device = 'cpu' if not args.silent: if args.use_cuda: @@ -188,7 +190,6 @@ class DeepRecommenderTrainBenchmark: def __init__(self, device="cpu", jit=False, batch_size=256, processCommandLine = False): self.TrainInit(device, jit, batch_size, processCommandLine) - print("device:", device) def TrainInit(self, device="cpu", jit=False, batch_size=256, processCommandLine = False): @@ -227,7 +228,6 @@ def TrainInit(self, device="cpu", jit=False, batch_size=256, processCommandLine self.args.forcecuda = forcecuda self.args.forcecpu = forcecpu self.args.forcexpu = forcexpu - print("forcexpu:", forcexpu) self.args = processTrainArgState(self.args) @@ -302,7 +302,6 @@ def TrainInit(self, device="cpu", jit=False, batch_size=256, processCommandLine self.toyinputs = self.toyinputs.to(device) if self.args.use_xpu: - print("-----using xpu devices----") self.rencoder = self.rencoder.xpu() self.toyinputs = self.toyinputs.to('xpu') From 06422fbe19dbcdaac6d6fb0983bcc980a5568ea9 Mon Sep 17 00:00:00 2001 From: "Deng, Weishi" Date: Tue, 12 Dec 2023 19:47:36 -0800 Subject: [PATCH 3/3] add xpu profile info --- torchbenchmark/models/nvidia_deeprecommender/nvinfer.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/torchbenchmark/models/nvidia_deeprecommender/nvinfer.py b/torchbenchmark/models/nvidia_deeprecommender/nvinfer.py index 34116270a3..90418b7ac6 100644 --- a/torchbenchmark/models/nvidia_deeprecommender/nvinfer.py +++ b/torchbenchmark/models/nvidia_deeprecommender/nvinfer.py @@ -136,7 +136,6 @@ def __init__(self, device = 'cpu', jit=False, batch_size=256, usecommandlineargs if self.toytest: self.toyinputs = torch.randn(self.batch_size,self.node_count).to(device) - print("device:", device) if usecommandlineargs: self.args = getCommandLineArgs() else: @@ -253,7 +252,7 @@ def TimedInferenceRun(self) : e_start_time = time.time() if self.args.profile: - with profiler.profile(record_shapes=True, use_cuda=True) as prof: + with profiler.profile(record_shapes=True, use_cuda=self.args.use_cuda, use_xpu=self.args.use_xpu) as prof: with profiler.record_function("Inference"): self.eval() else: