# Copyright 2019 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
# Or at https://developers.google.com/open-source/licenses/bsd

# Use 'make help' for a list of commands.

OUTPUT_DIR := /tmp/monospam-local-training/
TIMESTAMP := $(shell date +%s)
MODEL_DIR := /tmp/monospam-local-training/export/Servo/{TIMESTAMP}/
SPAM_JOB_NAME := spam_trainer_$(TIMESTAMP)
COMP_JOB_NAME := comp_trainer_$(TIMESTAMP)

default: help

help:
	@echo "Available commands:"
	@sed -n '/^[a-zA-Z0-9_.]*:/s/:.*//p' <Makefile

train_local_spam:
	gcloud ai-platform local train \
		--package-path trainer/ \
		--module-name trainer.task \
		--job-dir $(OUTPUT_DIR) \
		-- \
		--train-steps 1000 \
		--verbosity DEBUG \
		--train-file $(TRAIN_FILE) \
		--trainer-type spam

train_local_spam_2:
	gcloud ai-platform local train \
		--package-path trainer2/ \
		--module-name trainer2.task \
		--job-dir $(OUTPUT_DIR) \
		-- \
		--train-steps 1000 \
		--verbosity DEBUG \
		--train-file $(TRAIN_FILE) \
		--trainer-type spam

predict_local_spam:
	./spam.py local-predict
	gcloud ai-platform local predict \
		--model-dir $(MODEL_DIR) \
		--json-instances /tmp/instances.json

train_from_prod_data_spam:
	gcloud ai-platform local train \
		--package-path trainer/ \
		--module-name trainer.task \
		--job-dir $(OUTPUT_DIR) \
		-- \
		--train-steps 1000 \
		--verbosity DEBUG \
		--gcs-bucket monorail-prod.appspot.com \
		--gcs-prefix spam_training_data \
		--trainer-type spam

train_from_prod_data_spam_2:
	gcloud ai-platform local train \
		--package-path trainer2/ \
		--module-name trainer2.task \
		--job-dir $(OUTPUT_DIR) \
		-- \
		--train-steps 1000 \
		--verbosity DEBUG \
		--gcs-bucket monorail-prod.appspot.com \
		--gcs-prefix spam_training_data \
		--trainer-type spam

submit_train_job_spam:
	@echo ${TIMESTAMP}
	gcloud ai-platform jobs submit training $(SPAM_JOB_NAME) \
		--package-path trainer/ \
		--module-name trainer.task \
		--runtime-version 1.2 \
		--job-dir gs://monorail-prod-mlengine/$(SPAM_JOB_NAME) \
		--region us-central1 \
		-- \
		--train-steps 1000 \
		--verbosity DEBUG \
		--gcs-bucket monorail-prod.appspot.com \
		--gcs-prefix spam_training_data \
		--trainer-type spam

submit_train_job_spam_2:
	@echo ${TIMESTAMP}
	gcloud ai-platform jobs submit training $(SPAM_JOB_NAME) \
		--package-path trainer2/ \
		--module-name trainer2.task \
		--runtime-version 2.1 \
		--python-version 3.7 \
		--job-dir gs://monorail-prod-mlengine/$(SPAM_JOB_NAME) \
		--region us-central1 \
		-- \
		--train-steps 1000 \
		--verbosity DEBUG \
		--gcs-bucket monorail-prod.appspot.com \
		--gcs-prefix spam_training_data \
		--trainer-type spam

# VERSION of format 'v_TIMESTAMP' should match TIMESTAMP in SPAM_JOB_NAME and MODEL_BINARIES.
upload_model_prod_spam:
ifndef MODEL_BINARIES
	$(error MODEL_BINARIES not set)
endif
ifndef VERSION
	$(error VERSION not set)
endif
	gsutil ls -r gs://monorail-prod-mlengine/$(SPAM_JOB_NAME)
	gcloud ai-platform versions create $(VERSION) \
		--model spam_only_words \
		--origin $(MODEL_BINARIES) \
		--runtime-version 1.2
	gcloud ai-platform versions set-default $(VERSION) --model spam_only_words

submit_pred_spam:
ifndef SUMMARY_PATH
	$(error SUMMARY_PATH not set)
endif
ifndef CONTENT_PATH
	$(error CONTENT_PATH not set)
endif
	./spam.py predict --summary $(SUMMARY_PATH) --content $(CONTENT_PATH)


train_from_prod_data_component:
	gcloud ai-platform local train \
		--package-path trainer/ \
		--module-name trainer.task \
		--job-dir $(OUTPUT_DIR) \
		-- \
		--train-steps 10000 \
		--eval-steps 1000 \
		--verbosity DEBUG \
		--gcs-bucket monorail-prod.appspot.com \
		--gcs-prefix component_training_data \
		--trainer-type component

submit_train_job_component:
	gcloud init
	gcloud ai-platform jobs submit training $(COMP_JOB_NAME) \
		--package-path trainer/ \
		--module-name trainer.task \
		--runtime-version 1.2 \
		--job-dir gs://monorail-prod-mlengine/$(COMP_JOB_NAME) \
		--region us-central1 \
		--scale-tier custom \
		--config config.json \
		-- \
		--train-steps 10000 \
		--eval-steps 1000 \
		--verbosity DEBUG \
		--gcs-bucket monorail-prod.appspot.com \
		--gcs-prefix component_training_data \
		--trainer-type component

submit_train_job_component_2:
	gcloud ai-platform jobs submit training $(COMP_JOB_NAME) \
		--package-path trainer2/ \
		--module-name trainer2.task \
		--runtime-version 2.1 \
		--python-version 3.7 \
		--job-dir gs://monorail-prod-mlengine/$(COMP_JOB_NAME) \
		--region us-central1 \
		--scale-tier custom \
		--master-machine-type n1-highmem-8 \
		-- \
		--train-steps 10000 \
		--eval-steps 1000 \
		--verbosity DEBUG \
		--gcs-bucket monorail-prod.appspot.com \
		--gcs-prefix component_training_data \
		--trainer-type component

# VERSION of format 'v_TIMESTAMP' should match TIMESTAMP in COMP_JOB_NAME and MODEL_BINARIES.
upload_model_prod_component:
ifndef MODEL_BINARIES
	$(error MODEL_BINARIES not set)
endif
ifndef VERSION
	$(error VERSION not set)
endif
	gsutil ls -r gs://monorail-prod-mlengine/$(COMP_JOB_NAME)
	gcloud ai-platform versions create $(VERSION) \
		--model component_top_words \
		--origin $(MODEL_BINARIES) \
		--runtime-version 1.2
	gcloud ai-platform versions set-default $(VERSION) --model component_top_words

submit_pred_component:
ifndef CONTENT_PATH
	$(error CONTENT_PATH not set)
endif
	./component.py --project monorail-prod --content $(CONTENT_PATH)


### Local Training in TF 2.0

tf2_train_local_spam:
ifndef TRAIN_FILE
	$(error TRAIN_FILE not set)
endif
	python3 ./trainer2/task.py \
		--train-file $(TRAIN_FILE) \
		--job-dir $(OUTPUT_DIR) \
		--train-steps 1000 \
		--verbosity DEBUG \
		--trainer-type spam

tf2_train_local_component:
ifndef TRAIN_FILE
	$(error TRAIN_FILE not set)
endif
	python3 ./trainer2/task.py \
		--train-file $(TRAIN_FILE) \
		--job-dir $(OUTPUT_DIR) \
		--train-steps 10000 \
		--eval-steps 1000 \
		--verbosity DEBUG \
		--trainer-type component
