是否有在 Google Colab 上运行 Web 应用程序的通用方法?

Posted

技术标签:

【中文标题】是否有在 Google Colab 上运行 Web 应用程序的通用方法?【英文标题】:Is there a general way to run Web Applications on Google Colab? 【发布时间】:2020-05-01 15:10:18 【问题描述】:

我想在 Google colab 中开发网络应用。唯一的问题是您需要连接到本地主机的浏览器才能查看网络应用程序,但 Google colab 在笔记本中没有浏览器。

但似乎有办法解决这个问题。例如 run_with_ngrok 是一个用于在 colab/jupyter 笔记本中运行 flaks 应用程序的库

https://github.com/gstaff/flask-ngrok#inside-jupyter--colab-notebooks

当你使用它时,它会给出一个随机地址,“Running on http://.ngrok.io”

不知何故,在 Google colab 上运行的 web 应用程序正在该地址上运行。

这对于 Flask 应用程序来说是一个很好的解决方案,但我希望在 Google Colab 上运行一般的网络应用程序,而不仅仅是 Flask 应用程序。有没有在 colab/jupyter 笔记本中运行 webapp 的通用方法?

【问题讨论】:

我不这么认为,bcs colab 不提供静态 ip 或域 google colab 是为计算而非网络服务器而创建的。使用 Flask/Django 创建本地 Web 服务器并将其部署在普通的外部服务器上 - 一开始你可以尝试PythonAnywhere.com 【参考方案1】:

您可以计划在端口上启动服务器,例如端口=8000。找到要以这种方式使用的 URL。

from google.colab.output import eval_js
print(eval_js("google.colab.kernel.proxyPort(8000)"))
# https://z4spb7cvssd-496ff2e9c6d22116-8000-colab.googleusercontent.com/

然后,启动服务器,例如

!python -m http.server 8000

然后单击上面的第一个链接(而不是 localhost 或 127.0.0.1),它将在新选项卡中打开。

在单元格中显示

您可以在输出部分的 iframe 中显示结果。我把它变成了一个易于调用的函数。

from IPython.display import javascript

def show_port(port, height=400):
  display(Javascript("""
  (async ()=>
    fm = document.createElement('iframe')
    fm.src = await google.colab.kernel.proxyPort(%s)
    fm.width = '95%%'
    fm.height = '%d'
    fm.frameBorder = 0
    document.body.append(fm)
  )();
  """ % (port, height) ))

现在您可以在后台启动一个 webapp(这里是 http.server)。并将结果显示为其下方的 iframe。

get_ipython().system_raw('python3 -m http.server 8888 &') 
show_port(8888)

要停止服务器,您可以调用ps 并终止该进程。

【讨论】:

【参考方案2】:

答案在这里

Launch a Dash app in a Google Colab Notebook

### Install ngrok
!wget https://bin.equinox.io/c/4VmDzA7iaHb/ngrok-stable-linux-amd64.zip
!unzip ngrok-stable-linux-amd64.zip

### Run ngrok to tunnel Dash app port 8050 to the outside world. 
### This command runs in the background.
get_ipython().system_raw('./ngrok http 8050 &')

### Get the public URL where you can access the Dash app. Copy this URL.
! curl -s http://localhost:4040/api/tunnels | python3 -c \
    "import sys, json; print(json.load(sys.stdin)['tunnels'][0]['public_url'])"

然后在端口 8050 上启动你的 webapp

【讨论】:

过去 2 天我在 kaggle 内核中启动 Dash 应用程序时遇到了类似的问题,您的解决方案运行良好,非常感谢。还有另一种方法可以使用 iframe 在 jupyter 内联中启动 dash 应用程序,但它适用于本地 jupyter notebook 而不是 kaggle 或 colab,所以再次感谢,尽管我仍在研究在 jupyter 本身内启动它的方法。【参考方案3】:

这是一个示例,说明如何启动 Web 服务器并将资源提供给 Colab 输出框架。

https://colab.research.google.com/notebooks/snippets/advanced_outputs.ipynb#scrollTo=R8ZvCXC5A0wT

Colab 缓存服务输出,以便笔记本无需重新执行即可呈现。对于实时服务器,用户需要重新执行代码来启动服务器。但是,之后,Colab 会将引用 localhost 的输出帧中的请求代理到 Colab 后端。

【讨论】:

我看到了“自定义服务器”的代码部分,但似乎有些东西不起作用。唯一的输出是“脚本结果!”。我认为它应该显示某种输出,但我什么也没看到。【参考方案4】:

您可以查看我的示例笔记本

https://colab.research.google.com/github/popcornylu/web-server-in-colab/blob/main/web_server_in_colab.ipynb

    定义线魔法
from IPython.core.magic import register_line_magic
import subprocess

@register_line_magic
def run_local_server(line):
    handle = IPython.display.display(
            IPython.display.Pretty("Launching my server..."),
            display_id=True,
    )
    subprocess.Popen(['python', '-m', 'http.server'])
    shell = """
        (async () => 
            const url = new URL(await google.colab.kernel.proxyPort(8000, 'cache': true));
            const iframe = document.createElement('iframe');
            iframe.src = url;
            iframe.setAttribute('width', '100%');
            iframe.setAttribute('height', '400');
            iframe.setAttribute('frameborder', 0);
            document.body.appendChild(iframe);
        )();
    """
    script = IPython.display.Javascript(shell)
    handle.update(script)
    在另一个单元格中使用线魔法
%run_local_server

它允许您在应用程序包中实现您的线路魔法。

【讨论】:

【参考方案5】:

下面的解决方案,解释

    在后台运行 python 脚本/API 获取 Web 链接以访问浏览器选项卡中的脚本输出 使用cherrypy将脚本配置为ip:port上的web服务器 在脚本中创建定义(端点,例如:/index)。

在后台运行脚本,请使用以下代码,该代码将输出一个类似于https://wrea1crizb-496ff2e9c6d22116-8888-colab.googleusercontent.com/ 的链接,通过该链接可以在网络浏览器上查看输出 .

!pip install CherryPy #webserver package

#bind the port 8888 and get a weblink to access
from google.colab.output import eval_js
print(eval_js("google.colab.kernel.proxyPort(8888)"))

#run the script/API in the background
import subprocess
subprocess.Popen(["python", "/content/test.py", "8888"]) 

创建test.py 文件并添加以下代码,

import cherrypy
import sys

class HelloWorld:
    def index(self):
        return "Hello World!"
    index.exposed = True
if __name__ == '__main__':
   config = 'server.socket_host': '0.0.0.0','server.socket_port' : int(sys.argv[1])
   cherrypy.config.update(config)
   cherrypy.quickstart(HelloWorld())

【讨论】:

以上是关于是否有在 Google Colab 上运行 Web 应用程序的通用方法?的主要内容,如果未能解决你的问题,请参考以下文章

google.colab 模块中是不是有关闭运行时的功能

当我在 Google Colab 上运行深度学习训练代码时,生成的权重和偏差是不是会保存在某个地方?

当我关闭浏览器时,Google Colab 是不是保持连接?

在 Google Colab 中打开网络摄像头

如何在 google colab 中启用拼写检查器(colab 在 linux OS 上运行)?

pip 安装了 google.colab,现在无法在 Jupyter 笔记本上运行代码