Deployed 03765e1 with MkDocs version: 1.3.0

This commit is contained in:
2022-07-13 10:53:35 +00:00
parent 8cda980b81
commit f5267b5a06
31 changed files with 725 additions and 91 deletions

View file

@ -445,7 +445,7 @@
<li class="md-nav__item"> <li class="md-nav__item">
<a href="/how-to-guides/call-remote/" class="md-nav__link"> <a href="/how-to-guides/call-remote/" class="md-nav__link">
Call remote GreatAI instances How to call remote GreatAI instances
</a> </a>
</li> </li>

View file

@ -450,7 +450,7 @@
<li class="md-nav__item"> <li class="md-nav__item">
<a href="../../../how-to-guides/call-remote/" class="md-nav__link"> <a href="../../../how-to-guides/call-remote/" class="md-nav__link">
Call remote GreatAI instances How to call remote GreatAI instances
</a> </a>
</li> </li>

View file

@ -450,7 +450,7 @@
<li class="md-nav__item"> <li class="md-nav__item">
<a href="../../../how-to-guides/call-remote/" class="md-nav__link"> <a href="../../../how-to-guides/call-remote/" class="md-nav__link">
Call remote GreatAI instances How to call remote GreatAI instances
</a> </a>
</li> </li>

View file

@ -450,7 +450,7 @@
<li class="md-nav__item"> <li class="md-nav__item">
<a href="../../../how-to-guides/call-remote/" class="md-nav__link"> <a href="../../../how-to-guides/call-remote/" class="md-nav__link">
Call remote GreatAI instances How to call remote GreatAI instances
</a> </a>
</li> </li>

View file

@ -450,7 +450,7 @@
<li class="md-nav__item"> <li class="md-nav__item">
<a href="../../../how-to-guides/call-remote/" class="md-nav__link"> <a href="../../../how-to-guides/call-remote/" class="md-nav__link">
Call remote GreatAI instances How to call remote GreatAI instances
</a> </a>
</li> </li>

View file

@ -450,7 +450,7 @@
<li class="md-nav__item"> <li class="md-nav__item">
<a href="../how-to-guides/call-remote/" class="md-nav__link"> <a href="../how-to-guides/call-remote/" class="md-nav__link">
Call remote GreatAI instances How to call remote GreatAI instances
</a> </a>
</li> </li>

View file

