From e2376568ed7dc5d08af34f289dad6ba30057e93b Mon Sep 17 00:00:00 2001 From: Henryk Krzysztof Blasinski <hblasins@stanford.edu> Date: Sat, 5 Aug 2017 18:44:28 -0700 Subject: [PATCH] Added cloud renderer initialization. --- .../Renderers/PBRT/RtbPBRTCloudRenderer.m | 11 +++ Utilities/rtbCloudInit.m | 75 +++++++++++++++++++ Utilities/rtbCloudUpload.m | 2 +- 3 files changed, 87 insertions(+), 1 deletion(-) create mode 100644 Utilities/rtbCloudInit.m diff --git a/BatchRenderer/Renderers/PBRT/RtbPBRTCloudRenderer.m b/BatchRenderer/Renderers/PBRT/RtbPBRTCloudRenderer.m index 59227c2..8853203 100644 --- a/BatchRenderer/Renderers/PBRT/RtbPBRTCloudRenderer.m +++ b/BatchRenderer/Renderers/PBRT/RtbPBRTCloudRenderer.m @@ -24,6 +24,17 @@ classdef RtbPBRTCloudRenderer < RtbRenderer % where to put scenes before rendering workingFolder; + + % Variables specific to cloud provider + provider = 'Google'; + clusterName = 'rtb4'; + zone = 'us-central1-a'; + instanceType = 'n1-highcpu-32'; + minInstances = 1; + maxInstances = 10; + preemptible = true; + autoscaling = true; + end methods diff --git a/Utilities/rtbCloudInit.m b/Utilities/rtbCloudInit.m new file mode 100644 index 0000000..56fe045 --- /dev/null +++ b/Utilities/rtbCloudInit.m @@ -0,0 +1,75 @@ +function rtbCloudInit( hints ) + +% This function sets up the Container engine on google cloud. +% We assume that you have goocle cloud SDK installed on your system and +% that you have set up the sdk by running: +% +% gcloud init +% +% + +if strcmp(hints.renderer,'PBRTCloud') == 0 + return; +end + +if ~strcmpi(hints.batchRenderStrategy.renderer.provider,'google') + error('Only Google Cloud is supported\n'); +end + +% First we set up a container cluster +% This command sets up a cluster of high-cpu, 32 core, preemptible machines +% Autoscaling is enabled so if you aren't using all the resources the +% unnecessary machines are killed (to save you money). + + +clusterName = hints.batchRenderStrategy.renderer.clusterName; +timeZone = hints.batchRenderStrategy.renderer.zone; + +cmd = sprintf('gcloud container clusters list --filter=%s',clusterName); +[~, result] = system(cmd); + +if isempty(result) + % we need to create a new cluster + instanceType = hints.batchRenderStrategy.renderer.instanceyType; + + cmd = sprintf('gcloud container clusters create %s --num-nodes=1 --max-nodes-per-pool=100 --machine-type=%s --zone=%s',... + clusterName, instanceType, timeZone); + + if hints.batchRenderStrategy.renderer.preemptible, + cmd = sprintf('%s --preemptible',cmd); + end + + minNodes = hints.batchRenderStrategy.renderer.minNodes; + maxNodes = hints.batchRenderStrategy.renderer.maxNodes; + + if hints.batchRenderStrategy.renderer.autoscaling, + cmd = sprintf('%s --enable-autoscaling --min-nodes=%i --max-nodes==%i',... + cmd, minNodes, maxNodes); + end + system(cmd) +end + +% Once the container cluster is created one neds to get credentials, so +% that kubectl comands are executed on that particualr cluster. +cmd = sprintf('gcloud container clusters get-credentials %s --zone=%s',... + clusterName,timeZone); +system(cmd); + + +% A cleanup-job +% The Container Cluster stores the completed jobs, and they use up +% resources (disk space, memory). We are going to run a simple service that +% periodically lists all succesfully completed jobs and removes them from +% the engine. + +cmd = 'kubectl get jobs | grep cleanup'; +[~, result] = system(cmd); + +if isempty(result) + cmd = 'kubectl run cleanup --restart=OnFailure --image=google/cloud-sdk -- /bin/bash -c ''while true; do echo "Starting"; kubectl delete jobs $(kubectl get jobs | awk ''"''"''$3=="1" {print $1}''"''"''); echo "Deleted jobs"; sleep 600; done'''; + system(cmd); +end + + +end + diff --git a/Utilities/rtbCloudUpload.m b/Utilities/rtbCloudUpload.m index b1afaf9..cf20f43 100644 --- a/Utilities/rtbCloudUpload.m +++ b/Utilities/rtbCloudUpload.m @@ -17,7 +17,7 @@ allFilesAndFolders = sprintf('%s ./resources ./scenes',allFiles); currentPath = pwd; cd(hints.batchRenderStrategy.renderer.workingFolder); -cmd = sprintf('zip -r %s/%s %s',hints.batchRenderStrategy.renderer.workingFolder,fileName,allFilesAndFolders); +cmd = sprintf('zip -r %s/%s %s -x *.jpg *.png',hints.batchRenderStrategy.renderer.workingFolder,fileName,allFilesAndFolders); system(cmd); cd(currentPath); -- GitLab