0% found this document useful (0 votes)
244 views6 pages

RDP Google Colab Gpu Vncremote

The document describes code for setting up a remote desktop environment in a Colab notebook using Ngrok and TurboVNC. It downloads required software packages, configures password authentication, sets up an Ngrok SSH tunnel, installs a GPU driver if available, and runs the VNC server. The summary is: The code sets up a remote desktop by downloading software, configuring passwords, creating an Ngrok SSH tunnel, installing GPU drivers if available, and running a VNC server. It handles tasks like downloading packages, setting up users/passwords, starting processes, and handling errors to enable remote access and desktop sharing of the Colab runtime environment.

Uploaded by

Kucing
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
244 views6 pages

RDP Google Colab Gpu Vncremote

The document describes code for setting up a remote desktop environment in a Colab notebook using Ngrok and TurboVNC. It downloads required software packages, configures password authentication, sets up an Ngrok SSH tunnel, installs a GPU driver if available, and runs the VNC server. The summary is: The code sets up a remote desktop by downloading software, configuring passwords, creating an Ngrok SSH tunnel, installing GPU drivers if available, and running a VNC server. It handles tasks like downloading packages, setting up users/passwords, starting processes, and handling errors to enable remote access and desktop sharing of the Colab runtime environment.

Uploaded by

Kucing
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
You are on page 1/ 6

#@title Start GUI Colab

import apt, apt.debfile


import pathlib, stat, shutil, urllib.request, subprocess, getpass, time, tempfile
import secrets, json, re
import IPython.utils.io
import ipywidgets
import os
from IPython.display import clear_output

class _NoteProgress(apt.progress.base.InstallProgress,
apt.progress.base.AcquireProgress, apt.progress.base.OpProgress):
def __init__(self):
apt.progress.base.InstallProgress.__init__(self)
self._label = ipywidgets.Label()
display(self._label)
self._float_progress = ipywidgets.FloatProgress(min = 0.0, max = 1.0, layout =
{'border':'1px solid #118800'})
display(self._float_progress)

def close(self):
self._float_progress.close()
self._label.close()

def fetch(self, item):


self._label.value = "fetch: " + item.shortdesc

def pulse(self, owner):


self._float_progress.value = self.current_items / self.total_items
return True

def status_change(self, pkg, percent, status):


self._label.value = "%s: %s" % (pkg, status)
self._float_progress.value = percent / 100.0

def update(self, percent=None):


self._float_progress.value = self.percent / 100.0
self._label.value = self.op + ": " + self.subop

def done(self, item=None):


pass

class _MyApt:
def __init__(self):
self._progress = _NoteProgress()
self._cache = apt.Cache(self._progress)

def close(self):
self._cache.close()
self._cache = None
self._progress.close()
self._progress = None

def update_upgrade(self):
self._cache.update()
self._cache.open(None)
self._cache.upgrade()

def commit(self):
self._cache.commit(self._progress, self._progress)
self._cache.clear()

def installPkg(self, *args):


for name in args:
pkg = self._cache[name]
if pkg.is_installed:
print(f"{name} is already installed")
else:
pkg.mark_install()

def installDebPackage(self, name):


apt.debfile.DebPackage(name, self._cache).install()

def deleteInstalledPkg(self, *args):


for pkg in self._cache:
if pkg.is_installed:
for name in args:
if pkg.name.startswith(name):
#print(f"Delete {pkg.name}")
pkg.mark_delete()

def _download(url, path):


try:
with urllib.request.urlopen(url) as response:
with open(path, 'wb') as outfile:
shutil.copyfileobj(response, outfile)
except:
print("Failed to download ", url)
raise

def _get_gpu_name():
r = subprocess.run(["nvidia-smi", "--query-gpu=name", "--format=csv,noheader"],
stdout = subprocess.PIPE, universal_newlines = True)
if r.returncode != 0:
return None
return r.stdout.strip()

