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