(window.webpackJsonp=window.webpackJsonp||[]).push([[58],{125:function(e,t,n){"use strict";n.r(t),n.d(t,"frontMatter",(function(){return i})),n.d(t,"metadata",(function(){return o})),n.d(t,"toc",(function(){return c})),n.d(t,"default",(function(){return m}));var r=n(3),a=n(7),p=(n(0),n(136)),i={title:"Run Experiment Template Guide (REST)"},o={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",sidebar:"docs",previous:{title:"Submarine Python SDK",permalink:"/docs/gettingStarted/python-sdk"},next:{title:"Run PyTorch Experiment Guide (REST)",permalink:"/docs/userDocs/k8s/run-pytorch-experiment-rest"}},c=[{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:[]}]}],s={toc:c};function m(e){var t=e.components,n=Object(a.a)(e,["components"]);return Object(p.b)("wrapper",Object(r.a)({},s,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"),"."))}m.isMDXComponent=!0},136:function(e,t,n){"use strict";n.d(t,"a",(function(){return l})),n.d(t,"b",(function(){return d}));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 o(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 c(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 s=a.a.createContext({}),m=function(e){var t=a.a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},l=function(e){var t=m(e.components);return a.a.createElement(s.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,s=c(e,["components","mdxType","originalType","parentName"]),l=m(n),b=r,d=l["".concat(i,".").concat(b)]||l[b]||u[b]||p;return n?a.a.createElement(d,o(o({ref:t},s),{},{components:n})):a.a.createElement(d,o({ref:t},s))}));function d(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 o={};for(var c in t)hasOwnProperty.call(t,c)&&(o[c]=t[c]);o.originalType=e,o.mdxType="string"==typeof e?e:r,i[1]=o;for(var s=2;s<p;s++)i[s]=n[s];return a.a.createElement.apply(null,i)}return a.a.createElement.apply(null,n)}b.displayName="MDXCreateElement"}}]);