def _check_gpu_available():
gpu_name = _get_gpu_name()
if gpu_name == None:
print("This is not a runtime with GPU")
else:
return True

return True

def _setupSSHDImpl(ngrok_token, ngrok_region, is_VNC):

msg = ""

if not os.path.exists('ngrok.zip'):
_download("https://bin.equinox.io/c/4VmDzA7iaHb/ngrok-stable-linux-amd64.zip",
"ngrok.zip")
shutil.unpack_archive("ngrok.zip")
pathlib.Path("ngrok").chmod(stat.S_IXUSR)

root_password = "12345678"
user_password = "12345678"
user_name = "colab"
msg += "✂️"*24 + "\n"
msg += f"root password: {root_password}\n"
msg += f"{user_name} password: {user_password}\n"
msg += "✂️"*24 + "\n"
subprocess.run(["useradd", "-s", "/bin/bash", "-m", user_name])
subprocess.run(["adduser", user_name, "sudo"], check = True)
subprocess.run(["chpasswd"], input = f"root:{root_password}", universal_newlines
= True)
subprocess.run(["chpasswd"], input = f"{user_name}:{user_password}",
universal_newlines = True)

if not pathlib.Path('/root/.ngrok2/ngrok.yml').exists():
subprocess.run(["./ngrok", "authtoken", ngrok_token])

ngrok_proc = subprocess.Popen(["./ngrok", "tcp", "-region", ngrok_region,


"5901"])
time.sleep(2)

with urllib.request.urlopen("http://localhost:4040/api/tunnels") as response:


url = json.load(response)['tunnels'][0]['public_url']
m = re.match("tcp://(.+):(\d+)", url)

hostname = m.group(1)
port = m.group(2)

if is_VNC:
msg += "Ready to Connect TurboVNC viewer:\n"
msg += f"{hostname}:{port}\n"
return msg

def _setupSSHDMain(ngrok_region, check_gpu_available, is_VNC):


if check_gpu_available and not _check_gpu_available():
return (False, "")

gpu_name = _get_gpu_name()
if gpu_name == None:
print("------------------------------")

print("Copy&paste your tunnel authtoken from https://dashboard.ngrok.com/auth")


print("(You need to sign up for ngrok and login,)")
#Set your ngrok Authtoken.
ngrok_token = getpass.getpass()
clear_output()

if not ngrok_region:
print("Select your ngrok region :")
print("us - United States (Ohio)")
print("eu - Europe (Frankfurt)")
print("ap - Asia/Pacific (Singapore)")
print("au - Australia (Sydney)")
print("sa - South America (Sao Paulo)")
print("jp - Japan (Tokyo)")
print("in - India (Mumbai)")
ngrok_region = region = input()
clear_output()
apps()

return (True, _setupSSHDImpl(ngrok_token, ngrok_region, is_VNC))


