(window.webpackJsonp=window.webpackJsonp||[]).push([[9],{144:function(e,t,n){"use strict";n.d(t,"a",(function(){return p})),n.d(t,"b",(function(){return m}));var r=n(0),o=n.n(r);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function c(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?i(Object(n),!0).forEach((function(t){a(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):i(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function s(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n,r,o={},a=Object.keys(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var b=o.a.createContext({}),l=function(e){var t=o.a.useContext(b),n=t;return e&&(n="function"==typeof e?e(t):c(c({},t),e)),n},p=function(e){var t=l(e.components);return o.a.createElement(b.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},d=o.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,i=e.parentName,b=s(e,["components","mdxType","originalType","parentName"]),p=l(n),d=r,m=p["".concat(i,".").concat(d)]||p[d]||u[d]||a;return n?o.a.createElement(m,c(c({ref:t},b),{},{components:n})):o.a.createElement(m,c({ref:t},b))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,i=new Array(a);i[0]=d;var c={};for(var s in t)hasOwnProperty.call(t,s)&&(c[s]=t[s]);c.originalType=e,c.mdxType="string"==typeof e?e:r,i[1]=c;for(var b=2;b<a;b++)i[b]=n[b];return o.a.createElement.apply(null,i)}return o.a.createElement.apply(null,n)}d.displayName="MDXCreateElement"},159:function(e,t,n){"use strict";n.r(t),t.default=n.p+"assets/images/tensorboard-experiment-page-bf5d5aad633d80ef059ce4b7e4d91db3.png"},160:function(e,t,n){"use strict";n.r(t),t.default=n.p+"assets/images/tensorboard-webpage-f8b9c5ceeb7b5ef535939ea22f680d96.png"},76:function(e,t,n){"use strict";n.r(t),n.d(t,"frontMatter",(function(){return i})),n.d(t,"metadata",(function(){return c})),n.d(t,"toc",(function(){return s})),n.d(t,"default",(function(){return l}));var r=n(3),o=n(7),a=(n(0),n(144)),i={title:"Tensorboard"},c={unversionedId:"userDocs/others/tensorboard",id:"userDocs/others/tensorboard",isDocsHomePage:!1,title:"Tensorboard",description:"\x3c!--",source:"@site/docs/userDocs/others/tensorboard.md",slug:"/userDocs/others/tensorboard",permalink:"/docs/userDocs/others/tensorboard",editUrl:"https://github.com/apache/submarine/edit/master/website/docs/userDocs/others/tensorboard.md",version:"current",sidebar:"docs",previous:{title:"MLflow UI",permalink:"/docs/userDocs/others/mlflow"},next:{title:"Running Submarine on YARN",permalink:"/docs/adminDocs/yarn/README"}},s=[{value:"Write to LogDirs by the environment variable",id:"write-to-logdirs-by-the-environment-variable",children:[{value:"Environment variable",id:"environment-variable",children:[]},{value:"Example",id:"example",children:[]}]},{value:"Connect to the tensorboard webpage",id:"connect-to-the-tensorboard-webpage",children:[]}],b={toc:s};function l(e){var t=e.components,i=Object(o.a)(e,["components"]);return Object(a.b)("wrapper",Object(r.a)({},b,i,{components:t,mdxType:"MDXLayout"}),Object(a.b)("h2",{id:"write-to-logdirs-by-the-environment-variable"},"Write to LogDirs by the environment variable"),Object(a.b)("h3",{id:"environment-variable"},"Environment variable"),Object(a.b)("ul",null,Object(a.b)("li",{parentName:"ul"},Object(a.b)("inlineCode",{parentName:"li"},"SUBMARINE_TENSORBOARD_LOG_DIR"),": Exist in every experiment container. You just need to direct your logs to ",Object(a.b)("inlineCode",{parentName:"li"},"$(SUBMARINE_TENSORBOARD_LOG_DIR)")," (",Object(a.b)("strong",{parentName:"li"},"NOTICE: it is ",Object(a.b)("inlineCode",{parentName:"strong"},"()")," not ",Object(a.b)("inlineCode",{parentName:"strong"},"{}")),"), and you can inspect the process on the tensorboard webpage.")),Object(a.b)("h3",{id:"example"},"Example"),Object(a.b)("pre",null,Object(a.b)("code",{parentName:"pre"},'{\n  "meta": {\n    "name": "tensorflow-tensorboard-dist-mnist",\n    "namespace": "default",\n    "framework": "TensorFlow",\n    "cmd": "python /var/tf_mnist/mnist_with_summaries.py --log_dir=$(SUBMARINE_TENSORBOARD_LOG_DIR) --learning_rate=0.01 --batch_size=20",\n    "envVars": {\n      "ENV_1": "ENV1"\n    }\n  },\n  "environment": {\n    "image": "apache/submarine:tf-mnist-with-summaries-1.0"\n  },\n  "spec": {\n    "Worker": {\n      "replicas": 1,\n      "resources": "cpu=1,memory=512M"\n    }\n  }\n}\n\n')),Object(a.b)("h2",{id:"connect-to-the-tensorboard-webpage"},"Connect to the tensorboard webpage"),Object(a.b)("ol",null,Object(a.b)("li",{parentName:"ol"},"Open the experiment page in the workbench, and Click the ",Object(a.b)("inlineCode",{parentName:"li"},"TensorBoard")," button.")),Object(a.b)("p",null,Object(a.b)("img",{src:n(159).default})),Object(a.b)("ol",{start:2},Object(a.b)("li",{parentName:"ol"},"Inspect the process on tensorboard page.")),Object(a.b)("p",null,Object(a.b)("img",{src:n(160).default})))}l.isMDXComponent=!0}}]);