安装+刷新后,使用IJava的Google Colab笔记本卡在“连接”状态

djp7away  于 2022-12-17  发布在  Java
关注(0)|答案(2)|浏览(311)

在最初的IJava安装和浏览器页面刷新之后,我所有的笔记本都停止了连接。

曾经管用的

1.执行此第一个单元格

!wget https://github.com/SpencerPark/IJava/releases/download/v1.3.0/ijava-1.3.0.zip 
!unzip ijava-1.3.0.zip 
!python install.py --sys-prefix

1.等待Installed java kernel消息
1.刷新浏览器页面。
1.使用Java代码执行任何单元格。

现在发生的是

我可以执行第一个单元格并获得Installed java kernel消息,看到笔记本状态为“Connected”。
但刷新页面后,笔记本的状态永远停留在“正在连接”,
因此没有单元可以被执行。

我免费使用GoogleColab,但由于初始安装仍然有效,并且在页面刷新之前笔记本状态为“已连接”,这应该不是问题所在。
知道有什么变化吗?我怎样才能让我的Java笔记本电脑再次连接?

更新1

页面重新加载后,当我尝试运行包含Java代码的单元格时,过了一会儿,我得到了以下错误消息:

await connected: disconnected
@https://ssl.gstatic.com/colaboratory-static/common/5f9fa09db4e185842380071022f6c9a6/external_polymer_binary_l10n__en_gb.js:6249:377
promiseReactionJob@[native code]

此外,笔记本设置包括
运行时类型:java
硬件加速器:None
这些单元包含非常简单的Java代码,没有外部库,没有CPU或GPU密集型的东西。
出于调试的目的,我尝试运行其他单元格(比如安装了Java或Python代码的单元格)--当然,它们也不能在没有连接的情况下执行。

更新2

在安装IJava之后和页面重新加载之前,我注意到Java内核的路径与“预安装”的ir和python3内核的路径不同:

!jupyter kernelspec list

 Available kernels:
  ir         /usr/local/share/jupyter/kernels/ir
  python3    /usr/local/share/jupyter/kernels/python3
  java       /usr/share/jupyter/kernels/java

这就是问题所在吗?
(我以前从未检查过,所以我不知道最近是否更改了默认路径。)
以下是ipynb文件的元数据内容:

{
    "nbformat": 4,
    "nbformat_minor": 0,
    "metadata": {
        "colab": {
            "provenance": [{
                "file_id": "...",
                "timestamp": 1670411565504
            }, {
                "file_id": "...",
                "timestamp": 1670311531999
            }, {
                "file_id": "...",
                "timestamp": 1605675807586
            }],
            "authorship_tag": "..."
        },
        "kernelspec": {
            "name": "java",
            "display_name": "java"
        }
    },
    "cells": [{
       ...
    ]}
}
arknldoa

arknldoa1#