def _setup_nvidia_gl():
ret = subprocess.run(
["nvidia-smi", "--query-gpu=driver_version", "--
format=csv,noheader"],
stdout = subprocess.PIPE,
check = True,
universal_newlines = True)
nvidia_version = ret.stdout.strip()
nvidia_url = "https://us.download.nvidia.com/tesla/{0}/NVIDIA-Linux-x86_64-
{0}.run".format(nvidia_version)
_download(nvidia_url, "nvidia.run")
pathlib.Path("nvidia.run").chmod(stat.S_IXUSR)
subprocess.run(["./nvidia.run", "--no-kernel-module", "--ui=none"], input =
"1\n", check = True, universal_newlines = True)

#https://virtualgl.org/Documentation/HeadlessNV
subprocess.run(["nvidia-xconfig",
"-a",
"--allow-empty-initial-configuration",
"--virtual=1920x1200",
"--busid", "PCI:0:4:0"],
check = True
)

with open("/etc/X11/xorg.conf", "r") as f:


conf = f.read()
conf = re.sub('(Section "Device".*?)(EndSection)',
'\\1 MatchSeat "seat-1"\n\\2',
conf,
1,
re.DOTALL)

with open("/etc/X11/xorg.conf", "w") as f:


f.write(conf)

subprocess.run(["/opt/VirtualGL/bin/vglserver_config", "-config", "+s", "+f"],


check = True)
subprocess.Popen(["Xorg", "-seat", "seat-1", "-allowMouseOpenFail", "-
novtswitch", "-nolisten", "tcp"])

def _setupVNC():
libjpeg_ver = "2.0.5"
virtualGL_ver = "2.6.4"
turboVNC_ver = "2.2.5"

libjpeg_url =
"https://github.com/demotomohiro/turbovnc/releases/download/2.2.5/libjpeg-turbo-
official_{0}_amd64.deb".format(libjpeg_ver)
virtualGL_url =
"https://github.com/demotomohiro/turbovnc/releases/download/2.2.5/virtualgl_{0}_amd
64.deb".format(virtualGL_ver)
turboVNC_url =
"https://github.com/demotomohiro/turbovnc/releases/download/2.2.5/turbovnc_{0}_amd6
4.deb".format(turboVNC_ver)

_download(libjpeg_url, "libjpeg-turbo.deb")
_download(virtualGL_url, "virtualgl.deb")
_download(turboVNC_url, "turbovnc.deb")
my_apt = _MyApt()
my_apt.installDebPackage("libjpeg-turbo.deb")
my_apt.installDebPackage("virtualgl.deb")
my_apt.installDebPackage("turbovnc.deb")

my_apt.commit()
my_apt.close()

vnc_sec_conf_p = pathlib.Path("/etc/turbovncserver-security.conf")
vnc_sec_conf_p.write_text("""\
no-remote-connections
no-httpd
no-x11-tcp-connections
""")

gpu_name = _get_gpu_name()
if gpu_name != None:
_setup_nvidia_gl()

vncrun_py = tempfile.gettempdir() / pathlib.Path("vncrun.py")


vncrun_py.write_text("""\
import subprocess, secrets, pathlib

vnc_passwd = "12345678"[:8]
vnc_viewonly_passwd = "87654321"[:8]
print("✂️"*24)
print("VNC password: {}".format(vnc_passwd))
print("VNC view only password: {}".format(vnc_viewonly_passwd))
print("✂️"*24)
vncpasswd_input = "{0}\\n{1}".format(vnc_passwd, vnc_viewonly_passwd)
vnc_user_dir = pathlib.Path.home().joinpath(".vnc")
vnc_user_dir.mkdir(exist_ok=True)
vnc_user_passwd = vnc_user_dir.joinpath("passwd")
with vnc_user_passwd.open('wb') as f:
subprocess.run(
["/opt/TurboVNC/bin/vncpasswd", "-f"],
stdout=f,
input=vncpasswd_input,
universal_newlines=True)
vnc_user_passwd.chmod(0o600)
subprocess.run(
["/opt/TurboVNC/bin/vncserver"],
cwd = pathlib.Path.home()
)

#Disable screensaver because no one would want it.


(pathlib.Path.home() / ".xscreensaver").write_text("mode: off\\n")
""")
r = subprocess.run(
["su", "-c", "python3 " + str(vncrun_py), "colab"],
check = True,
stdout = subprocess.PIPE,
universal_newlines = True)
return r.stdout

def setupVNC(ngrok_region = None, check_gpu_available = True):


stat, msg = _setupSSHDMain(ngrok_region, check_gpu_available, True)
if stat:
msg += _setupVNC()
clear_output()
_check_gpu_available()
print(msg)

def apps():
!sudo add-apt-repository ppa:obsproject/obs-studio -y
clear_output()
my_apt = _MyApt()
my_apt.installPkg("obs-studio", "vlc", "firefox", "xarchiver", "xfce4", "xfce4-
goodies")
my_apt.commit()
clear_output()

setupVNC()

You might also like