@ -1,2 +1,90 @@
# Call remote GreatAI instances # How to call remote GreatAI instances
Microservices architecture (or [SOA](https://en.wikipedia.org/wiki/Service-oriented_architecture)) work well with ML applications. This is because their interfaces are usually very narrow, while the functionality provided quite comprehensive. Hence, drawing the boundaries of responsibilities is more straightforward in the case of ML services than in the case of more traditional business applications. For this reason, it is common to have a tree of models (preferably wrapped in GreatAI instances) communicating with each other.
Although regular HTTP POST requests could be sent to each service's `/predict` endpoint, `great-ai` comes with two convenience functions: [call_remote_great_ai][great_ai.call_remote_great_ai] and [call_remote_great_ai_async][great_ai.call_remote_great_ai_async] to wrap this request. These provide you with some level of robustness and deserialisation.
!!! note "Inside notebooks"
The async variant, [call_remote_great_ai_async][great_ai.call_remote_great_ai_async], requires a running event loop while the synchronous variant disallows other running event-loops. Therefore, when running inside a Jupyter Notebook, always call [call_remote_great_ai_async][great_ai.call_remote_great_ai_async].
## Simple example
Let's create two processes: a server and a client.
### Server
```python title="server.py"
from great_ai import GreatAI
from asyncio import sleep
@GreatAI.create
async def slow_greeter(your_name):
await sleep(2)
return f'Hi {your_name}!'
```
> Run this in development mode by executing `great-ai server.py` or `python3 -m great_ai server.py` if you're on Windows and [`great-ai` is not in your `PATH`](/how-to-guides/install).
### Client
```python title="client.py"
from great_ai import call_remote_great_ai
names = ['Olivér', 'Balázs', 'András']
results = [
call_remote_great_ai(
'http://localhost:6060',
{
'your_name': name
}
).output #(1)
for name in names
]
print(results)
```
1. Only return the outputs so we don't clutter up the terminal.
> Run this script as a regular Python script by executing `python3 client.py`.
![screenshot of result](/media/remote-sync.png){ loading=lazy }
As you can see, everything worked as expected. There is one way to improve it though.
## An `async` example
Let's send multiple requests at the same time to speed up the overall execution time. To do this, we will use the [call_remote_great_ai_async][great_ai.call_remote_great_ai_async] function.
??? note "Why is this possible?"
Note, that in `server.py`, the inference function is declared `async`. This means that multiple "copies" of it can run at the same time in the same thread. Since, there is no CPU-bottleneck, the server has a quite large throughpout (requests responded to per second), but its latency will stay around 2 seconds due to the async `sleep` command.
If your great-ai server is not `async`, higher throughput can be achieved by running multiple instances of it, either manually, or by running it with multiple `uvicorn` workers like this: `ENVIRONMENT=production great-ai server.py --worker_count 4`
### Async client
```python title="async-client.py"
from great_ai import call_remote_great_ai_async
import asyncio
names = ['Olivér', 'Balázs', 'András']
async def main():
futures = [
call_remote_great_ai_async(
'http://localhost:6060',
{
'your_name': name
}
) for name in names
]
results = await asyncio.gather(*futures)
print([r.output for r in results])
asyncio.run(main())
```
> Replace `client.py` with this async client. Note that even though async support is significantly more streamlined in recent Python versions, it still requires a bit more boilerplate than its synchronous counterpart.
![screenshot of result](/media/remote-async.png){ loading=lazy }
This also works, and in some use cases might be considerably quicker.

View file

@ -17,7 +17,7 @@
<title>Call remote GreatAI instances - GreatAI documentation</title> <title>How to call remote GreatAI instances - GreatAI documentation</title>
@ -83,7 +83,7 @@
<div data-md-component="skip"> <div data-md-component="skip">
<a href="#call-remote-greatai-instances" class="md-skip"> <a href="#how-to-call-remote-greatai-instances" class="md-skip">
Skip to content Skip to content
</a> </a>
@ -116,7 +116,7 @@
<div class="md-header__topic" data-md-component="header-topic"> <div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis"> <span class="md-ellipsis">
Call remote GreatAI instances How to call remote GreatAI instances
</span> </span>
</div> </div>
@ -460,10 +460,81 @@
<label class="md-nav__link md-nav__link--active" for="__toc">
How to call remote GreatAI instances
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active"> <a href="./" class="md-nav__link md-nav__link--active">
Call remote GreatAI instances How to call remote GreatAI instances
</a> </a>
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#simple-example" class="md-nav__link">
Simple example
</a>
<nav class="md-nav" aria-label="Simple example">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#server" class="md-nav__link">
Server
</a>
</li>
<li class="md-nav__item">
<a href="#client" class="md-nav__link">
Client
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#an-async-example" class="md-nav__link">
An async example
</a>
<nav class="md-nav" aria-label="An async example">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#async-client" class="md-nav__link">
Async client
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li> </li>
@ -723,6 +794,61 @@
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#simple-example" class="md-nav__link">
Simple example
</a>
<nav class="md-nav" aria-label="Simple example">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#server" class="md-nav__link">
Server
</a>
</li>
<li class="md-nav__item">
<a href="#client" class="md-nav__link">
Client
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#an-async-example" class="md-nav__link">
An async example
</a>
<nav class="md-nav" aria-label="An async example">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#async-client" class="md-nav__link">
Async client
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav> </nav>
</div> </div>
</div> </div>
@ -743,14 +869,90 @@
<h1 id="call-remote-greatai-instances">Call remote GreatAI instances<a class="headerlink" href="#call-remote-greatai-instances" title="Permanent link">#</a></h1> <h1 id="how-to-call-remote-greatai-instances">How to call remote GreatAI instances<a class="headerlink" href="#how-to-call-remote-greatai-instances" title="Permanent link">#</a></h1>
<p>Microservices architecture (or <a href="https://en.wikipedia.org/wiki/Service-oriented_architecture">SOA</a>) work well with ML applications. This is because their interfaces are usually very narrow, while the functionality provided quite comprehensive. Hence, drawing the boundaries of responsibilities is more straightforward in the case of ML services than in the case of more traditional business applications. For this reason, it is common to have a tree of models (preferably wrapped in GreatAI instances) communicating with each other.</p>
<p>Although regular HTTP POST requests could be sent to each service's <code>/predict</code> endpoint, <code>great-ai</code> comes with two convenience functions: <a class="autorefs autorefs-internal" href="../../reference/#great_ai.call_remote_great_ai">call_remote_great_ai</a> and <a class="autorefs autorefs-internal" href="../../reference/#great_ai.call_remote_great_ai_async">call_remote_great_ai_async</a> to wrap this request. These provide you with some level of robustness and deserialisation.</p>
<div class="admonition note">
<p class="admonition-title">Inside notebooks</p>
<p>The async variant, <a class="autorefs autorefs-internal" href="../../reference/#great_ai.call_remote_great_ai_async">call_remote_great_ai_async</a>, requires a running event loop while the synchronous variant disallows other running event-loops. Therefore, when running inside a Jupyter Notebook, always call <a class="autorefs autorefs-internal" href="../../reference/#great_ai.call_remote_great_ai_async">call_remote_great_ai_async</a>.</p>
</div>
<h2 id="simple-example">Simple example<a class="headerlink" href="#simple-example" title="Permanent link">#</a></h2>
<p>Let's create two processes: a server and a client.</p>
<h3 id="server">Server<a class="headerlink" href="#server" title="Permanent link">#</a></h3>
<div class="highlight"><span class="filename">server.py</span><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="kn">from</span> <span class="nn">great_ai</span> <span class="kn">import</span> <span class="n">GreatAI</span>
<a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a><span class="kn">from</span> <span class="nn">asyncio</span> <span class="kn">import</span> <span class="n">sleep</span>
<a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a>
<a id="__codelineno-0-4" name="__codelineno-0-4" href="#__codelineno-0-4"></a><span class="nd">@GreatAI</span><span class="o">.</span><span class="n">create</span>
<a id="__codelineno-0-5" name="__codelineno-0-5" href="#__codelineno-0-5"></a><span class="k">async</span> <span class="k">def</span> <span class="nf">slow_greeter</span><span class="p">(</span><span class="n">your_name</span><span class="p">):</span>
<a id="__codelineno-0-6" name="__codelineno-0-6" href="#__codelineno-0-6"></a> <span class="k">await</span> <span class="n">sleep</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
<a id="__codelineno-0-7" name="__codelineno-0-7" href="#__codelineno-0-7"></a> <span class="k">return</span> <span class="sa">f</span><span class="s1">&#39;Hi </span><span class="si">{</span><span class="n">your_name</span><span class="si">}</span><span class="s1">!&#39;</span>
</code></pre></div>
<blockquote>
<p>Run this in development mode by executing <code>great-ai server.py</code> or <code>python3 -m great_ai server.py</code> if you're on Windows and <a href="/how-to-guides/install"><code>great-ai</code> is not in your <code>PATH</code></a>.</p>
</blockquote>
<h3 id="client">Client<a class="headerlink" href="#client" title="Permanent link">#</a></h3>
<p><div class="highlight"><span class="filename">client.py</span><pre><span></span><code><a id="__codelineno-1-1" name="__codelineno-1-1" href="#__codelineno-1-1"></a><span class="kn">from</span> <span class="nn">great_ai</span> <span class="kn">import</span> <span class="n">call_remote_great_ai</span>
<a id="__codelineno-1-2" name="__codelineno-1-2" href="#__codelineno-1-2"></a>
<a id="__codelineno-1-3" name="__codelineno-1-3" href="#__codelineno-1-3"></a><span class="n">names</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;Olivér&#39;</span><span class="p">,</span> <span class="s1">&#39;Balázs&#39;</span><span class="p">,</span> <span class="s1">&#39;András&#39;</span><span class="p">]</span>
<a id="__codelineno-1-4" name="__codelineno-1-4" href="#__codelineno-1-4"></a>
<a id="__codelineno-1-5" name="__codelineno-1-5" href="#__codelineno-1-5"></a><span class="n">results</span> <span class="o">=</span> <span class="p">[</span>
<a id="__codelineno-1-6" name="__codelineno-1-6" href="#__codelineno-1-6"></a> <span class="n">call_remote_great_ai</span><span class="p">(</span>
<a id="__codelineno-1-7" name="__codelineno-1-7" href="#__codelineno-1-7"></a> <span class="s1">&#39;http://localhost:6060&#39;</span><span class="p">,</span>
<a id="__codelineno-1-8" name="__codelineno-1-8" href="#__codelineno-1-8"></a> <span class="p">{</span>
<a id="__codelineno-1-9" name="__codelineno-1-9" href="#__codelineno-1-9"></a> <span class="s1">&#39;your_name&#39;</span><span class="p">:</span> <span class="n">name</span>
<a id="__codelineno-1-10" name="__codelineno-1-10" href="#__codelineno-1-10"></a> <span class="p">}</span>
<a id="__codelineno-1-11" name="__codelineno-1-11" href="#__codelineno-1-11"></a> <span class="p">)</span><span class="o">.</span><span class="n">output</span> <span class="c1">#(1)</span>
<a id="__codelineno-1-12" name="__codelineno-1-12" href="#__codelineno-1-12"></a> <span class="k">for</span> <span class="n">name</span> <span class="ow">in</span> <span class="n">names</span>
<a id="__codelineno-1-13" name="__codelineno-1-13" href="#__codelineno-1-13"></a><span class="p">]</span>
<a id="__codelineno-1-14" name="__codelineno-1-14" href="#__codelineno-1-14"></a>
<a id="__codelineno-1-15" name="__codelineno-1-15" href="#__codelineno-1-15"></a><span class="nb">print</span><span class="p">(</span><span class="n">results</span><span class="p">)</span>
</code></pre></div>
1. Only return the outputs so we don't clutter up the terminal.</p>
<blockquote>
<p>Run this script as a regular Python script by executing <code>python3 client.py</code>.</p>
</blockquote>
<p><img alt="screenshot of result" loading="lazy" src="/media/remote-sync.png" /></p>
<p>As you can see, everything worked as expected. There is one way to improve it though.</p>
<h2 id="an-async-example">An <code>async</code> example<a class="headerlink" href="#an-async-example" title="Permanent link">#</a></h2>
<p>Let's send multiple requests at the same time to speed up the overall execution time. To do this, we will use the <a class="autorefs autorefs-internal" href="../../reference/#great_ai.call_remote_great_ai_async">call_remote_great_ai_async</a> function.</p>
<details class="note">
<summary>Why is this possible?</summary>
<p>Note, that in <code>server.py</code>, the inference function is declared <code>async</code>. This means that multiple "copies" of it can run at the same time in the same thread. Since, there is no CPU-bottleneck, the server has a quite large throughpout (requests responded to per second), but its latency will stay around 2 seconds due to the async <code>sleep</code> command.</p>
<p>If your great-ai server is not <code>async</code>, higher throughput can be achieved by running multiple instances of it, either manually, or by running it with multiple <code>uvicorn</code> workers like this: <code>ENVIRONMENT=production great-ai server.py --worker_count 4</code></p>
</details>
<h3 id="async-client">Async client<a class="headerlink" href="#async-client" title="Permanent link">#</a></h3>
<div class="highlight"><span class="filename">async-client.py</span><pre><span></span><code><a id="__codelineno-2-1" name="__codelineno-2-1" href="#__codelineno-2-1"></a><span class="kn">from</span> <span class="nn">great_ai</span> <span class="kn">import</span> <span class="n">call_remote_great_ai_async</span>
<a id="__codelineno-2-2" name="__codelineno-2-2" href="#__codelineno-2-2"></a><span class="kn">import</span> <span class="nn">asyncio</span>
<a id="__codelineno-2-3" name="__codelineno-2-3" href="#__codelineno-2-3"></a>
<a id="__codelineno-2-4" name="__codelineno-2-4" href="#__codelineno-2-4"></a><span class="n">names</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;Olivér&#39;</span><span class="p">,</span> <span class="s1">&#39;Balázs&#39;</span><span class="p">,</span> <span class="s1">&#39;András&#39;</span><span class="p">]</span>
<a id="__codelineno-2-5" name="__codelineno-2-5" href="#__codelineno-2-5"></a>
<a id="__codelineno-2-6" name="__codelineno-2-6" href="#__codelineno-2-6"></a><span class="k">async</span> <span class="k">def</span> <span class="nf">main</span><span class="p">():</span>
<a id="__codelineno-2-7" name="__codelineno-2-7" href="#__codelineno-2-7"></a> <span class="n">futures</span> <span class="o">=</span> <span class="p">[</span>
<a id="__codelineno-2-8" name="__codelineno-2-8" href="#__codelineno-2-8"></a> <span class="n">call_remote_great_ai_async</span><span class="p">(</span>
<a id="__codelineno-2-9" name="__codelineno-2-9" href="#__codelineno-2-9"></a> <span class="s1">&#39;http://localhost:6060&#39;</span><span class="p">,</span>
<a id="__codelineno-2-10" name="__codelineno-2-10" href="#__codelineno-2-10"></a> <span class="p">{</span>
<a id="__codelineno-2-11" name="__codelineno-2-11" href="#__codelineno-2-11"></a> <span class="s1">&#39;your_name&#39;</span><span class="p">:</span> <span class="n">name</span>
<a id="__codelineno-2-12" name="__codelineno-2-12" href="#__codelineno-2-12"></a> <span class="p">}</span>
<a id="__codelineno-2-13" name="__codelineno-2-13" href="#__codelineno-2-13"></a> <span class="p">)</span> <span class="k">for</span> <span class="n">name</span> <span class="ow">in</span> <span class="n">names</span>
<a id="__codelineno-2-14" name="__codelineno-2-14" href="#__codelineno-2-14"></a> <span class="p">]</span>
<a id="__codelineno-2-15" name="__codelineno-2-15" href="#__codelineno-2-15"></a>
<a id="__codelineno-2-16" name="__codelineno-2-16" href="#__codelineno-2-16"></a> <span class="n">results</span> <span class="o">=</span> <span class="k">await</span> <span class="n">asyncio</span><span class="o">.</span><span class="n">gather</span><span class="p">(</span><span class="o">*</span><span class="n">futures</span><span class="p">)</span>
<a id="__codelineno-2-17" name="__codelineno-2-17" href="#__codelineno-2-17"></a> <span class="nb">print</span><span class="p">([</span><span class="n">r</span><span class="o">.</span><span class="n">output</span> <span class="k">for</span> <span class="n">r</span> <span class="ow">in</span> <span class="n">results</span><span class="p">])</span>
<a id="__codelineno-2-18" name="__codelineno-2-18" href="#__codelineno-2-18"></a>
<a id="__codelineno-2-19" name="__codelineno-2-19" href="#__codelineno-2-19"></a><span class="n">asyncio</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="n">main</span><span class="p">())</span>
</code></pre></div>
<blockquote>
<p>Replace <code>client.py</code> with this async client. Note that even though async support is significantly more streamlined in recent Python versions, it still requires a bit more boilerplate than its synchronous counterpart.</p>
</blockquote>
<p><img alt="screenshot of result" loading="lazy" src="/media/remote-async.png" /></p>
<p>This also works, and in some use cases might be considerably quicker.</p>
<hr> <hr>
<div class="md-source-file"> <div class="md-source-file">
<small> <small>
Last update: Last update:
<span class="git-revision-date-localized-plugin git-revision-date-localized-plugin-date">July 11, 2022</span> <span class="git-revision-date-localized-plugin git-revision-date-localized-plugin-date">July 13, 2022</span>
</small> </small>

View file

@ -540,7 +540,7 @@
<li class="md-nav__item"> <li class="md-nav__item">
<a href="../call-remote/" class="md-nav__link"> <a href="../call-remote/" class="md-nav__link">
Call remote GreatAI instances How to call remote GreatAI instances
</a> </a>
</li> </li>

View file

@ -534,7 +534,7 @@
<li class="md-nav__item"> <li class="md-nav__item">
<a href="../call-remote/" class="md-nav__link"> <a href="../call-remote/" class="md-nav__link">
Call remote GreatAI instances How to call remote GreatAI instances
</a> </a>
</li> </li>

View file

@ -507,7 +507,7 @@
<li class="md-nav__item"> <li class="md-nav__item">
<a href="../call-remote/" class="md-nav__link"> <a href="../call-remote/" class="md-nav__link">
Call remote GreatAI instances How to call remote GreatAI instances
</a> </a>
</li> </li>

View file

@ -493,7 +493,7 @@
<li class="md-nav__item"> <li class="md-nav__item">
<a href="../call-remote/" class="md-nav__link"> <a href="../call-remote/" class="md-nav__link">
Call remote GreatAI instances How to call remote GreatAI instances
</a> </a>
</li> </li>

View file

@ -567,7 +567,7 @@
<li class="md-nav__item"> <li class="md-nav__item">
<a href="../call-remote/" class="md-nav__link"> <a href="../call-remote/" class="md-nav__link">
Call remote GreatAI instances How to call remote GreatAI instances
</a> </a>
</li> </li>
@ -938,11 +938,13 @@
<h1 id="how-to-use-largefile-s">How to use LargeFile-s<a class="headerlink" href="#how-to-use-largefile-s" title="Permanent link">#</a></h1> <h1 id="how-to-use-largefile-s">How to use LargeFile-s<a class="headerlink" href="#how-to-use-largefile-s" title="Permanent link">#</a></h1>
<p>The functions <a class="autorefs autorefs-internal" href="../../reference/#great_ai.use_model">save_model</a> and <a class="autorefs autorefs-internal" href="../../reference/#great_ai.use_model">@use_model</a> wrap LargeFile instances. Hence, besides configuring LargeFile, users have few reasons to use this.</p> <p>The functions <a class="autorefs autorefs-internal" href="../../reference/#great_ai.use_model">save_model</a> and <a class="autorefs autorefs-internal" href="../../reference/#great_ai.use_model">@use_model</a> wrap LargeFile instances. Hence, besides configuring LargeFile, users have few reasons to use LargeFile-s directly.</p>
<h2 id="motivation">Motivation<a class="headerlink" href="#motivation" title="Permanent link">#</a></h2> <h2 id="motivation">Motivation<a class="headerlink" href="#motivation" title="Permanent link">#</a></h2>
<p>Oftentimes, especially when working with data-heavy applications, large files can proliferate in a repository. Version controlling them is an obvious next step, however, GitHub's git LFS implementation <a href="https://docs.github.com/en/repositories/working-with-files/managing-large-files/removing-files-from-git-large-file-storage#git-lfs-objects-in-your-repository">doesn't support deleting</a> large files, making it easy for them to eat-up the LFS quota and explode the size of your repos.</p> <p>Oftentimes, especially when working with data-heavy applications, large files can proliferate in a repository. Version controlling them is an obvious next step, however, GitHub's git LFS implementation <a href="https://docs.github.com/en/repositories/working-with-files/managing-large-files/removing-files-from-git-large-file-storage#git-lfs-objects-in-your-repository">doesn't support deleting</a> large files, making it easy for them to eat-up the LFS quota and explode the size of your repos.</p>
<p><a href="https://dvc.org/">DVC</a> is a viable alternative, however, it requires users to learn to use one more CLI tool.</p>
<details class="note"> <details class="note">
<summary>Using LargeFile-s directly (usually not needed)</summary> <summary>Using LargeFile-s directly (usually not needed)</summary>
<p>LargeFile doesn't require users to learn too much new. It is a nearly exact copy of the built-in <code>open()</code> function of Python with which users are certainly already familiar.</p>
<h2 id="simple-example">Simple example<a class="headerlink" href="#simple-example" title="Permanent link">#</a></h2> <h2 id="simple-example">Simple example<a class="headerlink" href="#simple-example" title="Permanent link">#</a></h2>
<div class="highlight"><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="kn">from</span> <span class="nn">great_ai.large_file</span> <span class="kn">import</span> <span class="n">LargeFileS3</span> <div class="highlight"><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="kn">from</span> <span class="nn">great_ai.large_file</span> <span class="kn">import</span> <span class="n">LargeFileS3</span>
<a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a> <a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a>
@ -984,7 +986,7 @@
<div class="highlight"><pre><span></span><code><a id="__codelineno-3-1" name="__codelineno-3-1" href="#__codelineno-3-1"></a><span class="n">LargeFileS3</span><span class="p">(</span><span class="s2">&quot;folder-of-my-bert-model&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">push</span><span class="p">(</span><span class="s1">&#39;path_to_local/folder_or_file&#39;</span><span class="p">)</span> <div class="highlight"><pre><span></span><code><a id="__codelineno-3-1" name="__codelineno-3-1" href="#__codelineno-3-1"></a><span class="n">LargeFileS3</span><span class="p">(</span><span class="s2">&quot;folder-of-my-bert-model&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">push</span><span class="p">(</span><span class="s1">&#39;path_to_local/folder_or_file&#39;</span><span class="p">)</span>
</code></pre></div> </code></pre></div>
<blockquote> <blockquote>
<p>This way, both regular files and folders can be handled. The uploaded file is called <strong>folder-of-my-bert-model</strong>, the local name is ignored.</p> <p>This way both regular files and folders can be handled. The uploaded file is called <strong>folder-of-my-bert-model</strong>, the local name is ignored.</p>
</blockquote> </blockquote>
<p>Lastly, all version of the remote object can be deleted by calling <code>LargeFileS3("my-file").delete()</code>. It will still reside in your local cache afterwards, its deletion will happen next time your local cache has to be pruned.</p> <p>Lastly, all version of the remote object can be deleted by calling <code>LargeFileS3("my-file").delete()</code>. It will still reside in your local cache afterwards, its deletion will happen next time your local cache has to be pruned.</p>
</details> </details>
@ -1026,7 +1028,7 @@
<small> <small>
Last update: Last update:
<span class="git-revision-date-localized-plugin git-revision-date-localized-plugin-date">July 12, 2022</span> <span class="git-revision-date-localized-plugin git-revision-date-localized-plugin-date">July 13, 2022</span>
</small> </small>
@ -1063,13 +1065,13 @@
<a href="../call-remote/" class="md-footer__link md-footer__link--next" aria-label="Next: Call remote GreatAI instances" rel="next"> <a href="../call-remote/" class="md-footer__link md-footer__link--next" aria-label="Next: How to call remote GreatAI instances" rel="next">
<div class="md-footer__title"> <div class="md-footer__title">
<div class="md-ellipsis"> <div class="md-ellipsis">
<span class="md-footer__direction"> <span class="md-footer__direction">
Next Next
</span> </span>
Call remote GreatAI instances How to call remote GreatAI instances
</div> </div>
</div> </div>
<div class="md-footer__button md-icon"> <div class="md-footer__button md-icon">

View file

@ -1,13 +1,16 @@
# How to use LargeFile-s # How to use LargeFile-s
The functions [save_model][great_ai.use_model] and [@use_model][great_ai.use_model] wrap LargeFile instances. Hence, besides configuring LargeFile, users have few reasons to use this. The functions [save_model][great_ai.use_model] and [@use_model][great_ai.use_model] wrap LargeFile instances. Hence, besides configuring LargeFile, users have few reasons to use LargeFile-s directly.
## Motivation ## Motivation
Oftentimes, especially when working with data-heavy applications, large files can proliferate in a repository. Version controlling them is an obvious next step, however, GitHub's git LFS implementation [doesn't support deleting](https://docs.github.com/en/repositories/working-with-files/managing-large-files/removing-files-from-git-large-file-storage#git-lfs-objects-in-your-repository) large files, making it easy for them to eat-up the LFS quota and explode the size of your repos. Oftentimes, especially when working with data-heavy applications, large files can proliferate in a repository. Version controlling them is an obvious next step, however, GitHub's git LFS implementation [doesn't support deleting](https://docs.github.com/en/repositories/working-with-files/managing-large-files/removing-files-from-git-large-file-storage#git-lfs-objects-in-your-repository) large files, making it easy for them to eat-up the LFS quota and explode the size of your repos.
[DVC](https://dvc.org/) is a viable alternative, however, it requires users to learn to use one more CLI tool.
??? note "Using LargeFile-s directly (usually not needed)" ??? note "Using LargeFile-s directly (usually not needed)"
LargeFile doesn't require users to learn too much new. It is a nearly exact copy of the built-in `open()` function of Python with which users are certainly already familiar.
## Simple example ## Simple example
```python ```python
@ -61,7 +64,7 @@ Oftentimes, especially when working with data-heavy applications, large files ca
LargeFileS3("folder-of-my-bert-model").push('path_to_local/folder_or_file') LargeFileS3("folder-of-my-bert-model").push('path_to_local/folder_or_file')
``` ```
> This way, both regular files and folders can be handled. The uploaded file is called **folder-of-my-bert-model**, the local name is ignored. > This way both regular files and folders can be handled. The uploaded file is called **folder-of-my-bert-model**, the local name is ignored.
Lastly, all version of the remote object can be deleted by calling `LargeFileS3("my-file").delete()`. It will still reside in your local cache afterwards, its deletion will happen next time your local cache has to be pruned. Lastly, all version of the remote object can be deleted by calling `LargeFileS3("my-file").delete()`. It will still reside in your local cache afterwards, its deletion will happen next time your local cache has to be pruned.

View file

@ -447,7 +447,7 @@
<li class="md-nav__item"> <li class="md-nav__item">
<a href="../call-remote/" class="md-nav__link"> <a href="../call-remote/" class="md-nav__link">
Call remote GreatAI instances How to call remote GreatAI instances
</a> </a>
</li> </li>
@ -1955,7 +1955,7 @@ greeter("Bob")</div>
<nav class="md-footer__inner md-grid" aria-label="Footer" > <nav class="md-footer__inner md-grid" aria-label="Footer" >
<a href="../call-remote/" class="md-footer__link md-footer__link--prev" aria-label="Previous: Call remote GreatAI instances" rel="prev"> <a href="../call-remote/" class="md-footer__link md-footer__link--prev" aria-label="Previous: How to call remote GreatAI instances" rel="prev">
<div class="md-footer__button md-icon"> <div class="md-footer__button md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z"/></svg> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z"/></svg>
</div> </div>
@ -1964,7 +1964,7 @@ greeter("Bob")</div>
<span class="md-footer__direction"> <span class="md-footer__direction">
Previous Previous
</span> </span>
Call remote GreatAI instances How to call remote GreatAI instances
</div> </div>
</div> </div>
</a> </a>

View file

@ -554,7 +554,7 @@
<li class="md-nav__item"> <li class="md-nav__item">
<a href="../call-remote/" class="md-nav__link"> <a href="../call-remote/" class="md-nav__link">
Call remote GreatAI instances How to call remote GreatAI instances
</a> </a>
</li> </li>

View file

@ -522,7 +522,7 @@
<li class="md-nav__item"> <li class="md-nav__item">
<a href="how-to-guides/call-remote/" class="md-nav__link"> <a href="how-to-guides/call-remote/" class="md-nav__link">
Call remote GreatAI instances How to call remote GreatAI instances
</a> </a>
</li> </li>

BIN
media/remote-async.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 136 KiB

BIN
media/remote-sync.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 131 KiB

Binary file not shown.

View file

@ -450,7 +450,7 @@
<li class="md-nav__item"> <li class="md-nav__item">
<a href="../how-to-guides/call-remote/" class="md-nav__link"> <a href="../how-to-guides/call-remote/" class="md-nav__link">
Call remote GreatAI instances How to call remote GreatAI instances
</a> </a>
</li> </li>
@ -2290,7 +2290,7 @@ practices.</p></td>
<tr> <tr>
<td><code>route_config</code></td> <td><code>route_config</code></td>
<td> <td>
<code><span title="great_ai.views.RouteConfig">RouteConfig</span></code> <code><a class="autorefs autorefs-internal" title="great_ai.views.RouteConfig" href="views/#great_ai.RouteConfig">RouteConfig</a></code>
</td> </td>
<td><p>Enable or disable specific HTTP API endpoints.</p></td> <td><p>Enable or disable specific HTTP API endpoints.</p></td>
<td> <td>
@ -3342,7 +3342,9 @@ of the trace.</p></td>
<span class="normal"><a href="#__codelineno-0-65">65</a></span> <span class="normal"><a href="#__codelineno-0-65">65</a></span>
<span class="normal"><a href="#__codelineno-0-66">66</a></span> <span class="normal"><a href="#__codelineno-0-66">66</a></span>
<span class="normal"><a href="#__codelineno-0-67">67</a></span> <span class="normal"><a href="#__codelineno-0-67">67</a></span>
<span class="normal"><a href="#__codelineno-0-68">68</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-12" name="__codelineno-0-12"></a><span class="k">async</span> <span class="k">def</span> <span class="nf">call_remote_great_ai_async</span><span class="p">(</span> <span class="normal"><a href="#__codelineno-0-68">68</a></span>
<span class="normal"><a href="#__codelineno-0-69">69</a></span>
<span class="normal"><a href="#__codelineno-0-70">70</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-12" name="__codelineno-0-12"></a><span class="k">async</span> <span class="k">def</span> <span class="nf">call_remote_great_ai_async</span><span class="p">(</span>
<a id="__codelineno-0-13" name="__codelineno-0-13"></a> <span class="n">base_uri</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <a id="__codelineno-0-13" name="__codelineno-0-13"></a> <span class="n">base_uri</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
<a id="__codelineno-0-14" name="__codelineno-0-14"></a> <span class="n">data</span><span class="p">:</span> <span class="n">Mapping</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">],</span> <a id="__codelineno-0-14" name="__codelineno-0-14"></a> <span class="n">data</span><span class="p">:</span> <span class="n">Mapping</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">],</span>
<a id="__codelineno-0-15" name="__codelineno-0-15"></a> <span class="n">retry_count</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="mi">4</span><span class="p">,</span> <a id="__codelineno-0-15" name="__codelineno-0-15"></a> <span class="n">retry_count</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="mi">4</span><span class="p">,</span>
@ -3383,22 +3385,24 @@ of the trace.</p></td>
<a id="__codelineno-0-50" name="__codelineno-0-50"></a> <span class="k">try</span><span class="p">:</span> <a id="__codelineno-0-50" name="__codelineno-0-50"></a> <span class="k">try</span><span class="p">:</span>
<a id="__codelineno-0-51" name="__codelineno-0-51"></a> <span class="n">response</span><span class="o">.</span><span class="n">raise_for_status</span><span class="p">()</span> <a id="__codelineno-0-51" name="__codelineno-0-51"></a> <span class="n">response</span><span class="o">.</span><span class="n">raise_for_status</span><span class="p">()</span>
<a id="__codelineno-0-52" name="__codelineno-0-52"></a> <span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span> <a id="__codelineno-0-52" name="__codelineno-0-52"></a> <span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
<a id="__codelineno-0-53" name="__codelineno-0-53"></a> <span class="k">raise</span> <span class="n">RemoteCallError</span><span class="p">(</span><span class="s2">&quot;Unexpected status code&quot;</span><span class="p">)</span> <a id="__codelineno-0-53" name="__codelineno-0-53"></a> <span class="k">raise</span> <span class="n">RemoteCallError</span><span class="p">(</span>
<a id="__codelineno-0-54" name="__codelineno-0-54"></a> <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span> <a id="__codelineno-0-54" name="__codelineno-0-54"></a> <span class="sa">f</span><span class="s2">&quot;Unexpected status code, reason: </span><span class="si">{</span><span class="n">response</span><span class="o">.</span><span class="n">text</span><span class="si">}</span><span class="s2">&quot;</span>
<a id="__codelineno-0-55" name="__codelineno-0-55"></a> <span class="k">raise</span> <span class="n">RemoteCallError</span> <span class="kn">from</span> <span class="nn">e</span> <a id="__codelineno-0-55" name="__codelineno-0-55"></a> <span class="p">)</span>
<a id="__codelineno-0-56" name="__codelineno-0-56"></a> <a id="__codelineno-0-56" name="__codelineno-0-56"></a> <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<a id="__codelineno-0-57" name="__codelineno-0-57"></a> <span class="k">try</span><span class="p">:</span> <a id="__codelineno-0-57" name="__codelineno-0-57"></a> <span class="k">raise</span> <span class="n">RemoteCallError</span> <span class="kn">from</span> <span class="nn">e</span>
<a id="__codelineno-0-58" name="__codelineno-0-58"></a> <span class="n">trace</span> <span class="o">=</span> <span class="n">response</span><span class="o">.</span><span class="n">json</span><span class="p">()</span> <a id="__codelineno-0-58" name="__codelineno-0-58"></a>
<a id="__codelineno-0-59" name="__codelineno-0-59"></a> <span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span> <a id="__codelineno-0-59" name="__codelineno-0-59"></a> <span class="k">try</span><span class="p">:</span>
<a id="__codelineno-0-60" name="__codelineno-0-60"></a> <span class="k">raise</span> <span class="n">RemoteCallError</span><span class="p">(</span> <a id="__codelineno-0-60" name="__codelineno-0-60"></a> <span class="n">trace</span> <span class="o">=</span> <span class="n">response</span><span class="o">.</span><span class="n">json</span><span class="p">()</span>
<a id="__codelineno-0-61" name="__codelineno-0-61"></a> <span class="sa">f</span><span class="s2">&quot;JSON parsing failed </span><span class="si">{</span><span class="n">response</span><span class="o">.</span><span class="n">text</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span> <a id="__codelineno-0-61" name="__codelineno-0-61"></a> <span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
<a id="__codelineno-0-62" name="__codelineno-0-62"></a> <span class="p">)</span> <a id="__codelineno-0-62" name="__codelineno-0-62"></a> <span class="k">raise</span> <span class="n">RemoteCallError</span><span class="p">(</span>
<a id="__codelineno-0-63" name="__codelineno-0-63"></a> <span class="k">try</span><span class="p">:</span> <a id="__codelineno-0-63" name="__codelineno-0-63"></a> <span class="sa">f</span><span class="s2">&quot;JSON parsing failed </span><span class="si">{</span><span class="n">response</span><span class="o">.</span><span class="n">text</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span>
<a id="__codelineno-0-64" name="__codelineno-0-64"></a> <span class="k">if</span> <span class="n">model_class</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span> <a id="__codelineno-0-64" name="__codelineno-0-64"></a> <span class="p">)</span>
<a id="__codelineno-0-65" name="__codelineno-0-65"></a> <span class="n">trace</span><span class="p">[</span><span class="s2">&quot;output&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">model_class</span><span class="o">.</span><span class="n">parse_obj</span><span class="p">(</span><span class="n">trace</span><span class="p">[</span><span class="s2">&quot;output&quot;</span><span class="p">])</span> <a id="__codelineno-0-65" name="__codelineno-0-65"></a> <span class="k">try</span><span class="p">:</span>
<a id="__codelineno-0-66" name="__codelineno-0-66"></a> <span class="k">return</span> <span class="n">Trace</span><span class="o">.</span><span class="n">parse_obj</span><span class="p">(</span><span class="n">trace</span><span class="p">)</span> <a id="__codelineno-0-66" name="__codelineno-0-66"></a> <span class="k">if</span> <span class="n">model_class</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<a id="__codelineno-0-67" name="__codelineno-0-67"></a> <span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span> <a id="__codelineno-0-67" name="__codelineno-0-67"></a> <span class="n">trace</span><span class="p">[</span><span class="s2">&quot;output&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">model_class</span><span class="o">.</span><span class="n">parse_obj</span><span class="p">(</span><span class="n">trace</span><span class="p">[</span><span class="s2">&quot;output&quot;</span><span class="p">])</span>
<a id="__codelineno-0-68" name="__codelineno-0-68"></a> <span class="k">raise</span> <span class="n">RemoteCallError</span><span class="p">(</span><span class="s2">&quot;Could not parse Trace&quot;</span><span class="p">)</span> <a id="__codelineno-0-68" name="__codelineno-0-68"></a> <span class="k">return</span> <span class="n">Trace</span><span class="o">.</span><span class="n">parse_obj</span><span class="p">(</span><span class="n">trace</span><span class="p">)</span>
<a id="__codelineno-0-69" name="__codelineno-0-69"></a> <span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
<a id="__codelineno-0-70" name="__codelineno-0-70"></a> <span class="k">raise</span> <span class="n">RemoteCallError</span><span class="p">(</span><span class="s2">&quot;Could not parse Trace&quot;</span><span class="p">)</span>
</code></pre></div></td></tr></table></div> </code></pre></div></td></tr></table></div>
</details> </details>
</div> </div>

View file

@ -450,7 +450,7 @@
<li class="md-nav__item"> <li class="md-nav__item">
<a href="../../how-to-guides/call-remote/" class="md-nav__link"> <a href="../../how-to-guides/call-remote/" class="md-nav__link">
Call remote GreatAI instances How to call remote GreatAI instances
</a> </a>
</li> </li>

View file

@ -450,7 +450,7 @@
<li class="md-nav__item"> <li class="md-nav__item">
<a href="../../how-to-guides/call-remote/" class="md-nav__link"> <a href="../../how-to-guides/call-remote/" class="md-nav__link">
Call remote GreatAI instances How to call remote GreatAI instances
</a> </a>
</li> </li>
@ -2184,7 +2184,8 @@ process.</p></td>
<span class="normal"><a href="#__codelineno-0-57">57</a></span> <span class="normal"><a href="#__codelineno-0-57">57</a></span>
<span class="normal"><a href="#__codelineno-0-58">58</a></span> <span class="normal"><a href="#__codelineno-0-58">58</a></span>
<span class="normal"><a href="#__codelineno-0-59">59</a></span> <span class="normal"><a href="#__codelineno-0-59">59</a></span>
<span class="normal"><a href="#__codelineno-0-60">60</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-11" name="__codelineno-0-11"></a><span class="k">def</span> <span class="nf">simple_parallel_map</span><span class="p">(</span> <span class="normal"><a href="#__codelineno-0-60">60</a></span>
<span class="normal"><a href="#__codelineno-0-61">61</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-11" name="__codelineno-0-11"></a><span class="k">def</span> <span class="nf">simple_parallel_map</span><span class="p">(</span>
<a id="__codelineno-0-12" name="__codelineno-0-12"></a> <span class="n">func</span><span class="p">:</span> <span class="n">Callable</span><span class="p">[[</span><span class="n">T</span><span class="p">],</span> <span class="n">Union</span><span class="p">[</span><span class="n">V</span><span class="p">,</span> <span class="n">Awaitable</span><span class="p">[</span><span class="n">V</span><span class="p">]]],</span> <a id="__codelineno-0-12" name="__codelineno-0-12"></a> <span class="n">func</span><span class="p">:</span> <span class="n">Callable</span><span class="p">[[</span><span class="n">T</span><span class="p">],</span> <span class="n">Union</span><span class="p">[</span><span class="n">V</span><span class="p">,</span> <span class="n">Awaitable</span><span class="p">[</span><span class="n">V</span><span class="p">]]],</span>
<a id="__codelineno-0-13" name="__codelineno-0-13"></a> <span class="n">input_values</span><span class="p">:</span> <span class="n">Sequence</span><span class="p">[</span><span class="n">T</span><span class="p">],</span> <a id="__codelineno-0-13" name="__codelineno-0-13"></a> <span class="n">input_values</span><span class="p">:</span> <span class="n">Sequence</span><span class="p">[</span><span class="n">T</span><span class="p">],</span>
<a id="__codelineno-0-14" name="__codelineno-0-14"></a> <span class="o">*</span><span class="p">,</span> <a id="__codelineno-0-14" name="__codelineno-0-14"></a> <span class="o">*</span><span class="p">,</span>
@ -2222,18 +2223,19 @@ process.</p></td>
<a id="__codelineno-0-46" name="__codelineno-0-46"></a><span class="sd"> &quot;&quot;&quot;</span> <a id="__codelineno-0-46" name="__codelineno-0-46"></a><span class="sd"> &quot;&quot;&quot;</span>
<a id="__codelineno-0-47" name="__codelineno-0-47"></a> <a id="__codelineno-0-47" name="__codelineno-0-47"></a>
<a id="__codelineno-0-48" name="__codelineno-0-48"></a> <span class="n">input_values</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">input_values</span><span class="p">)</span> <span class="c1"># in case the input is mistakenly not a sequence</span> <a id="__codelineno-0-48" name="__codelineno-0-48"></a> <span class="n">input_values</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">input_values</span><span class="p">)</span> <span class="c1"># in case the input is mistakenly not a sequence</span>
<a id="__codelineno-0-49" name="__codelineno-0-49"></a> <span class="k">return</span> <span class="nb">list</span><span class="p">(</span> <a id="__codelineno-0-49" name="__codelineno-0-49"></a> <span class="n">generator</span> <span class="o">=</span> <span class="n">parallel_map</span><span class="p">(</span>
<a id="__codelineno-0-50" name="__codelineno-0-50"></a> <span class="n">tqdm</span><span class="p">(</span> <a id="__codelineno-0-50" name="__codelineno-0-50"></a> <span class="n">func</span><span class="o">=</span><span class="n">func</span><span class="p">,</span>
<a id="__codelineno-0-51" name="__codelineno-0-51"></a> <span class="n">parallel_map</span><span class="p">(</span> <a id="__codelineno-0-51" name="__codelineno-0-51"></a> <span class="n">input_values</span><span class="o">=</span><span class="n">input_values</span><span class="p">,</span>
<a id="__codelineno-0-52" name="__codelineno-0-52"></a> <span class="n">func</span><span class="o">=</span><span class="n">func</span><span class="p">,</span> <a id="__codelineno-0-52" name="__codelineno-0-52"></a> <span class="n">chunk_size</span><span class="o">=</span><span class="n">chunk_size</span><span class="p">,</span>
<a id="__codelineno-0-53" name="__codelineno-0-53"></a> <span class="n">input_values</span><span class="o">=</span><span class="n">input_values</span><span class="p">,</span> <a id="__codelineno-0-53" name="__codelineno-0-53"></a> <span class="n">concurrency</span><span class="o">=</span><span class="n">concurrency</span><span class="p">,</span>
<a id="__codelineno-0-54" name="__codelineno-0-54"></a> <span class="n">chunk_size</span><span class="o">=</span><span class="n">chunk_size</span><span class="p">,</span> <a id="__codelineno-0-54" name="__codelineno-0-54"></a> <span class="p">)</span>
<a id="__codelineno-0-55" name="__codelineno-0-55"></a> <span class="n">concurrency</span><span class="o">=</span><span class="n">concurrency</span><span class="p">,</span> <a id="__codelineno-0-55" name="__codelineno-0-55"></a>
<a id="__codelineno-0-56" name="__codelineno-0-56"></a> <span class="p">),</span> <a id="__codelineno-0-56" name="__codelineno-0-56"></a> <span class="k">return</span> <span class="nb">list</span><span class="p">(</span>
<a id="__codelineno-0-57" name="__codelineno-0-57"></a> <span class="n">total</span><span class="o">=</span><span class="nb">len</span><span class="p">(</span><span class="n">input_values</span><span class="p">),</span> <a id="__codelineno-0-57" name="__codelineno-0-57"></a> <span class="n">tqdm</span><span class="p">(</span>
<a id="__codelineno-0-58" name="__codelineno-0-58"></a> <span class="n">dynamic_ncols</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <a id="__codelineno-0-58" name="__codelineno-0-58"></a> <span class="n">generator</span><span class="p">,</span>
<a id="__codelineno-0-59" name="__codelineno-0-59"></a> <span class="p">)</span> <a id="__codelineno-0-59" name="__codelineno-0-59"></a> <span class="n">total</span><span class="o">=</span><span class="nb">len</span><span class="p">(</span><span class="n">input_values</span><span class="p">),</span>
<a id="__codelineno-0-60" name="__codelineno-0-60"></a> <span class="p">)</span> <a id="__codelineno-0-60" name="__codelineno-0-60"></a> <span class="p">)</span>
<a id="__codelineno-0-61" name="__codelineno-0-61"></a> <span class="p">)</span>
</code></pre></div></td></tr></table></div> </code></pre></div></td></tr></table></div>
</details> </details>
</div> </div>

View file

@ -450,7 +450,7 @@
<li class="md-nav__item"> <li class="md-nav__item">
<a href="../../how-to-guides/call-remote/" class="md-nav__link"> <a href="../../how-to-guides/call-remote/" class="md-nav__link">
Call remote GreatAI instances How to call remote GreatAI instances
</a> </a>
</li> </li>
@ -593,6 +593,41 @@
Trace Trace
</a> </a>
</li>
<li class="md-nav__item">
<a href="#great_ai.RouteConfig" class="md-nav__link">
RouteConfig
</a>
</li>
<li class="md-nav__item">
<a href="#great_ai.ClassificationOutput" class="md-nav__link">
ClassificationOutput
</a>
</li>
<li class="md-nav__item">
<a href="#great_ai.MultiLabelClassificationOutput" class="md-nav__link">
MultiLabelClassificationOutput
</a>
</li>
<li class="md-nav__item">
<a href="#great_ai.RegressionOutput" class="md-nav__link">
RegressionOutput
</a>
</li>
<li class="md-nav__item">
<a href="#great_ai.SequenceLabelingOutput" class="md-nav__link">
SequenceLabelingOutput
</a>
</li> </li>
</ul> </ul>
@ -765,6 +800,41 @@
Trace Trace
</a> </a>
</li>
<li class="md-nav__item">
<a href="#great_ai.RouteConfig" class="md-nav__link">
RouteConfig
</a>
</li>
<li class="md-nav__item">
<a href="#great_ai.ClassificationOutput" class="md-nav__link">
ClassificationOutput
</a>
</li>
<li class="md-nav__item">
<a href="#great_ai.MultiLabelClassificationOutput" class="md-nav__link">
MultiLabelClassificationOutput
</a>
</li>
<li class="md-nav__item">
<a href="#great_ai.RegressionOutput" class="md-nav__link">
RegressionOutput
</a>
</li>
<li class="md-nav__item">
<a href="#great_ai.SequenceLabelingOutput" class="md-nav__link">
SequenceLabelingOutput
</a>
</li> </li>
</ul> </ul>
@ -979,6 +1049,249 @@
</div>
</div>
</div>
<div class="doc doc-object doc-class">
<h3 id="great_ai.RouteConfig" class="doc doc-heading">
<code>RouteConfig</code>
<a href="#great_ai.RouteConfig" class="headerlink" title="Permanent link">#</a></h3>
<div class="doc doc-contents first">
<p class="doc doc-class-bases">
Bases: <code><span title="pydantic.BaseModel">BaseModel</span></code></p>
<details class="quote">
<summary>Source code in <code>great_ai/views/route_config.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-4"> 4</a></span>
<span class="normal"><a href="#__codelineno-0-5"> 5</a></span>
<span class="normal"><a href="#__codelineno-0-6"> 6</a></span>
<span class="normal"><a href="#__codelineno-0-7"> 7</a></span>
<span class="normal"><a href="#__codelineno-0-8"> 8</a></span>
<span class="normal"><a href="#__codelineno-0-9"> 9</a></span>
<span class="normal"><a href="#__codelineno-0-10">10</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-4" name="__codelineno-0-4"></a><span class="k">class</span> <span class="nc">RouteConfig</span><span class="p">(</span><span class="n">BaseModel</span><span class="p">):</span>
<a id="__codelineno-0-5" name="__codelineno-0-5"></a> <span class="n">prediction_endpoint_enabled</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span>
<a id="__codelineno-0-6" name="__codelineno-0-6"></a> <span class="n">docs_endpoints_enabled</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span>
<a id="__codelineno-0-7" name="__codelineno-0-7"></a> <span class="n">dashboard_enabled</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span>
<a id="__codelineno-0-8" name="__codelineno-0-8"></a> <span class="n">feedback_endpoints_enabled</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span>
<a id="__codelineno-0-9" name="__codelineno-0-9"></a> <span class="n">trace_endpoints_enabled</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span>
<a id="__codelineno-0-10" name="__codelineno-0-10"></a> <span class="n">meta_endpoints_enabled</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span>
</code></pre></div></td></tr></table></div>
</details>
<div class="doc doc-children">
</div>
</div>
</div>
<div class="doc doc-object doc-class">
<h3 id="great_ai.ClassificationOutput" class="doc doc-heading">
<code>ClassificationOutput</code>
<a href="#great_ai.ClassificationOutput" class="headerlink" title="Permanent link">#</a></h3>
<div class="doc doc-contents first">
<p class="doc doc-class-bases">
Bases: <code><span title="great_ai.views.hashable_base_model.HashableBaseModel">HashableBaseModel</span></code></p>
<details class="quote">
<summary>Source code in <code>great_ai/views/outputs/classification_output.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-6">6</a></span>
<span class="normal"><a href="#__codelineno-0-7">7</a></span>
<span class="normal"><a href="#__codelineno-0-8">8</a></span>
<span class="normal"><a href="#__codelineno-0-9">9</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-6" name="__codelineno-0-6"></a><span class="k">class</span> <span class="nc">ClassificationOutput</span><span class="p">(</span><span class="n">HashableBaseModel</span><span class="p">):</span>
<a id="__codelineno-0-7" name="__codelineno-0-7"></a> <span class="n">label</span><span class="p">:</span> <span class="n">Union</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">int</span><span class="p">]</span>
<a id="__codelineno-0-8" name="__codelineno-0-8"></a> <span class="n">confidence</span><span class="p">:</span> <span class="nb">float</span>
<a id="__codelineno-0-9" name="__codelineno-0-9"></a> <span class="n">explanation</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="n">Any</span><span class="p">]</span>
</code></pre></div></td></tr></table></div>
</details>
<div class="doc doc-children">
</div>
</div>
</div>
<div class="doc doc-object doc-class">
<h3 id="great_ai.MultiLabelClassificationOutput" class="doc doc-heading">
<code>MultiLabelClassificationOutput</code>
<a href="#great_ai.MultiLabelClassificationOutput" class="headerlink" title="Permanent link">#</a></h3>
<div class="doc doc-contents first">
<p class="doc doc-class-bases">
Bases: <code><span title="great_ai.views.hashable_base_model.HashableBaseModel">HashableBaseModel</span></code></p>
<details class="quote">
<summary>Source code in <code>great_ai/views/outputs/multi_label_classification_output.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-7">7</a></span>
<span class="normal"><a href="#__codelineno-0-8">8</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-7" name="__codelineno-0-7"></a><span class="k">class</span> <span class="nc">MultiLabelClassificationOutput</span><span class="p">(</span><span class="n">HashableBaseModel</span><span class="p">):</span>
<a id="__codelineno-0-8" name="__codelineno-0-8"></a> <span class="n">labels</span><span class="p">:</span> <span class="n">List</span><span class="p">[</span><span class="n">ClassificationOutput</span><span class="p">]</span> <span class="o">=</span> <span class="p">[]</span>
</code></pre></div></td></tr></table></div>
</details>
<div class="doc doc-children">
</div>
</div>
</div>
<div class="doc doc-object doc-class">
<h3 id="great_ai.RegressionOutput" class="doc doc-heading">
<code>RegressionOutput</code>
<a href="#great_ai.RegressionOutput" class="headerlink" title="Permanent link">#</a></h3>
<div class="doc doc-contents first">
<p class="doc doc-class-bases">
Bases: <code><span title="great_ai.views.hashable_base_model.HashableBaseModel">HashableBaseModel</span></code></p>
<details class="quote">
<summary>Source code in <code>great_ai/views/outputs/regression_output.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-6">6</a></span>
<span class="normal"><a href="#__codelineno-0-7">7</a></span>
<span class="normal"><a href="#__codelineno-0-8">8</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-6" name="__codelineno-0-6"></a><span class="k">class</span> <span class="nc">RegressionOutput</span><span class="p">(</span><span class="n">HashableBaseModel</span><span class="p">):</span>
<a id="__codelineno-0-7" name="__codelineno-0-7"></a> <span class="n">value</span><span class="p">:</span> <span class="n">Union</span><span class="p">[</span><span class="nb">int</span><span class="p">,</span> <span class="nb">float</span><span class="p">]</span>
<a id="__codelineno-0-8" name="__codelineno-0-8"></a> <span class="n">explanation</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="n">Any</span><span class="p">]</span>
</code></pre></div></td></tr></table></div>
</details>
<div class="doc doc-children">
</div>
</div>
</div>
<div class="doc doc-object doc-class">
<h3 id="great_ai.SequenceLabelingOutput" class="doc doc-heading">
<code>SequenceLabelingOutput</code>
<a href="#great_ai.SequenceLabelingOutput" class="headerlink" title="Permanent link">#</a></h3>
<div class="doc doc-contents first">
<p class="doc doc-class-bases">
Bases: <code><span title="great_ai.views.hashable_base_model.HashableBaseModel">HashableBaseModel</span></code></p>
<details class="quote">
<summary>Source code in <code>great_ai/views/outputs/sequence_labeling_output.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-13">13</a></span>
<span class="normal"><a href="#__codelineno-0-14">14</a></span>
<span class="normal"><a href="#__codelineno-0-15">15</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-13" name="__codelineno-0-13"></a><span class="k">class</span> <span class="nc">SequenceLabelingOutput</span><span class="p">(</span><span class="n">HashableBaseModel</span><span class="p">):</span>
<a id="__codelineno-0-14" name="__codelineno-0-14"></a> <span class="n">labeled_tokens</span><span class="p">:</span> <span class="n">List</span><span class="p">[</span><span class="n">LabeledToken</span><span class="p">]</span>
<a id="__codelineno-0-15" name="__codelineno-0-15"></a> <span class="n">explanation</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="n">Any</span><span class="p">]</span>
</code></pre></div></td></tr></table></div>
</details>
<div class="doc doc-children">
</div> </div>
</div> </div>
@ -990,7 +1303,7 @@
<small> <small>
Last update: Last update:
<span class="git-revision-date-localized-plugin git-revision-date-localized-plugin-date">July 11, 2022</span> <span class="git-revision-date-localized-plugin git-revision-date-localized-plugin-date">July 13, 2022</span>
</small> </small>

View file

@ -3,3 +3,23 @@
::: great_ai.Trace ::: great_ai.Trace
options: options:
show_root_heading: true show_root_heading: true
::: great_ai.RouteConfig
options:
show_root_heading: true
::: great_ai.ClassificationOutput
options:
show_root_heading: true
::: great_ai.MultiLabelClassificationOutput
options:
show_root_heading: true
::: great_ai.RegressionOutput
options:
show_root_heading: true
::: great_ai.SequenceLabelingOutput
options:
show_root_heading: true

File diff suppressed because one or more lines are too long

View file

@ -2,107 +2,107 @@
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url> <url>
<loc>None</loc> <loc>None</loc>
<lastmod>2022-07-12</lastmod> <lastmod>2022-07-13</lastmod>
<changefreq>daily</changefreq> <changefreq>daily</changefreq>
</url> </url>
<url> <url>
<loc>None</loc> <loc>None</loc>
<lastmod>2022-07-12</lastmod> <lastmod>2022-07-13</lastmod>
<changefreq>daily</changefreq> <changefreq>daily</changefreq>
</url> </url>
<url> <url>
<loc>None</loc> <loc>None</loc>
<lastmod>2022-07-12</lastmod> <lastmod>2022-07-13</lastmod>
<changefreq>daily</changefreq> <changefreq>daily</changefreq>
</url> </url>
<url> <url>
<loc>None</loc> <loc>None</loc>
<lastmod>2022-07-12</lastmod> <lastmod>2022-07-13</lastmod>
<changefreq>daily</changefreq> <changefreq>daily</changefreq>
</url> </url>
<url> <url>
<loc>None</loc> <loc>None</loc>
<lastmod>2022-07-12</lastmod> <lastmod>2022-07-13</lastmod>
<changefreq>daily</changefreq> <changefreq>daily</changefreq>
</url> </url>
<url> <url>
<loc>None</loc> <loc>None</loc>
<lastmod>2022-07-12</lastmod> <lastmod>2022-07-13</lastmod>
<changefreq>daily</changefreq> <changefreq>daily</changefreq>
</url> </url>
<url> <url>
<loc>None</loc> <loc>None</loc>
<lastmod>2022-07-12</lastmod> <lastmod>2022-07-13</lastmod>
<changefreq>daily</changefreq> <changefreq>daily</changefreq>
</url> </url>
<url> <url>
<loc>None</loc> <loc>None</loc>
<lastmod>2022-07-12</lastmod> <lastmod>2022-07-13</lastmod>
<changefreq>daily</changefreq> <changefreq>daily</changefreq>
</url> </url>
<url> <url>
<loc>None</loc> <loc>None</loc>
<lastmod>2022-07-12</lastmod> <lastmod>2022-07-13</lastmod>
<changefreq>daily</changefreq> <changefreq>daily</changefreq>
</url> </url>
<url> <url>
<loc>None</loc> <loc>None</loc>
<lastmod>2022-07-12</lastmod> <lastmod>2022-07-13</lastmod>
<changefreq>daily</changefreq> <changefreq>daily</changefreq>
</url> </url>
<url> <url>
<loc>None</loc> <loc>None</loc>
<lastmod>2022-07-12</lastmod> <lastmod>2022-07-13</lastmod>
<changefreq>daily</changefreq> <changefreq>daily</changefreq>
</url> </url>
<url> <url>
<loc>None</loc> <loc>None</loc>
<lastmod>2022-07-12</lastmod> <lastmod>2022-07-13</lastmod>
<changefreq>daily</changefreq> <changefreq>daily</changefreq>
</url> </url>
<url> <url>
<loc>None</loc> <loc>None</loc>
<lastmod>2022-07-12</lastmod> <lastmod>2022-07-13</lastmod>
<changefreq>daily</changefreq> <changefreq>daily</changefreq>
</url> </url>
<url> <url>
<loc>None</loc> <loc>None</loc>
<lastmod>2022-07-12</lastmod> <lastmod>2022-07-13</lastmod>
<changefreq>daily</changefreq> <changefreq>daily</changefreq>
</url> </url>
<url> <url>
<loc>None</loc> <loc>None</loc>
<lastmod>2022-07-12</lastmod> <lastmod>2022-07-13</lastmod>
<changefreq>daily</changefreq> <changefreq>daily</changefreq>
</url> </url>
<url> <url>
<loc>None</loc> <loc>None</loc>
<lastmod>2022-07-12</lastmod> <lastmod>2022-07-13</lastmod>
<changefreq>daily</changefreq> <changefreq>daily</changefreq>
</url> </url>
<url> <url>
<loc>None</loc> <loc>None</loc>
<lastmod>2022-07-12</lastmod> <lastmod>2022-07-13</lastmod>
<changefreq>daily</changefreq> <changefreq>daily</changefreq>
</url> </url>
<url> <url>
<loc>None</loc> <loc>None</loc>
<lastmod>2022-07-12</lastmod> <lastmod>2022-07-13</lastmod>
<changefreq>daily</changefreq> <changefreq>daily</changefreq>
</url> </url>
<url> <url>
<loc>None</loc> <loc>None</loc>
<lastmod>2022-07-12</lastmod> <lastmod>2022-07-13</lastmod>
<changefreq>daily</changefreq> <changefreq>daily</changefreq>
</url> </url>
<url> <url>
<loc>None</loc> <loc>None</loc>
<lastmod>2022-07-12</lastmod> <lastmod>2022-07-13</lastmod>
<changefreq>daily</changefreq> <changefreq>daily</changefreq>
</url> </url>
<url> <url>
<loc>None</loc> <loc>None</loc>
<lastmod>2022-07-12</lastmod> <lastmod>2022-07-13</lastmod>
<changefreq>daily</changefreq> <changefreq>daily</changefreq>
</url> </url>
</urlset> </urlset>

Binary file not shown.

View file

@ -493,7 +493,7 @@
<li class="md-nav__item"> <li class="md-nav__item">
<a href="../../how-to-guides/call-remote/" class="md-nav__link"> <a href="../../how-to-guides/call-remote/" class="md-nav__link">
Call remote GreatAI instances How to call remote GreatAI instances
</a> </a>
</li> </li>

View file

@ -527,7 +527,7 @@
<li class="md-nav__item"> <li class="md-nav__item">
<a href="../how-to-guides/call-remote/" class="md-nav__link"> <a href="../how-to-guides/call-remote/" class="md-nav__link">
Call remote GreatAI instances How to call remote GreatAI instances
</a> </a>
</li> </li>

View file

@ -493,7 +493,7 @@
<li class="md-nav__item"> <li class="md-nav__item">
<a href="../../how-to-guides/call-remote/" class="md-nav__link"> <a href="../../how-to-guides/call-remote/" class="md-nav__link">
Call remote GreatAI instances How to call remote GreatAI instances
</a> </a>
</li> </li>