在某个时候,colab将默认传输更改为ipc(从默认的tcp),这不受IJava支持。
/usr/bin/python3 /usr/local/bin/jupyter-notebook --ip=... --transport=ipc --port=...
内核启动了,但从未正确连接,也没有发送jupyter等待的初始内核信息消息。
当/如果有一个点,我们可以要求启动tcp传输代替,这将是更可取的(见https://github.com/googlecolab/colabtools/issues/3267),但目前我们可以解决它。
解决方法是在java内核前面粘贴一个小的本地代理,它连接所有的ipc通道,并将它们转发到另一组连接到java内核的tcp通道。
第一个单元格仍然是通常的安装/设置,但也包括代理的安装:

%%sh
# Install java kernel
wget -q https://github.com/SpencerPark/IJava/releases/download/v1.3.0/ijava-1.3.0.zip 
unzip -q ijava-1.3.0.zip 
python install.py

# Install proxy for the java kernel
wget -qO- https://gist.github.com/SpencerPark/e2732061ad19c1afa4a33a58cb8f18a9/archive/b6cff2bf09b6832344e576ea1e4731f0fb3df10c.tar.gz | tar xvz --strip-components=1
python install_ipc_proxy_kernel.py --kernel=java --implementation=ipc_proxy_kernel.py

运行该单元格。您可能有Unrecognized runtime "java"; defaulting to "python3",这是可以的。运行单元格后,输出类似于:

Installed java kernel into "/usr/local/share/jupyter/kernels/java"
e2732061ad19c1afa4a33a58cb8f18a9-b6cff2bf09b6832344e576ea1e4731f0fb3df10c/install_ipc_proxy_kernel.py
e2732061ad19c1afa4a33a58cb8f18a9-b6cff2bf09b6832344e576ea1e4731f0fb3df10c/ipc_proxy_kernel.py
Moving java kernel from /usr/local/share/jupyter/kernels/java...
Wrote modified kernel.json for java_tcp in /usr/local/share/jupyter/kernels/java_tcp/kernel.json
Installing the proxy kernel in place of java in /usr/local/share/jupyter/kernels/java
Installed proxy kernelspec: {"argv": ["/usr/bin/python3", "/usr/local/share/jupyter/kernels/java/ipc_proxy_kernel.py", "{connection_file}", "--kernel=java_tcp"], "env": {}, "display_name": "Java", "language": "java", "interrupt_mode": "message", "metadata": {}}
Proxy kernel installed. Go to 'Runtime > Change runtime type' and select 'java'
install.py:164: DeprecationWarning: replace is ignored. Installing a kernelspec always replaces an existing installation
  install_dest = KernelSpecManager().install_kernel_spec(

按照印刷说明操作:Go to 'Runtime > Change runtime type' and select 'java'。运行时现在应该显示“已连接到java...”,您应该能够编写和执行java代码。
尝试https://colab.research.google.com/gist/SpencerPark/447de114fcd3e6a272dc140809462e30作为基本笔记本电脑的示例。
这个setup单元应该包含了运行所需的一切,但这里对代理内核中的内容做了一些解释,它作为一个要点(https://gist.github.com/SpencerPark/e2732061ad19c1afa4a33a58cb8f18a9)发布,其总体思路是:
1.使用后缀_tcpjava_tcp)重命名真实的内核,并使用预期名称(java)在其位置安装代理。
1.启动代理内核并绑定所有内容,就好像代理本身就是内核一样。

shell_socket = create_and_bind_socket(shell_port, zmq.ROUTER)
stdin_socket = create_and_bind_socket(stdin_port, zmq.ROUTER)
control_socket = create_and_bind_socket(control_port, zmq.ROUTER)
iopub_socket = create_and_bind_socket(iopub_port, zmq.PUB)
hb_socket = create_and_bind_socket(hb_port, zmq.REP)

1.使用支持的参数(transport "tcp")和相同的会话信息启动真实的的内核。这一点非常重要,这样我们就可以直接将消息转发到真正的内核,而无需在中间解码它们。

kernel_manager = KernelManager()
kernel_manager.kernel_name = args.kernel
kernel_manager.transport = "tcp"
kernel_manager.client_factory = ProxyKernelClient
kernel_manager.autorestart = False

kernel_manager.session.signature_scheme = signature_scheme
kernel_manager.session.key = key

kernel_manager.start_kernel()

1.为每对通道启动ZMQ代理(这是X1 M10 N1 X所做的全部)。

Thread(target=zmq.proxy, args=(proxy_server_socket, self.kernel_client_socket)).start()

1.那么我们就完成了!2只要等待托管内核进程退出,然后我们自己也退出。

exit_code = kernel_manager.kernel.wait()
kernel_client.stop_channels()
zmq_context.destroy(0)
exit(exit_code)
q8l4jmvw

q8l4jmvw2#

可能是内核安装不正确或Colab无法识别内核。
要解决此问题,您可以尝试以下步骤:
1.重新启动运行时:在Colab中,点击“运行时”菜单并选择“重新启动运行时”。这将停止并重新启动运行时,这可能会修复内核安装的任何问题。
1.检查内核安装:要检查IJava内核是否安装正确,可以在Colab单元格中运行以下命令:
!jupyter内核规范列表
这个命令会打印一个可用内核的列表,如果java内核安装正确,它应该包含在列表中。如果java内核没有列出,你可能需要重新安装IJava。
1.在笔记本中指定内核:如果内核安装正确,您可能需要在Colab笔记本中指定内核。为此,单击“运行时”菜单并选择“更改运行时类型”。在“运行时类型”对话框中,从“内核”旁边的下拉菜单中选择“Java”。这将指定笔记本的Java内核。

在问题更新2后更新答案:

可能是Java内核路径的差异导致了您的问题。当您安装IJava时,它会将Java内核安装在/usr/share/jupyter/kernels/java目录下,而其他内核默认安装在/usr/local/share/jupyter/kernels/目录下。
要解决此问题,您可以尝试将java目录从/usr/share/jupyter/kernels/移动到/usr/local/share/jupyter/kernels/。为此,您可以使用以下命令:

sudo mv /usr/share/jupyter/kernels/java /usr/local/share/jupyter/kernels/

这将把Java内核移动到与其他内核相同的目录,这样Jupyter就可以找到它。
移动内核后,您可能需要重新启动Jupyter以使更改生效。您可以通过运行以下命令来完成此操作:

jupyter notebook stop

然后,可以通过运行以下命令再次启动服务器:

jupyter notebook

这将启动Jupyter服务器,并且Java内核可用。您可以通过再次运行!jupyter kernelspec list命令来验证内核是否可用。现在,输出应在可用内核列表中包含Java内核。

相关问题