From b7e4b2ddc5db6c3fcea711748a62dd32cc7a17c7 Mon Sep 17 00:00:00 2001 From: Yancey1989 Date: Fri, 12 May 2017 13:42:39 +0800 Subject: [PATCH] submit job design doc --- .../cluster_train/src/submit-job.graffle | Bin 0 -> 3931 bytes doc/design/cluster_train/src/submit-job.png | Bin 0 -> 52772 bytes doc/design/cluster_train/submit-job.md | 127 ++++++++++++++++++ 3 files changed, 127 insertions(+) create mode 100644 doc/design/cluster_train/src/submit-job.graffle create mode 100644 doc/design/cluster_train/src/submit-job.png create mode 100644 doc/design/cluster_train/submit-job.md diff --git a/doc/design/cluster_train/src/submit-job.graffle b/doc/design/cluster_train/src/submit-job.graffle new file mode 100644 index 0000000000000000000000000000000000000000..677cdfb6d9a32168bf71729eb841fa1ca0dd31d6 GIT binary patch literal 3931 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 + +- `paddle.job.dist_train()` will call the Job Server API `/v1/packages` to upload the trainer package and save them on CephFS, and then call `/v1/trainer/job` to submit the PaddlePaddle distributed job. +- `/v1/trainer/job` will start a building job for preparing the runtime Docker image. When the building job is finished, Job Server will submit the PaddlePaddle distributed job to Kubernetes. +- *NOTE*: For the first version, we will not prepare the runtime Docker image, instead, the package is uploaded to Paddle Cloud, and Paddle Cloud will mount the package in a temporary folder into the base Docker image. We will not support custom Python dependencies in the first version as well. + +You can call `paddle.job.dist_train` and provide distributed training configuration as the parameters: +```python +paddle.job.dist_train( + trainer=dist_trainer(), + paddle_job=PaddleJob( + job_name = "paddle-cloud", + entry_point = "python %s"%__file__, + trainer_package = "/example/word2vec", + image = "yancey1989/paddle-job", + trainers = 10, + pservers = 3, + trainer_cpu = 1, + trainer_gpu = 1, + trainer_mem = "10G", + pserver_cpu = 1, + pserver_mem = "2G" + )) +``` + +The parameter `trainer` of `paddle.job.dist_train` is a function and you can implement it as follows: +```python +def dist_trainer(): + def trainer_creator(): + trainer = paddle.v2.trainer.SGD(...) + trainer.train(...) + return trainer_creator +``` + +The pseudo code of `paddle.job.dist_train` is as follows: +```python +def dist_train(trainer, paddle_job): + # if the code is running on cloud, set PADDLE_ON_CLOUD=YES + if os.getenv("RUNNING_ON_CLOUD", "NO") == "NO": + #submit the paddle job + paddle_job.submit() + else: + #start the training + trainer() +``` +### PaddleJob Parameters +parameter | type | explanation + --- | --- | --- +job_name | str | the unique name for the training job +entry_point | str | entry point for startup trainer process +trainer_package | str | trainer package file path which user have the access right +image|str|the [base image](#base-docker-image) for building the [runtime image](#runtime-docker-image) +pservers|int| Parameter Server process count +trainers|int| Trainer process count +pserver_cpu|int| CPU count for each Parameter Server process +pserver_mem|str| memory allocated for each Parameter Server process, a plain integer using one of these suffixes: E, P, T, G, M, K +trainer_cpu|int| CPU count for each Trainer process +trainer_mem|str| memory allocated for each Trainer process, a plain integer using one of these suffixes: E, P, T, G, M, K +trainer_gpu|int| GPU count for each Trainer process, if you only want CPU, do not set this parameter + +### Deploy Parameter Server, Trainer and Master Process + - Deploy PaddlePaddle Parameter Server processes, it's a Kubernetes ReplicaSet. + - Deploy PaddlePaddle Trainer processes, it's a Kubernetes Job. + - Deploy PaddlePaddle Master processes, it's a Kubernetes ReplicaSet. + +## Job Server + +- RESTful API + + Job server provides RESTful HTTP API for receiving the trainer package and displaying + PaddlePaddle job related informations. + - `POST /v1/package` receive the trainer package and save them on CephFS + - `POST /v1/trainer/job` submit a trainer job + - `GET /v1/jobs/` list all jobs + - `GET /v1/jobs/` the status of a job + - `DELETE /v1/jobs/` delete a job + - `GET /v1/version` job server version + +- Build Runtime Docker Image on Kubernetes + + `paddle.job.dist_train` will upload the trainer package to Job Server, save them on the distributed filesystem, and then start up a job for building the runtime Docker image that gets scheduled by Kubernetes to run during training. + + There are some benefits for building runtime Docker image on JobServer: + - On Paddle Cloud, users will run the trainer code in a Jupyter Notebook which is a Kubernetes Pod, if we want to execute `docker build` in the Pod, we should mount the host's `docker.sock` to the Pod, user's code will connect the host's Docker Engine directly, it's not safe. + - Users only need to upload the training package files, does not need to install docker engine, docker registry as dependencies. + - If we want to change another image type, such as RKT, users do not need to care about it. + +- Deploy Parameter Server, Trainer and Master Processes + + `POST /v1/trainer/job` receives the distributed training parameters, and deploy the job as follows: + - Deploy PaddlePaddle Parameter Server processes, it's a Kubernetes ReplicaSet. + - Deploy PaddlePaddle Trainer processes, it's a Kubernetes Job. + - Deploy PaddlePaddle Master processes, it's a Kubernetes ReplicaSet. -- GitLab