(window.webpackJsonp=window.webpackJsonp||[]).push([[3],{136:function(e,t,n){"use strict";n.d(t,"a",(function(){return u})),n.d(t,"b",(function(){return d}));var r=n(0),a=n.n(r);function o(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 l(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){o(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={},o=Object.keys(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var s=a.a.createContext({}),p=function(e){var t=a.a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},u=function(e){var t=p(e.components);return a.a.createElement(s.Provider,{value:t},e.children)},b={inlineCode:"code",wrapper:function(e){var t=e.children;return a.a.createElement(a.a.Fragment,{},t)}},m=a.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,i=e.parentName,s=c(e,["components","mdxType","originalType","parentName"]),u=p(n),m=r,d=u["".concat(i,".").concat(m)]||u[m]||b[m]||o;return n?a.a.createElement(d,l(l({ref:t},s),{},{components:n})):a.a.createElement(d,l({ref:t},s))}));function d(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,i=new Array(o);i[0]=m;var l={};for(var c in t)hasOwnProperty.call(t,c)&&(l[c]=t[c]);l.originalType=e,l.mdxType="string"==typeof e?e:r,i[1]=l;for(var s=2;s<o;s++)i[s]=n[s];return a.a.createElement.apply(null,i)}return a.a.createElement.apply(null,n)}m.displayName="MDXCreateElement"},63:function(e,t,n){"use strict";n.r(t),n.d(t,"frontMatter",(function(){return i})),n.d(t,"metadata",(function(){return l})),n.d(t,"toc",(function(){return c})),n.d(t,"default",(function(){return p}));var r=n(3),a=n(7),o=(n(0),n(136)),i={title:"Submarine Python SDK"},l={unversionedId:"gettingStarted/python-sdk",id:"gettingStarted/python-sdk",isDocsHomePage:!1,title:"Submarine Python SDK",description:"\x3c!--",source:"@site/docs/gettingStarted/python-sdk.md",slug:"/gettingStarted/python-sdk",permalink:"/docs/gettingStarted/python-sdk",editUrl:"https://github.com/apache/submarine/edit/master/website/docs/gettingStarted/python-sdk.md",version:"current",sidebar:"docs",previous:{title:"Notebook Tutorial",permalink:"/docs/gettingStarted/notebook"},next:{title:"Run Experiment Template Guide (REST)",permalink:"/docs/userDocs/k8s/run-experiment-template-rest"}},c=[{value:"Prepare Python Environment to run Submarine SDK",id:"prepare-python-environment-to-run-submarine-sdk",children:[]},{value:"Install Submarine SDK",id:"install-submarine-sdk",children:[{value:"Install SDK from pypi.org (recommended)",id:"install-sdk-from-pypiorg-recommended",children:[]},{value:"Install SDK from source code",id:"install-sdk-from-source-code",children:[]}]},{value:"Manage Submarine Experiment",id:"manage-submarine-experiment",children:[]},{value:"Training a DeepFM model",id:"training-a-deepfm-model",children:[]}],s={toc:c};function p(e){var t=e.components,n=Object(a.a)(e,["components"]);return Object(o.b)("wrapper",Object(r.a)({},s,n,{components:t,mdxType:"MDXLayout"}),Object(o.b)("p",null,"Submarine Python SDK can runs on any machine and it will talk to Submarine Server via REST API. So you can install Submarine Python SDK on your laptop, a gateway machine, your favorite IDE (like PyCharm/Jupyter, etc.)."),Object(o.b)("p",null,"Furthermore, Submarine supports an extensible package of CTR models based on ",Object(o.b)("strong",{parentName:"p"},"TensorFlow")," and ",Object(o.b)("strong",{parentName:"p"},"PyTorch")," along with lots of core components layers that can be used to easily build custom models. You can train any model with ",Object(o.b)("inlineCode",{parentName:"p"},"model.train()")," and ",Object(o.b)("inlineCode",{parentName:"p"},"model.predict()"),"."),Object(o.b)("h2",{id:"prepare-python-environment-to-run-submarine-sdk"},"Prepare Python Environment to run Submarine SDK"),Object(o.b)("p",null,"Submarine SDK requires Python3.7+.\nIt's better to use a new Python environment created by ",Object(o.b)("inlineCode",{parentName:"p"},"Anoconda")," or Python ",Object(o.b)("inlineCode",{parentName:"p"},"virtualenv")," to try this to avoid trouble to existing Python environment.\nA sample Python virtual env can be setup like this:"),Object(o.b)("pre",null,Object(o.b)("code",{parentName:"pre",className:"language-bash"},"wget https://files.pythonhosted.org/packages/33/bc/fa0b5347139cd9564f0d44ebd2b147ac97c36b2403943dbee8a25fd74012/virtualenv-16.0.0.tar.gz\ntar xf virtualenv-16.0.0.tar.gz\n\n# Make sure to install using Python 3\npython3 virtualenv-16.0.0/virtualenv.py venv\n. venv/bin/activate\n")),Object(o.b)("h2",{id:"install-submarine-sdk"},"Install Submarine SDK"),Object(o.b)("h3",{id:"install-sdk-from-pypiorg-recommended"},"Install SDK from pypi.org (recommended)"),Object(o.b)("p",null,"Starting from ",Object(o.b)("inlineCode",{parentName:"p"},"0.4.0"),", Submarine provides Python SDK. Please change it to a proper version needed. "),Object(o.b)("p",null,"More detail: ",Object(o.b)("a",{parentName:"p",href:"https://pypi.org/project/apache-submarine/"},"https://pypi.org/project/apache-submarine/")),Object(o.b)("pre",null,Object(o.b)("code",{parentName:"pre",className:"language-bash"},"# Install latest stable version\npip install apache-submarine\n# Install specific version\npip install apache-submarine==<REPLACE_VERSION>\n")),Object(o.b)("h3",{id:"install-sdk-from-source-code"},"Install SDK from source code"),Object(o.b)("p",null,"Please first clone code from github or go to ",Object(o.b)("inlineCode",{parentName:"p"},"http://submarine.apache.org/download.html")," to download released source code."),Object(o.b)("pre",null,Object(o.b)("code",{parentName:"pre",className:"language-bash"},"git clone https://github.com/apache/submarine.git\n# (optional) chackout specific branch or release\ngit checkout <correct release tag/branch>\ncd submarine/submarine-sdk/pysubmarine\npip install .\n")),Object(o.b)("h2",{id:"manage-submarine-experiment"},"Manage Submarine Experiment"),Object(o.b)("p",null,"Assuming you've installed submarine on K8s and forward the traefik service to localhost, now you can open a Python shell, Jupyter notebook or any tools with Submarine SDK installed."),Object(o.b)("p",null,"Follow ",Object(o.b)("a",{parentName:"p",href:"https://github.com/apache/submarine/blob/master/submarine-sdk/pysubmarine/example/submarine_experiment_sdk.ipynb"},"SDK experiment example")," to run an experiment."),Object(o.b)("h2",{id:"training-a-deepfm-model"},"Training a DeepFM model"),Object(o.b)("p",null,"The Submarine also supports users to train an easy-to-use CTR model with a few lines of code and a configuration file, so they don\u2019t need to reimplement the model by themself. In addition, they can train the model on both local on distributed systems, such as Hadoop or Kubernetes."),Object(o.b)("p",null,"Follow ",Object(o.b)("a",{parentName:"p",href:"https://github.com/apache/submarine/blob/master/submarine-sdk/pysubmarine/example/deepfm_example.ipynb"},"SDK DeepFM example")," to try the model."))}p.isMDXComponent=!0}}]);