(window.webpackJsonp=window.webpackJsonp||[]).push([[8],{193:function(e,t,r){"use strict";r.d(t,"a",(function(){return p})),r.d(t,"b",(function(){return d}));var n=r(0),o=r.n(n);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function l(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?i(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):i(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function c(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},a=Object.keys(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var s=o.a.createContext({}),u=function(e){var t=o.a.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},p=function(e){var t=u(e.components);return o.a.createElement(s.Provider,{value:t},e.children)},m={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},f=o.a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,a=e.originalType,i=e.parentName,s=c(e,["components","mdxType","originalType","parentName"]),p=u(r),f=n,d=p["".concat(i,".").concat(f)]||p[f]||m[f]||a;return r?o.a.createElement(d,l(l({ref:t},s),{},{components:r})):o.a.createElement(d,l({ref:t},s))}));function d(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var a=r.length,i=new Array(a);i[0]=f;var l={};for(var c in t)hasOwnProperty.call(t,c)&&(l[c]=t[c]);l.originalType=e,l.mdxType="string"==typeof e?e:n,i[1]=l;for(var s=2;s<a;s++)i[s]=r[s];return o.a.createElement.apply(null,i)}return o.a.createElement.apply(null,r)}f.displayName="MDXCreateElement"},210:function(e,t,r){"use strict";r.r(t),t.default=r.p+"assets/images/mlflow-ui-e2fbae31ba60c324e66f00f0ae3caebf.png"},73:function(e,t,r){"use strict";r.r(t),r.d(t,"frontMatter",(function(){return i})),r.d(t,"metadata",(function(){return l})),r.d(t,"toc",(function(){return c})),r.d(t,"default",(function(){return u}));var n=r(3),o=r(7),a=(r(0),r(193)),i={title:"MLflow UI"},l={unversionedId:"userDocs/others/mlflow",id:"version-0.6.0/userDocs/others/mlflow",isDocsHomePage:!1,title:"MLflow UI",description:"\x3c!--",source:"@site/versioned_docs/version-0.6.0/userDocs/others/mlflow.md",slug:"/userDocs/others/mlflow",permalink:"/docs/userDocs/others/mlflow",editUrl:"https://github.com/apache/submarine/edit/master/website/versioned_docs/version-0.6.0/userDocs/others/mlflow.md",version:"0.6.0",sidebar:"docs",previous:{title:"Building Submarine Spark Security Plugin",permalink:"/docs/userDocs/submarine-security/spark-security/build-submarine-spark-security-plugin"},next:{title:"Tensorboard",permalink:"/docs/userDocs/others/tensorboard"}},c=[{value:"Usage",id:"usage",children:[]},{value:"Example",id:"example",children:[]}],s={toc:c};function u(e){var t=e.components,i=Object(o.a)(e,["components"]);return Object(a.b)("wrapper",Object(n.a)({},s,i,{components:t,mdxType:"MDXLayout"}),Object(a.b)("h3",{id:"usage"},"Usage"),Object(a.b)("p",null,"MLflow UI shows the tracking result of the experiments. When we\nuse the log_param or log_metric in ModelClient API, we could view\nthe result in MLflow UI. Below is the example of the usage of MLflow\nUI."),Object(a.b)("h3",{id:"example"},"Example"),Object(a.b)("ol",null,Object(a.b)("li",{parentName:"ol"},"Run the following code in the cluster")),Object(a.b)("pre",null,Object(a.b)("code",{parentName:"pre",className:"language-python"},'from submarine import ModelsClient\nimport random\nimport time\n\nif __name__ == "__main__":\n  modelClient = ModelsClient()\n  with modelClient.start() as run:\n      modelClient.log_param("learning_rate", random.random())\n      for i in range(100):\n        time.sleep(1)\n        modelClient.log_metric("mse", random.random() * 100, i)\n        modelClient.log_metric("acc", random.random(), i)\n')),Object(a.b)("ol",{start:2},Object(a.b)("li",{parentName:"ol"},"In the MLflow UI page, you can see the log_param and the log_metric\nresult. You can also compare the training between different workers.")),Object(a.b)("p",null,Object(a.b)("img",{src:r(210).default})))}u.isMDXComponent=!0}}]);