(window.webpackJsonp=window.webpackJsonp||[]).push([[51],{118:function(e,n,r){"use strict";r.r(n),r.d(n,"frontMatter",(function(){return o})),r.d(n,"metadata",(function(){return i})),r.d(n,"toc",(function(){return c})),r.d(n,"default",(function(){return m}));var t=r(3),a=r(7),s=(r(0),r(136)),o={title:"Run TensorFlow Experiment Guide (REST)"},i={unversionedId:"userDocs/k8s/run-tensorflow-experiment-rest",id:"userDocs/k8s/run-tensorflow-experiment-rest",isDocsHomePage:!1,title:"Run TensorFlow Experiment Guide (REST)",description:"\x3c!--",source:"@site/docs/userDocs/k8s/run-tensorflow-experiment-rest.md",slug:"/userDocs/k8s/run-tensorflow-experiment-rest",permalink:"/docs/userDocs/k8s/run-tensorflow-experiment-rest",editUrl:"https://github.com/apache/submarine/edit/master/website/docs/userDocs/k8s/run-tensorflow-experiment-rest.md",version:"current",sidebar:"docs",previous:{title:"Run PyTorch Experiment Guide (REST)",permalink:"/docs/userDocs/k8s/run-pytorch-experiment-rest"},next:{title:"YARN Runtime Quick Start Guide",permalink:"/docs/userDocs/yarn/YARNRuntimeGuide"}},c=[{value:"Experiment Spec",id:"experiment-spec",children:[]},{value:"Create Experiment by REST API",id:"create-experiment-by-rest-api",children:[]}],p={toc:c};function m(e){var n=e.components,r=Object(a.a)(e,["components"]);return Object(s.b)("wrapper",Object(t.a)({},p,r,{components:n,mdxType:"MDXLayout"}),Object(s.b)("h2",{id:"experiment-spec"},"Experiment Spec"),Object(s.b)("p",null,"The experiment is represented in ",Object(s.b)("a",{parentName:"p",href:"https://www.json.org"},"JSON")," or ",Object(s.b)("a",{parentName:"p",href:"https://yaml.org"},"YAML")," format."),Object(s.b)("p",null,Object(s.b)("strong",{parentName:"p"},"YAML Format:")),Object(s.b)("pre",null,Object(s.b)("code",{parentName:"pre",className:"language-yaml"},'meta:\n  name: "tf-mnist-yaml"\n  namespace: "default"\n  framework: "TensorFlow"\n  cmd: "python /var/tf_mnist/mnist_with_summaries.py --log_dir=/train/log --learning_rate=0.01 --batch_size=150"\n  envVars:\n    ENV_1: "ENV1"\nenvironment:\n  image: "apache/submarine:tf-mnist-with-summaries-1.0"\nspec:\n  Ps:\n    replicas: 1\n    resources: "cpu=1,memory=1024M"\n  Worker:\n    replicas: 1\n    resources: "cpu=1,memory=1024M"\n')),Object(s.b)("p",null,Object(s.b)("strong",{parentName:"p"},"JSON Format:")),Object(s.b)("pre",null,Object(s.b)("code",{parentName:"pre",className:"language-json"},'{\n  "meta": {\n    "name": "tf-mnist-json",\n    "namespace": "default",\n    "framework": "TensorFlow",\n    "cmd": "python /var/tf_mnist/mnist_with_summaries.py --log_dir=/train/log --learning_rate=0.01 --batch_size=150",\n    "envVars": {\n      "ENV_1": "ENV1"\n    }\n  },\n  "environment": {\n    "image": "apache/submarine:tf-mnist-with-summaries-1.0"\n  },\n  "spec": {\n    "Ps": {\n      "replicas": 1,\n      "resources": "cpu=1,memory=1024M"\n    },\n    "Worker": {\n      "replicas": 1,\n      "resources": "cpu=1,memory=1024M"\n    }\n  }\n}\n')),Object(s.b)("h2",{id:"create-experiment-by-rest-api"},"Create Experiment by REST API"),Object(s.b)("p",null,Object(s.b)("inlineCode",{parentName:"p"},"POST /api/v1/experiment")),Object(s.b)("p",null,Object(s.b)("strong",{parentName:"p"},"Example Request")),Object(s.b)("pre",null,Object(s.b)("code",{parentName:"pre",className:"language-sh"},'curl -X POST -H "Content-Type: application/json" -d \'\n{\n  "meta": {\n    "name": "tf-mnist-json",\n    "namespace": "default",\n    "framework": "TensorFlow",\n    "cmd": "python /var/tf_mnist/mnist_with_summaries.py --log_dir=/train/log --learning_rate=0.01 --batch_size=150",\n    "envVars": {\n      "ENV_1": "ENV1"\n    }\n  },\n  "environment": {\n    "image": "apache/submarine:tf-mnist-with-summaries-1.0"\n  },\n  "spec": {\n    "Ps": {\n      "replicas": 1,\n      "resources": "cpu=1,memory=1024M"\n    },\n    "Worker": {\n      "replicas": 1,\n      "resources": "cpu=1,memory=1024M"\n    }\n  }\n}\n\' http://127.0.0.1:32080/api/v1/experiment\n')),Object(s.b)("p",null,Object(s.b)("strong",{parentName:"p"},"Example Response:")),Object(s.b)("pre",null,Object(s.b)("code",{parentName:"pre",className:"language-json"},'{\n    "status": "OK",\n    "code": 200,\n    "result": {\n        "experimentId": "experiment_1592057447228_0001",\n        "name": "tf-mnist-json",\n        "uid": "28e39dcd-77d4-11ea-8dbb-0242ac110003",\n        "status": "Accepted",\n        "acceptedTime": "2020-06-13T22:59:29.000+08:00",\n        "spec": {\n            "meta": {\n                "name": "tf-mnist-json",\n                "namespace": "default",\n                "framework": "TensorFlow",\n                "cmd": "python /var/tf_mnist/mnist_with_summaries.py --log_dir=/train/log --learning_rate=0.01 --batch_size=150",\n                "envVars": {\n                    "ENV_1": "ENV1"\n                }\n            },\n            "environment": {\n                "image": "apache/submarine:tf-mnist-with-summaries-1.0"\n            },\n            "spec": {\n                "Ps": {\n                    "replicas": 1,\n                    "resources": "cpu=1,memory=1024M"\n                },\n                "Worker": {\n                    "replicas": 1,\n                    "resources": "cpu=1,memory=1024M"\n                }\n            }\n        }\n    }\n}\n')),Object(s.b)("p",null,"More info see ",Object(s.b)("a",{parentName:"p",href:"/docs/api/experiment"},"Experiment API Reference"),"."))}m.isMDXComponent=!0},136:function(e,n,r){"use strict";r.d(n,"a",(function(){return u})),r.d(n,"b",(function(){return f}));var t=r(0),a=r.n(t);function s(e,n,r){return n in e?Object.defineProperty(e,n,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[n]=r,e}function o(e,n){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(e);n&&(t=t.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),r.push.apply(r,t)}return r}function i(e){for(var n=1;n<arguments.length;n++){var r=null!=arguments[n]?arguments[n]:{};n%2?o(Object(r),!0).forEach((function(n){s(e,n,r[n])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):o(Object(r)).forEach((function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(r,n))}))}return e}function c(e,n){if(null==e)return{};var r,t,a=function(e,n){if(null==e)return{};var r,t,a={},s=Object.keys(e);for(t=0;t<s.length;t++)r=s[t],n.indexOf(r)>=0||(a[r]=e[r]);return a}(e,n);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(t=0;t<s.length;t++)r=s[t],n.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var p=a.a.createContext({}),m=function(e){var n=a.a.useContext(p),r=n;return e&&(r="function"==typeof e?e(n):i(i({},n),e)),r},u=function(e){var n=m(e.components);return a.a.createElement(p.Provider,{value:n},e.children)},l={inlineCode:"code",wrapper:function(e){var n=e.children;return a.a.createElement(a.a.Fragment,{},n)}},b=a.a.forwardRef((function(e,n){var r=e.components,t=e.mdxType,s=e.originalType,o=e.parentName,p=c(e,["components","mdxType","originalType","parentName"]),u=m(r),b=t,f=u["".concat(o,".").concat(b)]||u[b]||l[b]||s;return r?a.a.createElement(f,i(i({ref:n},p),{},{components:r})):a.a.createElement(f,i({ref:n},p))}));function f(e,n){var r=arguments,t=n&&n.mdxType;if("string"==typeof e||t){var s=r.length,o=new Array(s);o[0]=b;var i={};for(var c in n)hasOwnProperty.call(n,c)&&(i[c]=n[c]);i.originalType=e,i.mdxType="string"==typeof e?e:t,o[1]=i;for(var p=2;p<s;p++)o[p]=r[p];return a.a.createElement.apply(null,o)}return a.a.createElement.apply(null,r)}b.displayName="MDXCreateElement"}}]);