From 05d1f5865bb2eb7c66e101a1e44403fd227e0dc8 Mon Sep 17 00:00:00 2001 From: Yancey1989 Date: Wed, 19 Sep 2018 19:17:45 +0800 Subject: [PATCH] add dist restnet --- .../image_classification/dist_train/README.md | 108 +++++ .../dist_train/__init__.py | 0 fluid/image_classification/dist_train/args.py | 127 ++++++ .../dist_train/dist_train.py | 369 ++++++++++++++++++ .../dist_train/imagenet_reader.py | 344 ++++++++++++++++ .../images/resnet50_32gpus-acc1.png | Bin 0 -> 84794 bytes 6 files changed, 948 insertions(+) create mode 100644 fluid/image_classification/dist_train/README.md create mode 100644 fluid/image_classification/dist_train/__init__.py create mode 100644 fluid/image_classification/dist_train/args.py create mode 100644 fluid/image_classification/dist_train/dist_train.py create mode 100644 fluid/image_classification/dist_train/imagenet_reader.py create mode 100644 fluid/image_classification/images/resnet50_32gpus-acc1.png diff --git a/fluid/image_classification/dist_train/README.md b/fluid/image_classification/dist_train/README.md new file mode 100644 index 00000000..5e8cd4a7 --- /dev/null +++ b/fluid/image_classification/dist_train/README.md @@ -0,0 +1,108 @@ +# Distributed Image Classification Models Training + +This folder contains implementations of **Image Classification Models**, they are designed to support +large-scaled distributed training with two distributed architecture: parameter server with RPC and ring-base with Nvidia NCCL2 library. + +## Getting Started + +1. The entrypoint file is `dist_train.py`, some important flags are as follows: + + - `model`, the model to run with, such as `ResNet50`, `ResNet101` and etc.. + - `batch_size`, the batch_size per device. + - `update_method`, specify the update method, local, pserver or nccl2. + - `device`, use CPU or GPU device. + - `gpus`, the GPU device count that the process used. + + you can check out more details of the flags by `python dist_train.py --help`. + +1. Runtime configurations + + We use the environment variable to distinguish the different training role of a distributed training job. + + - `PADDLE_TRAINING_ROLE`, the current training role, should be in [PSERVER, TRAINER]. + - `PADDLE_TRAINERS`, the trainer count of a job. + - `PADDLE_CURRENT_IP`, the current instance IP. + - `PADDLE_PSERVER_IPS`, the parameter server IP list, separated by "," only be used with update_method is pserver. + - `PADDLE_TRAINER_ID`, the unique trainer ID of a job, the ranging is [0, PADDLE_TRAINERS). + - `PADDLE_PSERVER_PORT`, the port of the parameter pserver listened on. + - `PADDLE_TRAINER_IPS`, the trainer IP list, separated by ",", only be used with upadte_method is nccl2. + +### Pserver Server with RPC + +In this example, we launched 4 parameter server instances and 4 trainer instances in the cluster: + +1. launch parameter server process + + ``` python + PADDLE_TRAINING_ROLE=PSERVER \ + PADDLE_TRAINERS=4 \ + PADDLE_PSERVER_IPS=192.168.0.100,192.168.0.101,192.168.0.102,192.168.0.103 \ + PADDLE_CURRENT_IP=192.168.0.100 \ + PADDLE_PSERVER_PORT=7164 \ + python dist_train.py \ + --model=ResNet50 \ + --batch_size=32 \ + --update_method=pserver \ + --device=CPU + ``` + +1. launch trainer process + + ``` python + PADDLE_TRAINING_ROLE=PSERVER \ + PADDLE_TRAINERS=4 \ + PADDLE_PSERVER_IPS=192.168.0.100,192.168.0.101,192.168.0.102,192.168.0.103 \ + PADDLE_TRAINER_ID=0 \ + PADDLE_PSERVER_PORT=7164 \ + python dist_train.py \ + --model=ResNet50 \ + --batch_size=32 \ + --update_method=pserver \ + --device=GPU + + ``` + +### Ring-base with Nvidia NCCL2 library + +1. launch trainer process + + ``` python + PADDLE_TRAINING_ROLE=TRAINER \ + PADDLE_TRAINERS=4 \ + PADDLE_TRAINER_IPS=192.168.0.100,192.168.0.101,192.168.0.102,192.168.0.103 \ + PADDLE_TRAINER_ID=0 \ + python dist_train.py \ + --model=ResNet50 \ + --batch_size=32 \ + --update_method=pserver \ + --device=GPU + ``` + +### Training Curve + +It's easy to draw the training curve accroding to the training logs, for example, +the logs of ResNet50 is as follows: + +``` text +Pass 0, batch 0, loss 7.0336914, accucacys: [0.0, 0.00390625] +Pass 0, batch 1, loss 7.094781, accucacys: [0.0, 0.0] +Pass 0, batch 2, loss 7.007068, accucacys: [0.0, 0.0078125] +Pass 0, batch 3, loss 7.1056547, accucacys: [0.00390625, 0.00390625] +Pass 0, batch 4, loss 7.133543, accucacys: [0.0, 0.0078125] +Pass 0, batch 5, loss 7.3055463, accucacys: [0.0078125, 0.01171875] +Pass 0, batch 6, loss 7.341838, accucacys: [0.0078125, 0.01171875] +Pass 0, batch 7, loss 7.290557, accucacys: [0.0, 0.0] +Pass 0, batch 8, loss 7.264951, accucacys: [0.0, 0.00390625] +Pass 0, batch 9, loss 7.43522, accucacys: [0.00390625, 0.00390625] +``` + +The training accucacys top1 of local training, distributed training with NCCL2 and parameter server architecture on the ResNet50 model are shown in the below figure: + +

+
+Training acc1 curves +

