19742a2ed4e1e2015334d53dc2824c82812ad21e8A. Unique TensorFlower#!/usr/bin/python
20a0e72b13e0bbe0d935b7fcef07a95949d7fd2e5A. Unique TensorFlower# Copyright 2016 The TensorFlow Authors. All Rights Reserved.
39742a2ed4e1e2015334d53dc2824c82812ad21e8A. Unique TensorFlower#
49742a2ed4e1e2015334d53dc2824c82812ad21e8A. Unique TensorFlower# Licensed under the Apache License, Version 2.0 (the "License");
59742a2ed4e1e2015334d53dc2824c82812ad21e8A. Unique TensorFlower# you may not use this file except in compliance with the License.
69742a2ed4e1e2015334d53dc2824c82812ad21e8A. Unique TensorFlower# You may obtain a copy of the License at
79742a2ed4e1e2015334d53dc2824c82812ad21e8A. Unique TensorFlower#
89742a2ed4e1e2015334d53dc2824c82812ad21e8A. Unique TensorFlower#     http://www.apache.org/licenses/LICENSE-2.0
99742a2ed4e1e2015334d53dc2824c82812ad21e8A. Unique TensorFlower#
109742a2ed4e1e2015334d53dc2824c82812ad21e8A. Unique TensorFlower# Unless required by applicable law or agreed to in writing, software
119742a2ed4e1e2015334d53dc2824c82812ad21e8A. Unique TensorFlower# distributed under the License is distributed on an "AS IS" BASIS,
129742a2ed4e1e2015334d53dc2824c82812ad21e8A. Unique TensorFlower# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139742a2ed4e1e2015334d53dc2824c82812ad21e8A. Unique TensorFlower# See the License for the specific language governing permissions and
149742a2ed4e1e2015334d53dc2824c82812ad21e8A. Unique TensorFlower# limitations under the License.
159742a2ed4e1e2015334d53dc2824c82812ad21e8A. Unique TensorFlower# ==============================================================================
169742a2ed4e1e2015334d53dc2824c82812ad21e8A. Unique TensorFlower
17c87a7ca3113c95aaf52de7a094773feb2dba2fa1Vijay Vasudevan"""Generates YAML configuration files for distributed TensorFlow workers.
189742a2ed4e1e2015334d53dc2824c82812ad21e8A. Unique TensorFlower
199742a2ed4e1e2015334d53dc2824c82812ad21e8A. Unique TensorFlowerThe workers will be run in a Kubernetes (k8s) container cluster.
209742a2ed4e1e2015334d53dc2824c82812ad21e8A. Unique TensorFlower"""
219742a2ed4e1e2015334d53dc2824c82812ad21e8A. Unique TensorFlowerfrom __future__ import absolute_import
229742a2ed4e1e2015334d53dc2824c82812ad21e8A. Unique TensorFlowerfrom __future__ import division
239742a2ed4e1e2015334d53dc2824c82812ad21e8A. Unique TensorFlowerfrom __future__ import print_function
249742a2ed4e1e2015334d53dc2824c82812ad21e8A. Unique TensorFlower
259742a2ed4e1e2015334d53dc2824c82812ad21e8A. Unique TensorFlowerimport argparse
269742a2ed4e1e2015334d53dc2824c82812ad21e8A. Unique TensorFlowerimport sys
279742a2ed4e1e2015334d53dc2824c82812ad21e8A. Unique TensorFlower
28b06281ba47595d07f58766d6477f896e39eb8a5eA. Unique TensorFlowerimport k8s_tensorflow_lib
29b06281ba47595d07f58766d6477f896e39eb8a5eA. Unique TensorFlower
309742a2ed4e1e2015334d53dc2824c82812ad21e8A. Unique TensorFlower# Note: It is intentional that we do not import tensorflow in this script. The
319742a2ed4e1e2015334d53dc2824c82812ad21e8A. Unique TensorFlower# machine that launches a TensorFlow k8s cluster does not have to have the
329742a2ed4e1e2015334d53dc2824c82812ad21e8A. Unique TensorFlower# Python package of TensorFlow installed on it.
339742a2ed4e1e2015334d53dc2824c82812ad21e8A. Unique TensorFlower
349742a2ed4e1e2015334d53dc2824c82812ad21e8A. Unique TensorFlower
359742a2ed4e1e2015334d53dc2824c82812ad21e8A. Unique TensorFlowerDEFAULT_DOCKER_IMAGE = 'tensorflow/tf_grpc_test_server'
369742a2ed4e1e2015334d53dc2824c82812ad21e8A. Unique TensorFlowerDEFAULT_PORT = 2222
379742a2ed4e1e2015334d53dc2824c82812ad21e8A. Unique TensorFlower
389742a2ed4e1e2015334d53dc2824c82812ad21e8A. Unique TensorFlower
399742a2ed4e1e2015334d53dc2824c82812ad21e8A. Unique TensorFlowerdef main():
409742a2ed4e1e2015334d53dc2824c82812ad21e8A. Unique TensorFlower  """Do arg parsing."""
419742a2ed4e1e2015334d53dc2824c82812ad21e8A. Unique TensorFlower  parser = argparse.ArgumentParser()
429a88bff7589801727a1649a330fbb70321b04998A. Unique TensorFlower  parser.register(
439a88bff7589801727a1649a330fbb70321b04998A. Unique TensorFlower      'type', 'bool', lambda v: v.lower() in ('true', 't', 'y', 'yes'))
449742a2ed4e1e2015334d53dc2824c82812ad21e8A. Unique TensorFlower  parser.add_argument('--num_workers',
459742a2ed4e1e2015334d53dc2824c82812ad21e8A. Unique TensorFlower                      type=int,
469742a2ed4e1e2015334d53dc2824c82812ad21e8A. Unique TensorFlower                      default=2,
479742a2ed4e1e2015334d53dc2824c82812ad21e8A. Unique TensorFlower                      help='How many worker pods to run')
489742a2ed4e1e2015334d53dc2824c82812ad21e8A. Unique TensorFlower  parser.add_argument('--num_parameter_servers',
499742a2ed4e1e2015334d53dc2824c82812ad21e8A. Unique TensorFlower                      type=int,
509742a2ed4e1e2015334d53dc2824c82812ad21e8A. Unique TensorFlower                      default=1,
519742a2ed4e1e2015334d53dc2824c82812ad21e8A. Unique TensorFlower                      help='How many paramater server pods to run')
529742a2ed4e1e2015334d53dc2824c82812ad21e8A. Unique TensorFlower  parser.add_argument('--grpc_port',
539742a2ed4e1e2015334d53dc2824c82812ad21e8A. Unique TensorFlower                      type=int,
549742a2ed4e1e2015334d53dc2824c82812ad21e8A. Unique TensorFlower                      default=DEFAULT_PORT,
559742a2ed4e1e2015334d53dc2824c82812ad21e8A. Unique TensorFlower                      help='GRPC server port (Default: %d)' % DEFAULT_PORT)
569742a2ed4e1e2015334d53dc2824c82812ad21e8A. Unique TensorFlower  parser.add_argument('--request_load_balancer',
579a88bff7589801727a1649a330fbb70321b04998A. Unique TensorFlower                      type='bool',
589742a2ed4e1e2015334d53dc2824c82812ad21e8A. Unique TensorFlower                      default=False,
599742a2ed4e1e2015334d53dc2824c82812ad21e8A. Unique TensorFlower                      help='To request worker0 to be exposed on a public IP '
609742a2ed4e1e2015334d53dc2824c82812ad21e8A. Unique TensorFlower                      'address via an external load balancer, enabling you to '
619742a2ed4e1e2015334d53dc2824c82812ad21e8A. Unique TensorFlower                      'run client processes from outside the cluster')
629742a2ed4e1e2015334d53dc2824c82812ad21e8A. Unique TensorFlower  parser.add_argument('--docker_image',
639742a2ed4e1e2015334d53dc2824c82812ad21e8A. Unique TensorFlower                      type=str,
649742a2ed4e1e2015334d53dc2824c82812ad21e8A. Unique TensorFlower                      default=DEFAULT_DOCKER_IMAGE,
659742a2ed4e1e2015334d53dc2824c82812ad21e8A. Unique TensorFlower                      help='Override default docker image for the TensorFlow '
669742a2ed4e1e2015334d53dc2824c82812ad21e8A. Unique TensorFlower                      'GRPC server')
679a88bff7589801727a1649a330fbb70321b04998A. Unique TensorFlower  parser.add_argument('--name_prefix',
689a88bff7589801727a1649a330fbb70321b04998A. Unique TensorFlower                      type=str,
699a88bff7589801727a1649a330fbb70321b04998A. Unique TensorFlower                      default='tf',
709a88bff7589801727a1649a330fbb70321b04998A. Unique TensorFlower                      help='Prefix for job names. Jobs will be named as '
719a88bff7589801727a1649a330fbb70321b04998A. Unique TensorFlower                      '<name_prefix>_worker|ps<task_id>')
729a88bff7589801727a1649a330fbb70321b04998A. Unique TensorFlower  parser.add_argument('--use_shared_volume',
739a88bff7589801727a1649a330fbb70321b04998A. Unique TensorFlower                      type='bool',
749a88bff7589801727a1649a330fbb70321b04998A. Unique TensorFlower                      default=True,
759a88bff7589801727a1649a330fbb70321b04998A. Unique TensorFlower                      help='Whether to mount /shared directory from host to '
769a88bff7589801727a1649a330fbb70321b04998A. Unique TensorFlower                      'the pod')
779742a2ed4e1e2015334d53dc2824c82812ad21e8A. Unique TensorFlower  args = parser.parse_args()
789742a2ed4e1e2015334d53dc2824c82812ad21e8A. Unique TensorFlower
799742a2ed4e1e2015334d53dc2824c82812ad21e8A. Unique TensorFlower  if args.num_workers <= 0:
809742a2ed4e1e2015334d53dc2824c82812ad21e8A. Unique TensorFlower    sys.stderr.write('--num_workers must be greater than 0; received %d\n'
819742a2ed4e1e2015334d53dc2824c82812ad21e8A. Unique TensorFlower                     % args.num_workers)
829742a2ed4e1e2015334d53dc2824c82812ad21e8A. Unique TensorFlower    sys.exit(1)
839742a2ed4e1e2015334d53dc2824c82812ad21e8A. Unique TensorFlower  if args.num_parameter_servers <= 0:
849742a2ed4e1e2015334d53dc2824c82812ad21e8A. Unique TensorFlower    sys.stderr.write(
859742a2ed4e1e2015334d53dc2824c82812ad21e8A. Unique TensorFlower        '--num_parameter_servers must be greater than 0; received %d\n'
869742a2ed4e1e2015334d53dc2824c82812ad21e8A. Unique TensorFlower        % args.num_parameter_servers)
879742a2ed4e1e2015334d53dc2824c82812ad21e8A. Unique TensorFlower    sys.exit(1)
889742a2ed4e1e2015334d53dc2824c82812ad21e8A. Unique TensorFlower
899742a2ed4e1e2015334d53dc2824c82812ad21e8A. Unique TensorFlower  # Generate contents of yaml config
90b06281ba47595d07f58766d6477f896e39eb8a5eA. Unique TensorFlower  yaml_config = k8s_tensorflow_lib.GenerateConfig(
91b06281ba47595d07f58766d6477f896e39eb8a5eA. Unique TensorFlower      args.num_workers,
92b06281ba47595d07f58766d6477f896e39eb8a5eA. Unique TensorFlower      args.num_parameter_servers,
93b06281ba47595d07f58766d6477f896e39eb8a5eA. Unique TensorFlower      args.grpc_port,
94b06281ba47595d07f58766d6477f896e39eb8a5eA. Unique TensorFlower      args.request_load_balancer,
95b06281ba47595d07f58766d6477f896e39eb8a5eA. Unique TensorFlower      args.docker_image,
96b06281ba47595d07f58766d6477f896e39eb8a5eA. Unique TensorFlower      args.name_prefix,
97b06281ba47595d07f58766d6477f896e39eb8a5eA. Unique TensorFlower      env_vars=None,
98b06281ba47595d07f58766d6477f896e39eb8a5eA. Unique TensorFlower      use_shared_volume=args.use_shared_volume)
999742a2ed4e1e2015334d53dc2824c82812ad21e8A. Unique TensorFlower  print(yaml_config)  # pylint: disable=superfluous-parens
1009742a2ed4e1e2015334d53dc2824c82812ad21e8A. Unique TensorFlower
1019742a2ed4e1e2015334d53dc2824c82812ad21e8A. Unique TensorFlower
1029742a2ed4e1e2015334d53dc2824c82812ad21e8A. Unique TensorFlowerif __name__ == '__main__':
1039742a2ed4e1e2015334d53dc2824c82812ad21e8A. Unique TensorFlower  main()
104