<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Casper da Costa-Luis</title>
    <description>The latest articles on DEV Community by Casper da Costa-Luis (@casperdcl).</description>
    <link>https://dev.to/casperdcl</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F854129%2F7bf7051b-542d-4101-9fd1-ddf73afc5920.png</url>
      <title>DEV Community: Casper da Costa-Luis</title>
      <link>https://dev.to/casperdcl</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/casperdcl"/>
    <language>en</language>
    <item>
      <title>How to Run Jupyter In Any Cloud With One Command</title>
      <dc:creator>Casper da Costa-Luis</dc:creator>
      <pubDate>Thu, 28 Apr 2022 16:31:02 +0000</pubDate>
      <link>https://dev.to/casperdcl/how-to-run-jupyter-in-any-cloud-with-one-command-52me</link>
      <guid>https://dev.to/casperdcl/how-to-run-jupyter-in-any-cloud-with-one-command-52me</guid>
      <description>&lt;p&gt;Two pain points often faced by scientists and engineers are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Installing and maintaining your entire software stack (including GPU drivers and dependencies) is difficult and &lt;em&gt;time-consuming&lt;/em&gt;, and&lt;/li&gt;
&lt;li&gt;Being &lt;em&gt;limited by the hardware you own&lt;/em&gt; (laptop or desktop specs).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here's a solution!&lt;/p&gt;

&lt;h2&gt;
  
  
  Requirements
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Download the &lt;a href="https://www.terraform.io/downloads" rel="noopener noreferrer"&gt;terraform&lt;/a&gt; CLI tool and say goodbye to &lt;a href="https://www.august.com.au/blog/killing-click-ops-what-it-is-why-its-problematic-and-how-to-avoid-it/" rel="noopener noreferrer"&gt;ClickOps&lt;/a&gt; (free)&lt;/li&gt;
&lt;li&gt;Get an &lt;a href="https://ngrok.com" rel="noopener noreferrer"&gt;ngrok&lt;/a&gt; account for port forwarding convenience (free)&lt;/li&gt;
&lt;li&gt;Have cloud credentials, of course! (&lt;a href="//ttps://registry.terraform.io/providers/iterative/iterative/latest/docs/guides/authentication#amazon-web-services"&gt;AWS&lt;/a&gt;, &lt;a href="//ttps://registry.terraform.io/providers/iterative/iterative/latest/docs/guides/authentication#microsoft-azure"&gt;Azure&lt;/a&gt;, &lt;a href="//ttps://registry.terraform.io/providers/iterative/iterative/latest/docs/guides/authentication#google-cloud-platform"&gt;GCP&lt;/a&gt;, or &lt;a href="//ttps://registry.terraform.io/providers/iterative/iterative/latest/docs/guides/authentication#kubernetes"&gt;K8s&lt;/a&gt;.)&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Lift off! 🚀
&lt;/h2&gt;

&lt;p&gt;Using &lt;a href="https://github.com/iterative/blog-tpi-jupyter" rel="noopener noreferrer"&gt;this GitHub repository&lt;/a&gt; and &lt;a href="https://github.com/iterative/terraform-provider-iterative" rel="noopener noreferrer"&gt;TPI&lt;/a&gt; to do all the heavy lifting:&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/iterative/blog-tpi-jupyter
&lt;span class="nb"&gt;cd &lt;/span&gt;blog-tpi-jupyter
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;NGROK_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;  &lt;span class="c"&gt;# Signup for free at https://ngrok.com&lt;/span&gt;
terraform init    &lt;span class="c"&gt;# Setup local dependencies&lt;/span&gt;
terraform apply   &lt;span class="c"&gt;# Create cloud resources &amp;amp; upload workdir&lt;/span&gt;
terraform refresh &lt;span class="c"&gt;# Get URLs (rerun if blank)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It takes a few minutes to launch cloud resources and upload your working directory, so you might have to wait a bit before running &lt;code&gt;terraform refresh&lt;/code&gt; again. Soon, you'll see:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;Outputs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="nx"&gt;urls&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Jupyter Lab: https://{id}.ngrok.io/lab?token=...&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Jupyter Notebook: https://{id}.ngrok.io/tree?token=...&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;TensorBoard: https://{id}.ngrok.io&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Click on those URLs to get to your dev environment! ✨&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbv7olbk29gmybj8ny27a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbv7olbk29gmybj8ny27a.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Download &amp;amp; Cleanup 📥
&lt;/h2&gt;

&lt;p&gt;When done experimenting, download the shared &lt;code&gt;workdir&lt;/code&gt;, delete the cloud storage, and terminate the cloud instance with one simple command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;terraform destroy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Benefits 🎩
&lt;/h2&gt;

&lt;p&gt;It uses &lt;a href="https://github.com/iterative/terraform-provider-iterative" rel="noopener noreferrer"&gt;Terraform Provider Iterative (TPI)&lt;/a&gt; under-the-hood. There are a few distinct advantages to TPI:&lt;/p&gt;

&lt;p&gt;💰 &lt;strong&gt;Lower cost&lt;/strong&gt;: use your preferred cloud provider's existing pricing, including on-demand per-second billing and bulk discounts.&lt;/p&gt;

&lt;p&gt;🔄 &lt;strong&gt;Auto-recovery&lt;/strong&gt;: spot/preemptible instances are cheap but unreliable. TPI reliably and automatically respawns such interrupted instances, caching &amp;amp; restoring the working directory in the cloud even when you are offline.&lt;/p&gt;

&lt;p&gt;👓 &lt;strong&gt;Custom spec&lt;/strong&gt;: full control over hardware &amp;amp; software requirements via a single &lt;a href="https://github.com/iterative/blog-tpi-jupyter/blob/aws/main.tf" rel="noopener noreferrer"&gt;&lt;code&gt;main.tf&lt;/code&gt; config file&lt;/a&gt; - including machine &lt;a href="https://registry.terraform.io/providers/iterative/iterative/latest/docs/resources/task#machine-type" rel="noopener noreferrer"&gt;types&lt;/a&gt; (CPU, GPU, RAM, storage) &amp;amp; &lt;a href="https://registry.terraform.io/providers/iterative/iterative/latest/docs/resources/task#machine-image" rel="noopener noreferrer"&gt;images&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Happy coding!&lt;/p&gt;

</description>
      <category>jupyter</category>
      <category>terraform</category>
      <category>machinelearning</category>
      <category>datascience</category>
    </item>
  </channel>
</rss>