+ +### Performance + +TBD \ No newline at end of file diff --git a/fluid/image_classification/dist_train/__init__.py b/fluid/image_classification/dist_train/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/fluid/image_classification/dist_train/args.py b/fluid/image_classification/dist_train/args.py new file mode 100644 index 00000000..b69362a0 --- /dev/null +++ b/fluid/image_classification/dist_train/args.py @@ -0,0 +1,127 @@ +# Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import argparse + +__all__ = ['parse_args', ] + +BENCHMARK_MODELS = [ + "ResNet50", "ResNet101", "ResNet152" +] + + +def parse_args(): + parser = argparse.ArgumentParser('Fluid model benchmarks.') + parser.add_argument( + '--model', + type=str, + choices=BENCHMARK_MODELS, + default='resnet', + help='The model to run benchmark with.') + parser.add_argument( + '--batch_size', type=int, default=32, help='The minibatch size.') + # args related to learning rate + parser.add_argument( + '--learning_rate', type=float, default=0.001, help='The learning rate.') + # TODO(wuyi): add "--use_fake_data" option back. + parser.add_argument( + '--skip_batch_num', + type=int, + default=5, + help='The first num of minibatch num to skip, for better performance test' + ) + parser.add_argument( + '--iterations', type=int, default=80, help='The number of minibatches.') + parser.add_argument( + '--pass_num', type=int, default=100, help='The number of passes.') + parser.add_argument( + '--data_format', + type=str, + default='NCHW', + choices=['NCHW', 'NHWC'], + help='The data data_format, now only support NCHW.') + parser.add_argument( + '--device', + type=str, + default='GPU', + choices=['CPU', 'GPU'], + help='The device type.') + parser.add_argument( + '--gpus', + type=int, + default=1, + help='If gpus > 1, will use ParallelExecutor to run, else use Executor.') + # this option is available only for vgg and resnet. + parser.add_argument( + '--cpus', + type=int, + default=1, + help='If cpus > 1, will set ParallelExecutor to use multiple threads.') + parser.add_argument( + '--data_set', + type=str, + default='flowers', + choices=['cifar10', 'flowers', 'imagenet'], + help='Optional dataset for benchmark.') + parser.add_argument( + '--infer_only', action='store_true', help='If set, run forward only.') + parser.add_argument( + '--no_test', + action='store_true', + help='If set, do not test the testset during training.') + parser.add_argument( + '--memory_optimize', + action='store_true', + help='If set, optimize runtime memory before start.') + parser.add_argument( + '--use_fake_data', + action='store_true', + help='If set ommit the actual read data operators.') + parser.add_argument( + '--update_method', + type=str, + default='local', + choices=['local', 'pserver', 'nccl2'], + help='Choose parameter update method, can be local, pserver, nccl2.') + parser.add_argument( + '--no_split_var', + action='store_true', + default=False, + help='Whether split variables into blocks when update_method is pserver') + parser.add_argument( + '--async_mode', + action='store_true', + default=False, + help='Whether start pserver in async mode to support ASGD') + parser.add_argument( + '--use_reader_op', + action='store_true', + help='Whether to use reader op, and must specify the data path if set this to true.' + ) + parser.add_argument( + '--no_random', + action='store_true', + help='If set, keep the random seed and do not shuffle the data.') + parser.add_argument( + '--use_lars', + action='store_true', + help='If set, use lars for optimizers, ONLY support resnet module.') + parser.add_argument( + '--reduce_strategy', + type=str, + choices=['reduce', 'all_reduce'], + default='all_reduce', + help='Specify the reduce strategy, can be reduce, all_reduce') + args = parser.parse_args() + return args diff --git a/fluid/image_classification/dist_train/dist_train.py b/fluid/image_classification/dist_train/dist_train.py new file mode 100644 index 00000000..340e09dc --- /dev/null +++ b/fluid/image_classification/dist_train/dist_train.py @@ -0,0 +1,369 @@ +# Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import argparse +import time +import os +import traceback + +import numpy as np + +import paddle +import paddle.fluid as fluid +import paddle.fluid.core as core +import paddle.fluid.transpiler.distribute_transpiler as distribute_transpiler +import sys +sys.path.append("..") +import models +from imagenet_reader import train, val + +from args import * + +def get_model(args, is_train, main_prog, startup_prog): + pyreader = None + class_dim = 1000 + if args.data_format == 'NCHW': + dshape = [3, 224, 224] + else: + dshape = [224, 224, 3] + if is_train: + reader = train(xmap=False) + else: + reader = val(xmap=False) + + trainer_count = int(os.getenv("PADDLE_TRAINERS", "1")) + with fluid.program_guard(main_prog, startup_prog): + with fluid.unique_name.guard(): + pyreader = fluid.layers.py_reader( + capacity=args.batch_size * args.gpus, + shapes=([-1] + dshape, (-1, 1)), + dtypes=('float32', 'int64'), + name="train_reader" if is_train else "test_reader", + use_double_buffer=True) + input, label = fluid.layers.read_file(pyreader) + model_def = models.__dict__[args.model]() + predict = model_def.net(input, class_dim=class_dim) + + cost = fluid.layers.cross_entropy(input=predict, label=label) + avg_cost = fluid.layers.mean(x=cost) + + batch_acc1 = fluid.layers.accuracy(input=predict, label=label, k=1) + batch_acc5 = fluid.layers.accuracy(input=predict, label=label, k=5) + + + + # configure optimize + optimizer = None + if is_train: + + total_images = 1281167 / trainer_count + + step = int(total_images / (args.batch_size * args.gpus) + 1) + epochs = [30, 60, 90] + bd = [step * e for e in epochs] + base_lr = args.learning_rate + lr = [] + lr = [base_lr * (0.1**i) for i in range(len(bd) + 1)] + optimizer = fluid.optimizer.Momentum( + learning_rate=fluid.layers.piecewise_decay( + boundaries=bd, values=lr), + momentum=0.9, + regularization=fluid.regularizer.L2Decay(1e-4)) + optimizer.minimize(avg_cost) + + if args.memory_optimize: + fluid.memory_optimize(main_prog) + + batched_reader = None + pyreader.decorate_paddle_reader( + paddle.batch( + reader if args.no_random else paddle.reader.shuffle( + reader, buf_size=5120), + batch_size=args.batch_size)) + + return avg_cost, optimizer, [batch_acc1, + batch_acc5], batched_reader, pyreader + +def append_nccl2_prepare(trainer_id, startup_prog): + if trainer_id >= 0: + # append gen_nccl_id at the end of startup program + trainer_id = int(os.getenv("PADDLE_TRAINER_ID")) + port = os.getenv("PADDLE_PSERVER_PORT") + worker_ips = os.getenv("PADDLE_TRAINER_IPS") + worker_endpoints = [] + for ip in worker_ips.split(","): + worker_endpoints.append(':'.join([ip, port])) + num_trainers = len(worker_endpoints) + current_endpoint = os.getenv("PADDLE_CURRENT_IP") + ":" + port + worker_endpoints.remove(current_endpoint) + + nccl_id_var = startup_prog.global_block().create_var( + name="NCCLID", + persistable=True, + type=fluid.core.VarDesc.VarType.RAW) + startup_prog.global_block().append_op( + type="gen_nccl_id", + inputs={}, + outputs={"NCCLID": nccl_id_var}, + attrs={ + "endpoint": current_endpoint, + "endpoint_list": worker_endpoints, + "trainer_id": trainer_id + }) + return nccl_id_var, num_trainers, trainer_id + else: + raise Exception("must set positive PADDLE_TRAINER_ID env variables for " + "nccl-based dist train.") + + +def dist_transpile(trainer_id, args, train_prog, startup_prog): + if trainer_id < 0: + return None, None + + # the port of all pservers, needed by both trainer and pserver + port = os.getenv("PADDLE_PSERVER_PORT", "6174") + # comma separated ips of all pservers, needed by trainer and + # pserver + pserver_ips = os.getenv("PADDLE_PSERVER_IPS", "") + eplist = [] + for ip in pserver_ips.split(","): + eplist.append(':'.join([ip, port])) + pserver_endpoints = ",".join(eplist) + # total number of workers/trainers in the job, needed by + # trainer and pserver + trainers = int(os.getenv("PADDLE_TRAINERS")) + # the IP of the local machine, needed by pserver only + current_endpoint = os.getenv("PADDLE_CURRENT_IP", "") + ":" + port + # the role, should be either PSERVER or TRAINER + training_role = os.getenv("PADDLE_TRAINING_ROLE") + + config = distribute_transpiler.DistributeTranspilerConfig() + config.slice_var_up = not args.no_split_var + t = distribute_transpiler.DistributeTranspiler(config=config) + t.transpile( + trainer_id, + # NOTE: *MUST* use train_prog, for we are using with guard to + # generate different program for train and test. + program=train_prog, + pservers=pserver_endpoints, + trainers=trainers, + sync_mode=not args.async_mode, + startup_program=startup_prog) + if training_role == "PSERVER": + pserver_program = t.get_pserver_program(current_endpoint) + pserver_startup_program = t.get_startup_program( + current_endpoint, pserver_program, startup_program=startup_prog) + return pserver_program, pserver_startup_program + elif training_role == "TRAINER": + train_program = t.get_trainer_program() + return train_program, startup_prog + else: + raise ValueError( + 'PADDLE_TRAINING_ROLE environment variable must be either TRAINER or PSERVER' + ) + + +def test_parallel(exe, test_args, args, test_prog, feeder): + acc_evaluators = [] + for i in xrange(len(test_args[2])): + acc_evaluators.append(fluid.metrics.Accuracy()) + + to_fetch = [v.name for v in test_args[2]] + test_args[4].start() + while True: + try: + acc_rets = exe.run(fetch_list=to_fetch) + for i, e in enumerate(acc_evaluators): + e.update( + value=np.array(acc_rets[i]), weight=args.batch_size) + except fluid.core.EOFException as eof: + test_args[4].reset() + break + + return [e.eval() for e in acc_evaluators] + + +# NOTE: only need to benchmark using parallelexe +def train_parallel(train_args, test_args, args, train_prog, test_prog, + startup_prog, nccl_id_var, num_trainers, trainer_id): + over_all_start = time.time() + place = core.CPUPlace() if args.device == 'CPU' else core.CUDAPlace(0) + feeder = None + + if nccl_id_var and trainer_id == 0: + #FIXME(wuyi): wait other trainer to start listening + time.sleep(30) + + startup_exe = fluid.Executor(place) + startup_exe.run(startup_prog) + strategy = fluid.ExecutionStrategy() + strategy.num_threads = args.cpus + strategy.allow_op_delay = False + build_strategy = fluid.BuildStrategy() + if args.reduce_strategy == "reduce": + build_strategy.reduce_strategy = fluid.BuildStrategy( + ).ReduceStrategy.Reduce + else: + build_strategy.reduce_strategy = fluid.BuildStrategy( + ).ReduceStrategy.AllReduce + + avg_loss = train_args[0] + + if args.update_method == "pserver": + # parameter server mode distributed training, merge + # gradients on local server, do not initialize + # ParallelExecutor with multi server all-reduce mode. + num_trainers = 1 + trainer_id = 0 + + exe = fluid.ParallelExecutor( + True, + avg_loss.name, + main_program=train_prog, + exec_strategy=strategy, + build_strategy=build_strategy, + num_trainers=num_trainers, + trainer_id=trainer_id) + + if not args.no_test: + if args.update_method == "pserver": + test_scope = None + else: + # NOTE: use an empty scope to avoid test exe using NCCLID + test_scope = fluid.Scope() + test_exe = fluid.ParallelExecutor( + True, main_program=test_prog, share_vars_from=exe) + + pyreader = train_args[4] + for pass_id in range(args.pass_num): + num_samples = 0 + iters = 0 + start_time = time.time() + batch_id = 0 + pyreader.start() + while True: + if iters == args.iterations: + break + + if iters == args.skip_batch_num: + start_time = time.time() + num_samples = 0 + fetch_list = [avg_loss.name] + acc_name_list = [v.name for v in train_args[2]] + fetch_list.extend(acc_name_list) + + try: + fetch_ret = exe.run(fetch_list) + except fluid.core.EOFException as eof: + break + except fluid.core.EnforceNotMet as ex: + traceback.print_exc() + break + num_samples += args.batch_size * args.gpus + + iters += 1 + if batch_id % 1 == 0: + fetched_data = [np.mean(np.array(d)) for d in fetch_ret] + print("Pass %d, batch %d, loss %s, accucacys: %s" % + (pass_id, batch_id, fetched_data[0], fetched_data[1:])) + batch_id += 1 + + print_train_time(start_time, time.time(), num_samples) + pyreader.reset() # reset reader handle + + if not args.no_test and test_args[2]: + test_feeder = None + test_ret = test_parallel(test_exe, test_args, args, test_prog, + test_feeder) + print("Pass: %d, Test Accuracy: %s\n" % + (pass_id, [np.mean(np.array(v)) for v in test_ret])) + + startup_exe.close() + print("total train time: ", time.time() - over_all_start) + + +def print_arguments(args): + print('----------- Configuration Arguments -----------') + for arg, value in sorted(vars(args).iteritems()): + print('%s: %s' % (arg, value)) + print('------------------------------------------------') + + +def print_train_time(start_time, end_time, num_samples): + train_elapsed = end_time - start_time + examples_per_sec = num_samples / train_elapsed + print('\nTotal examples: %d, total time: %.5f, %.5f examples/sed\n' % + (num_samples, train_elapsed, examples_per_sec)) + + +def print_paddle_envs(): + print('----------- Configuration envs -----------') + for k in os.environ: + if "PADDLE_" in k: + print "ENV %s:%s" % (k, os.environ[k]) + print('------------------------------------------------') + + +def main(): + args = parse_args() + print_arguments(args) + print_paddle_envs() + if args.no_random: + fluid.default_startup_program().random_seed = 1 + + # the unique trainer id, starting from 0, needed by trainer + # only + nccl_id_var, num_trainers, trainer_id = ( + None, 1, int(os.getenv("PADDLE_TRAINER_ID", "0"))) + + train_prog = fluid.Program() + test_prog = fluid.Program() + startup_prog = fluid.Program() + + + + train_args = list(get_model(args, True, train_prog, startup_prog)) + test_args = list(get_model(args, False, test_prog, startup_prog)) + + all_args = [train_args, test_args, args] + + if args.update_method == "pserver": + train_prog, startup_prog = dist_transpile(trainer_id, args, train_prog, + startup_prog) + if not train_prog: + raise Exception( + "Must configure correct environments to run dist train.") + all_args.extend([train_prog, test_prog, startup_prog]) + if args.gpus > 1 and os.getenv("PADDLE_TRAINING_ROLE") == "TRAINER": + all_args.extend([nccl_id_var, num_trainers, trainer_id]) + train_parallel(*all_args) + elif os.getenv("PADDLE_TRAINING_ROLE") == "PSERVER": + # start pserver with Executor + server_exe = fluid.Executor(fluid.CPUPlace()) + server_exe.run(startup_prog) + server_exe.run(train_prog) + exit(0) + + # for other update methods, use default programs + all_args.extend([train_prog, test_prog, startup_prog]) + + if args.update_method == "nccl2": + nccl_id_var, num_trainers, trainer_id = append_nccl2_prepare( + trainer_id, startup_prog) + + all_args.extend([nccl_id_var, num_trainers, trainer_id]) + train_parallel(*all_args) + +if __name__ == "__main__": + main() diff --git a/fluid/image_classification/dist_train/imagenet_reader.py b/fluid/image_classification/dist_train/imagenet_reader.py new file mode 100644 index 00000000..5f26ab99 --- /dev/null +++ b/fluid/image_classification/dist_train/imagenet_reader.py @@ -0,0 +1,344 @@ +# Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import os +import math +import random +import functools +import numpy as np +from threading import Thread +import subprocess +import time + +from Queue import Queue +import paddle +from PIL import Image, ImageEnhance + +random.seed(0) + +DATA_DIM = 224 + +THREAD = int(os.getenv("PREPROCESS_THREADS", "10")) +BUF_SIZE = 5120 + +DATA_DIR = '../data/ILSVRC2012' +TRAIN_LIST = '../data/ILSVRC2012/train.txt' +TEST_LIST = '../data/ILSVRC2012/val.txt' + +img_mean = np.array([0.485, 0.456, 0.406]).reshape((3, 1, 1)) +img_std = np.array([0.229, 0.224, 0.225]).reshape((3, 1, 1)) + + +def resize_short(img, target_size): + percent = float(target_size) / min(img.size[0], img.size[1]) + resized_width = int(round(img.size[0] * percent)) + resized_height = int(round(img.size[1] * percent)) + img = img.resize((resized_width, resized_height), Image.LANCZOS) + return img + + +def crop_image(img, target_size, center): + width, height = img.size + size = target_size + if center == True: + w_start = (width - size) / 2 + h_start = (height - size) / 2 + else: + w_start = random.randint(0, width - size) + h_start = random.randint(0, height - size) + w_end = w_start + size + h_end = h_start + size + img = img.crop((w_start, h_start, w_end, h_end)) + return img + + +def random_crop(img, size, scale=[0.08, 1.0], ratio=[3. / 4., 4. / 3.]): + aspect_ratio = math.sqrt(random.uniform(*ratio)) + w = 1. * aspect_ratio + h = 1. / aspect_ratio + + bound = min((float(img.size[0]) / img.size[1]) / (w**2), + (float(img.size[1]) / img.size[0]) / (h**2)) + scale_max = min(scale[1], bound) + scale_min = min(scale[0], bound) + + target_area = img.size[0] * img.size[1] * random.uniform(scale_min, + scale_max) + target_size = math.sqrt(target_area) + w = int(target_size * w) + h = int(target_size * h) + + i = random.randint(0, img.size[0] - w) + j = random.randint(0, img.size[1] - h) + + img = img.crop((i, j, i + w, j + h)) + img = img.resize((size, size), Image.LANCZOS) + return img + + +def rotate_image(img): + angle = random.randint(-10, 10) + img = img.rotate(angle) + return img + + +def distort_color(img): + def random_brightness(img, lower=0.5, upper=1.5): + e = random.uniform(lower, upper) + return ImageEnhance.Brightness(img).enhance(e) + + def random_contrast(img, lower=0.5, upper=1.5): + e = random.uniform(lower, upper) + return ImageEnhance.Contrast(img).enhance(e) + + def random_color(img, lower=0.5, upper=1.5): + e = random.uniform(lower, upper) + return ImageEnhance.Color(img).enhance(e) + + ops = [random_brightness, random_contrast, random_color] + random.shuffle(ops) + + img = ops[0](img) + img = ops[1](img) + img = ops[2](img) + + return img + + +def process_image(sample, mode, color_jitter, rotate): + img_path = sample[0] + + img = Image.open(img_path) + if mode == 'train': + if rotate: img = rotate_image(img) + img = random_crop(img, DATA_DIM) + else: + img = resize_short(img, target_size=256) + img = crop_image(img, target_size=DATA_DIM, center=True) + if mode == 'train': + if color_jitter: + img = distort_color(img) + if random.randint(0, 1) == 1: + img = img.transpose(Image.FLIP_LEFT_RIGHT) + + if img.mode != 'RGB': + img = img.convert('RGB') + + img = np.array(img).astype('float32').transpose((2, 0, 1)) / 255 + img -= img_mean + img /= img_std + + if mode == 'train' or mode == 'val': + return img, sample[1] + elif mode == 'test': + return [img] + + +class XmapEndSignal(): + pass + + +def xmap_readers(mapper, + reader, + process_num, + buffer_size, + order=False, + print_queue_state=True): + end = XmapEndSignal() + + # define a worker to read samples from reader to in_queue + def read_worker(reader, in_queue): + for i in reader(): + in_queue.put(i) + in_queue.put(end) + + # define a worker to read samples from reader to in_queue with order flag + def order_read_worker(reader, in_queue, file_queue): + in_order = 0 + for i in reader(): + in_queue.put((in_order, i)) + in_order += 1 + in_queue.put(end) + + # define a worker to handle samples from in_queue by mapper + # and put mapped samples into out_queue + def handle_worker(in_queue, out_queue, mapper): + sample = in_queue.get() + while not isinstance(sample, XmapEndSignal): + r = mapper(sample) + out_queue.put(r) + sample = in_queue.get() + in_queue.put(end) + out_queue.put(end) + + # define a worker to handle samples from in_queue by mapper + # and put mapped samples into out_queue by order + def order_handle_worker(in_queue, out_queue, mapper, out_order): + ins = in_queue.get() + while not isinstance(ins, XmapEndSignal): + order, sample = ins + r = mapper(sample) + while order != out_order[0]: + pass + out_queue.put(r) + out_order[0] += 1 + ins = in_queue.get() + in_queue.put(end) + out_queue.put(end) + + def xreader(): + file_queue = Queue() + in_queue = Queue(buffer_size) + out_queue = Queue(buffer_size) + out_order = [0] + # start a read worker in a thread + target = order_read_worker if order else read_worker + t = Thread(target=target, args=(reader, in_queue)) + t.daemon = True + t.start() + # start several handle_workers + target = order_handle_worker if order else handle_worker + args = (in_queue, out_queue, mapper, out_order) if order else ( + in_queue, out_queue, mapper) + workers = [] + for i in xrange(process_num): + worker = Thread(target=target, args=args) + worker.daemon = True + workers.append(worker) + for w in workers: + w.start() + + sample = out_queue.get() + start_t = time.time() + while not isinstance(sample, XmapEndSignal): + yield sample + sample = out_queue.get() + if time.time() - start_t > 3: + if print_queue_state: + print("queue sizes: ", in_queue.qsize(), out_queue.qsize()) + start_t = time.time() + finish = 1 + while finish < process_num: + sample = out_queue.get() + if isinstance(sample, XmapEndSignal): + finish += 1 + else: + yield sample + + return xreader + + +def _reader_creator(file_list, + mode, + shuffle=False, + color_jitter=False, + rotate=False, + xmap=True): + def reader(): + with open(file_list) as flist: + full_lines = [line.strip() for line in flist] + if shuffle: + random.shuffle(full_lines) + if mode == 'train': + trainer_id = int(os.getenv("PADDLE_TRAINER_ID", "0")) + trainer_count = int(os.getenv("PADDLE_TRAINERS", "1")) + per_node_lines = len(full_lines) / trainer_count + lines = full_lines[trainer_id * per_node_lines:(trainer_id + 1) + * per_node_lines] + print( + "read images from %d, length: %d, lines length: %d, total: %d" + % (trainer_id * per_node_lines, per_node_lines, len(lines), + len(full_lines))) + else: + lines = full_lines + + for line in lines: + if mode == 'train': + img_path, label = line.split() + img_path = img_path.replace("JPEG", "jpeg") + img_path = os.path.join(DATA_DIR, "train", img_path) + yield (img_path, int(label)) + elif mode == 'val': + img_path, label = line.split() + img_path = img_path.replace("JPEG", "jpeg") + img_path = os.path.join(DATA_DIR, "val", img_path) + yield (img_path, int(label)) + elif mode == 'test': + img_path = os.path.join(DATA_DIR, line) + yield [img_path] + + mapper = functools.partial( + process_image, mode=mode, color_jitter=color_jitter, rotate=rotate) + + return paddle.reader.xmap_readers(mapper, reader, THREAD, BUF_SIZE) + + +def load_raw_image_uint8(sample): + img_arr = np.array(Image.open(sample[0])).astype('int64') + return img_arr, int(sample[1]) + + +def train_raw(file_list=TRAIN_LIST, shuffle=True): + def reader(): + with open(file_list) as flist: + full_lines = [line.strip() for line in flist] + if shuffle: + random.shuffle(full_lines) + + trainer_id = int(os.getenv("PADDLE_TRAINER_ID")) + trainer_count = int(os.getenv("PADDLE_TRAINERS")) + per_node_lines = len(full_lines) / trainer_count + lines = full_lines[trainer_id * per_node_lines:(trainer_id + 1) * + per_node_lines] + print("read images from %d, length: %d, lines length: %d, total: %d" + % (trainer_id * per_node_lines, per_node_lines, len(lines), + len(full_lines))) + + for line in lines: + img_path, label = line.split() + img_path = img_path.replace("JPEG", "jpeg") + img_path = os.path.join(DATA_DIR, "train", img_path) + yield (img_path, int(label)) + + return paddle.reader.xmap_readers(load_raw_image_uint8, reader, THREAD, + BUF_SIZE) + + +def train(file_list=TRAIN_LIST, xmap=True): + return _reader_creator( + file_list, + 'train', + shuffle=True, + color_jitter=False, + rotate=False, + xmap=xmap) + + +def val(file_list=TEST_LIST, xmap=True): + return _reader_creator(file_list, 'val', shuffle=False, xmap=xmap) + + +def test(file_list=TEST_LIST): + return _reader_creator(file_list, 'test', shuffle=False) + + +if __name__ == "__main__": + c = 0 + start_t = time.time() + for d in train()(): + c += 1 + if c >= 10000: + break + spent = time.time() - start_t + print("read 10000 speed: ", 10000 / spent, spent) diff --git a/fluid/image_classification/images/resnet50_32gpus-acc1.png b/fluid/image_classification/images/resnet50_32gpus-acc1.png new file mode 100644 index 0000000000000000000000000000000000000000..6d4c478743d0e5af0a9d727c76b433849c6a81dc GIT binary patch literal 84794 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

