(window.webpackJsonp=window.webpackJsonp||[]).push([[68],{135: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 o})),n.d(t,"default",(function(){return s}));var r=n(3),a=n(7),p=(n(0),n(144)),i={title:"Run Experiment Template Guide (REST)"},c={unversionedId:"userDocs/k8s/run-experiment-template-rest",id:"userDocs/k8s/run-experiment-template-rest",isDocsHomePage:!1,title:"Run Experiment Template Guide (REST)",description:"\x3c!--",source:"@site/docs/userDocs/k8s/run-experiment-template-rest.md",slug:"/userDocs/k8s/run-experiment-template-rest",permalink:"/docs/userDocs/k8s/run-experiment-template-rest",editUrl:"https://github.com/apache/submarine/edit/master/website/docs/userDocs/k8s/run-experiment-template-rest.md",version:"current"},o=[{value:"Experiment Template Spec",id:"experiment-template-spec",children:[{value:"Use existing experiment template to create a experiment",id:"use-existing-experiment-template-to-create-a-experiment",children:[]}]}],m={toc:o};function s(e){var t=e.components,n=Object(a.a)(e,["components"]);return Object(p.b)("wrapper",Object(r.a)({},m,n,{components:t,mdxType:"MDXLayout"}),Object(p.b)("h2",{id:"experiment-template-spec"},"Experiment Template Spec"),Object(p.b)("p",null,"The experiment is represented in ",Object(p.b)("a",{parentName:"p",href:"https://www.json.org"},"JSON")," or ",Object(p.b)("a",{parentName:"p",href:"https://yaml.org"},"YAML")," format."),Object(p.b)("h3",{id:"use-existing-experiment-template-to-create-a-experiment"},"Use existing experiment template to create a experiment"),Object(p.b)("p",null,Object(p.b)("inlineCode",{parentName:"p"},"POST /api/v1/experiment/{template-name}")),Object(p.b)("p",null,Object(p.b)("strong",{parentName:"p"},"Example Request:")),Object(p.b)("pre",null,Object(p.b)("code",{parentName:"pre",className:"language-sh"},'curl -X POST -H "Content-Type: application/json" -d \'\n{\n    "params": {\n        "learning_rate":"0.01",\n        "batch_size":"150",\n        "experiment_name":"newexperiment1"\n    }\n}\n\' http://127.0.0.1:32080/api/v1/experiment/tf-mnist\n')),Object(p.b)("p",null,Object(p.b)("strong",{parentName:"p"},"Example Request:")),Object(p.b)("pre",null,Object(p.b)("code",{parentName:"pre",className:"language-sh"},'curl -X POST -H "Content-Type: application/json" -d \'\n{\n    "params": {\n        "experiment_name":"new-pytorch-mnist"\n    }\n}\n\' http://127.0.0.1:32080/api/v1/experiment/pytorch-mnist\n')),Object(p.b)("p",null,"Register experiment template and more info see ",Object(p.b)("a",{parentName:"p",href:"/docs/api/experiment-template"},"Experiment Template API Reference"),"."))}s.isMDXComponent=!0},144:function(e,t,n){"use strict";n.d(t,"a",(function(){return l})),n.d(t,"b",(function(){return f}));var r=n(0),a=n.n(r);function p(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){p(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 o(e,t){if(null==e)return{};var n,r,a=function(e,t){if(null==e)return{};var n,r,a={},p=Object.keys(e);for(r=0;r<p.length;r++)n=p[r],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var p=Object.getOwnPropertySymbols(e);for(r=0;r<p.length;r++)n=p[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var m=a.a.createContext({}),s=function(e){var t=a.a.useContext(m),n=t;return e&&(n="function"==typeof e?e(t):c(c({},t),e)),n},l=function(e){var t=s(e.components);return a.a.createElement(m.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return a.a.createElement(a.a.Fragment,{},t)}},b=a.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,p=e.originalType,i=e.parentName,m=o(e,["components","mdxType","originalType","parentName"]),l=s(n),b=r,f=l["".concat(i,".").concat(b)]||l[b]||u[b]||p;return n?a.a.createElement(f,c(c({ref:t},m),{},{components:n})):a.a.createElement(f,c({ref:t},m))}));function f(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var p=n.length,i=new Array(p);i[0]=b;var c={};for(var o in t)hasOwnProperty.call(t,o)&&(c[o]=t[o]);c.originalType=e,c.mdxType="string"==typeof e?e:r,i[1]=c;for(var m=2;m<p;m++)i[m]=n[m];return a.a.createElement.apply(null,i)}return a.a.createElement.apply(null,n)}b.displayName="MDXCreateElement"}}]);