kkfA?@R>Tz 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 z zR5Ol}#*|iOjS_x@RT_zlWHJujhLhxq=<PDdUCntY9Uo#(RNGo8K?I>U z$jHoq&>J?e`Nqrk{FOq|IbDdwNN`^gXxo7okYB=nfas@7f%*A5GD3|iPQdo$LICP~ zB%O1(lXT5Q>nqNiwdHIN`ACq`j4p|8Z@M1p%D&%_c4<7iJwy~RIlmMV#Jdz$ydZ|% z94O5*xPKp+98!<@#yg|(-_C=#gpF&_sSVMnxy$;ohJ>bRy?P*67=9_!2WFEdeo)%e z7Sln%+IAjiYz2P!3Q28+8yR9K#?VQb&>Q(-V8Y85qQ3~dt@Bo9ROw)Wwj;eJ6xbo| zRIt!BUpgJ2*&NbCaKd4tA@|yHO?`TvGa*T@d1hqj;T(?g@aRYGn`qXC6Onu$D#xu= z3s25kl$99I(RH1{^?nI_cV2YP8UFbaOb&^=uLJe1!bM(yp<8kHbzz_!aRCahN9n)_ zgSZIiGU6bqbDxi#<^14rd(&Axe3x|pepU(2_vB+5?g!EJu?OU|th!43Zq``wGu(C# z&79lwsemEk-0U^eYNZpDU^odpzCdMHDe=B_9&T zCC#bUo#2V9vXC{puOv=I0;+}Ni*d}}_j1g7{F;i190JglIv-E11p*R^U-$TL7R;6q zD{Ct7>|NrRcyj5e^<$&~6hd-MhLQz`svyfvQReifIm#^YRl zi<3S;G)P_JBiYI5p#2Vw)|qFtkdzOVO%UtmIAAlGFnT&nQGH3LI{z`|lp%kU;OpZA zNT!;ahu7?l!-!(8;})*5@eL}-ir0z;PNa>VwLvefb0*{4Y$av|15D4fsuA(MJVj~Y zQx&i?j?VP3kmw4$evymR*}&Uyj<`FoPcX#TJfa=+l{=kGo(chKNK z=XV(e?8ES(5g8Kmp|IXKW&AX?-3Vod*oc86qdF9PAxDB3ioEJ44s^Xbxz$M62K7ii zqrDv>oGK1_85gB8$do{zK!)Pem?23Y@b5RRBD1W_DqY;j84mRfv}XbGG`rwHh8J`) z?)j-6yOHhxN@x?iDKPxd=+t4r)e@jK|L%>< zw#z(@p^yZ|QHoba%rrV;{BBcR#xlPf#&^YGj3!*4B6IX(mvUd>;2kBNwoZ#6TfO;A zkGktI+Fy9(vqTXL$+c6Dx{S5H;j@GDpC@}|hog#+`0S{H=T&%6jzM~X>vhTa?AXGX z)*s_8wm$P|c;K|`*NvNpd3s4JAu?JfJ^LBTE9&W<0*Z`sA*A)rTH7PfCZ0*C%wBdxg4TRU<$d)L{PZ!W^O`^V zNdFs~{g;jkixyLdfg1}t7Hon^UsOM3x|wzdYOik?dY!PK&O$+7HVIod#}nsWx8B+; z77$AoKXH&1x$3`hprG#u0?x1rW9~j^)>+EdYS@19 zIa#%B=P|~1qK*~suW)Agk3zZ`-e%&wPOBXmP|6rt-dIRy(%!*pj9Eg@jjr-f_l3lLpC^yvPi`(~HOIZwWsvqhoCVl&vuM2RV7&_fYTb^^&7bGnI+ zKSvlaAHN06M%mkL*`mc(=_BN_b*G{(i1B@zwS1h0hf$1Ig|Sz7Q&SbSi% zy-TI$7zT*mhzMH_Jgcrj*eOjIIMLwnVm+u$d0G`l`7T1^Bp#fEol=GVcAH%p@daVF z7pAi0s~>iVNnfblKiRdn%2LL~6Rd9TnmN6ux4npiA6vrb^Ihe$%(Vp3E$1`cAANsg zuG{eC+GW~u@u%mB=>XBH(Ax%HqLhepnBkbXi<^RVq^lR6kkDzz(V5O0snqGiJzPdG z+IRPbu2c?(;-~CPDlIM|&082^qbH98ywuR5x88~c-D3P-1b>@SJy()+HuZ=|&yKWB zkrDTnv9z+u$4%-Jt2B}Nu)t-`fj3T}Ywal#+$jL_O=Ps151%63qDh;A^d(KTPATx3 zw{Si)Gkzgfc_Vf!9nb3K6;rGY{Z0}8xb5iz5YSI!W#4W-7CCg`?(jh!&m7G*z2eDh z*-w($%{km$sGCE%7at13Phzq?-{jH&MjxQ#-<&b~e%pWb(Se-o!iGp5U!pK1EFsiC z$_7g9D60Cjv&>dZ3j~Q;yj?aQZcRDOol2~8!{F3w2V%`!P2=iDgA^=+dyQ&Ks$B#L zw>Swt^cP{PjWdY}vu&pbrxZZojo2J1@PA_|oBMB(iab)}YP&QWyrR|@CvU@2D`%nd z*3B-{^xJ6i^~w~p7oPtY-vreDlqh@P?zfi9RtCDG3=2`5A48e0!DVRmpM^i!KxHA~ z$mCKb?c|Bkjn%NBv&f6uE&fW*IXvO@KDI*>xTjGZ8gQP%wX?D+5DWFXU>(_{wem$Yn79AjAEh-SeWTh6Z93?A`k zVE3)4Y~ryVR40Zi99R@i(jngU{AS$@xXTKu%}t_J|DpQ1ZlAUz2qJs77O zgh+Oo%0dwKj=iaDXd%w*?M<(#j^{cSaEBgP%E&x8D&uNtkZXL`y)+>}{`9aTeq$|w zdiqzg6-=?xOlJ}f(cL3kA1WL2oC`}u{Q~eNl}Clq6)F~KFU#yA!->9vk1WB*g&Waw z@ac$grdVZ0?D`uoR(l&)^LurpkxE^`ebCgnYL^4(e+pPd!uJ{czNl8oPH&EOcbL;J zGPY@!GqiNG-xNe9UHbOYsAQ^{=$fZDAJ4Wg(tdhOf@q;hGGotyRDOzGpTPg~`TD_q zMyc-A2us4Pnjl%h8{c)$u+as}vDTAs8cGK(5bP;MN+BuLW!A>Q93GFFLpO+U2k-W} z_7E_HXZ}BGQV6Si!*stRqV8~rw9!`PYA-g~u!a_$Aacqr$H(V8Ig|W9lQTfpYp0=UG6&L@2BXI1Dpcd}cU_aZ zDE<#5G!XDZ(xNo3pIxG!SB_Y&S2HQ@t6=CVPUO4`z0oJ+Yj}k4C_DaVG~#b@7NE9Ch+jP8zuF>yHNmGXG%WpSRaD;U4SP;swpc+sCG9PjhF?Sp#EQ$bS{*&h5 zx|k4R&KkvE_FcZq;JBEBEf=hzH8Ud5&IL0BL_4q$5kih09w`peAcX&064W+j$Z`M` zzZ{fXeRJ-(o1H+(_o0^kpNAS4C+%;mB8H-dOq>=jHsO%BJ=(x#^i&O5sR4f&{$KoI zV1LxJgeE~uU;KrCV1a2I36V)YAsOVVZM3u99AW-D14?Cr&`2>KdDx z;y{*!kDnigGXjA8in>kOHv9HtZq(P`A0HD$bAE(xf!QQIrOI6wkL`hA|Gx9crSl!A#BVS)>|vSa{8dT_W4~}jmLc@&e$Dt zzqgzuP_LN4B2{L!W4 zVm>PC&bzrd5)M+~ZnQ+QuB@*&f&S=0!<`^?j?SZKc>A@@ana@0zA}1!(Nu_&ra+Ig z`H2vU$d1CNdN9`(o-Yk^kgnFz3NmwG@M|e^ihV3SM=s!}W$+%{$wk267eacH%vLdX z+@bz?IVvL+E)usFOl-PRhtMP{=7uHq-Q4p>U|hxCxPF@IThonS*S{26?{AF<@PK?- zwPK6c1<&u{SZcwJI)k-$%HbD_MI~p)>+7-U5k}-zn+roGFK-@VJ7p3mp!4Vk$ekOo zWtZp-K5{(YthWx~XIOZR)vfMp&PF$j(8ZD>AA|Y)SVvLhj%H(HV*&jW85fR7b}?7D zmSLsMx81KEWY=>p9$grI1<{{(x7=cK&t@8p_h{r!08!oC{|MlU2$9v|%F?X;Mh9`* zFhpinRw0Vd&{GxU#%h@#%J4l9#V%GMs%TPXb002W{0$ivTwkw5+-ApVi0AG$DGcmd zQ-7A%@Tw))m1UrinV7X|Y}`o>*J!Hpm?}t@;DKXr#-(7t@KvV&+rHFMH9KD96md47>L z$geEW6~lcfcH66Qlt=1ga99+N_a!oN^3|^M%e*snhhB|>7Th~y-(|x1%AnE?xuZYR z^(+cxX)1Z6S7@ovVb%Xia5?0P9J5+p9}yLr>pS65~NUzm{pwWU*|I7S1~{GkY9^I z%4N9UcQnZNiF%pMJNMO38uOpX;je;yYa2oOaKS;g$ipYB3X^19uFbo#YMGzTNQ^Qf zSA~nubUqF5R@xsuUYx>|rTL(YgX*LT+)cY9SjcU>?tx`fm?=~qd8y|1;!4{7F2;8= zn6L$O+g{6a-@wodgm;%Z7LVlXGOs5_2V7aAy>8m4eYe6(u$}KWbJ0S6?a%NU`U>nz z*Rv)F$YJ*h#xAnqzQ*L2u3(`s6|O8)tlT#!JBR#`u+Q2!6+MTIIoF}}%MT(xSood3 zO&^h*(4Rn)e{^zsdV`(Zdug;(j`z}CD~sH(TekZ;&wO1lK%JFXV;JTW>9Iza-P*Tv zp@_H59tVmF90Zii(2u4c{sv_~krw_*$u1(r;L*h~E&F%ni$!G(FyHd|R&COhx%P!G zJs&0HCYy=V9u^6#{OH?Gs7#)=h93xFslt{Y@1K|J7v#b{At2dq~K{q3ee8VX`4E9i2`4Hd72!Bw#nrKFZYd^6t@!hfWN z|2lH(2hvkBvUhay|4btPkxKsK$Univ2g@Hei_X%cJZm(-2wNBb`sr zYJr)svQ)Et+_vp;fX>6Zj+Ja~^-8N2+Ek^0Z>yvQz6jV%$CJWk@r_CEq@zWKY;Dk; z&BgaG9j?A~9%9Zvn!&+@f)>N6mD%VZKe#D=71Cir z+;>(!Cg(-XCFi9a%dPP6xCZTf_}I#16VGyMM+zH_80V{X4yC*DIr`5ck84EU7=Gz6 z(11Gm(75oL>4WgL1Q2V8IE1{K8?!+$lHnUYbIHmgE^8F2`5x@^SFlA8H7R*>tHS0T z^X_uMe$zufweP0$jrU|@XzR1{m43|n6IuCUNnjaCI<(lL3O=7`WIuj)=QLRM(6E>J zBwh_WXrG3#lkP|ogE6?dxj`;3F?OzJccljq=5mpSd5;oO9ob$3I}3U)mp1=SZVDqd z-$)GrjDp~tWbba2*Vi%In3up-JrdH3oa@V-+V}v|s&pOO2A5AlSf){aTT3F)qGLeT zg7$W{%%Ez>`0)I9m|;oXWXDvLH7faS)0eb>81IjFFleim&xj0=IdRdx$Pt_Gv)+03 zbQRG?)AG-xzbnX#6ECm!|5^qw$?r|=uf&-z&l;ckvSAlNtGXC9~{;7}N<3deJxOFXmhs;O&emg}@_l0gG(rERcAOuI{x-AU*R)p}252CyZ#X3XOg zR}09m4fcI~yMx>e#x+j@E3(o+#Y0>KHSo^-YJE*Jh(?>%zkR?t1+2XC>Zg{% zCnav& zkmX$yYf~0vxWL45pT8f8nEt$`olI17%vqEq(bZ`{Q zR@9Q`+9iG-1>b&jhsokWtalRH@zS$w1A5c%vt$WwOjVAIHfDa{phFO1;~GgJ>a)weE-mS4{szl+-xf{&!5 z>GjM>Gg8WMr)nHK$|^e6vh^ELX0}9palQK1Bmm>vg!$q^NVKY&+Jggr@& zk2n-`50*Mj{*GiME5uG3-yckeHHE{2g2&CnX#5_>$RUlONAuo3_YLC==zIF*M9yS- zkyNosY39b*##>G|lUK%>>NH@gv=xL0xqhr2LO(O-GCM#)VFE2e#^&v)#?ez_$1W?) zS}pBFRZD4eeO|L>AcZ?r`Oc_yOcQW)Xu>Mj)x$rQ`OIUul$Q9IJU3PL-2K+Fy7Ez# z5M%(9vHbEDd49KWn!lCw&bCBwAbQsXUTws$YJL=`$fFj9Y&b>xjl-)E5fSwQ*&Kej zbmKA6*1e2#b>E)f&xgR%Uoa&12dh>?TEsMOm zWEf!O+G1q7cJ?)x^$i7%$tW|M{#*dR22MNR9Qi>D>#QWNcvB$l3Wm?-qm247hOpzD zOcLqXu8Rnt&CyXSA7eY<$&_>7)ONd7nfF$9T6lK9Xt#NlcQjofbf!g=W20&qLR3ZUYU5F}f&}f9^%fOgCW>=x$6Bdhw!p zhNS1r#d$Y)(AF|fpZ|SV<>ajAPl*0Q;9W8tCQuIIL4>Hx=QrqB>zIv{yw7VIFiILS zKL0$DvXJf&5S<*pl1~|j-Zy<+EfDZ+cayO>Lg1k?4YC|3;Wqq0^{ecx?9M>!;eY$w6n;Y)a=ZE1U!Mu8-}M*#2->ztF&NkrlT7~a z4+K|ANE^=m4U`I`KO^B}8b0Jn@~=Jhy{R(1vQ&RG=^u4^$+ErgfOX%erK?#Z0e?Cg L`szihH-i2jG#BC* literal 0 HcmV?d00001 -- GitLab