forked from danielgordon10/thor-iqa-cvpr-2018
-
Notifications
You must be signed in to change notification settings - Fork 0
/
tasks.py
95 lines (82 loc) · 2.73 KB
/
tasks.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
import boto3
from invoke import task
import os.path
from collections import defaultdict
from jinja2 import Template
import random
import subprocess
import shlex
import threading
import zipfile
import datetime
import platform
import json
import tempfile
import re
S3_BUCKET='ai2-vision-robosims'
def pci_records():
records = []
command = shlex.split('lspci -vmm')
output = subprocess.check_output(command).decode()
for devices in output.strip().split("\n\n"):
record = {}
records.append(record)
for row in devices.split("\n"):
key, value = row.split("\t")
record[key.split(':')[0]] = value
return records
def generate_xorg_conf(devices, device_num, display):
xorg_conf = []
device_section = """
Section "Device"
Identifier "Device{device_id}"
Driver "nvidia"
VendorName "NVIDIA Corporation"
BusID "{bus_id}"
EndSection
"""
server_layout_section = """
Section "ServerLayout"
Identifier "Layout0"
{screen_records}
EndSection
"""
screen_section = """
Section "Screen"
Identifier "Screen{screen_id}"
Device "Device{device_id}"
DefaultDepth 24
Option "AllowEmptyInitialConfiguration" "True"
SubSection "Display"
Depth 24
Virtual 1024 768
EndSubSection
EndSection
"""
screen_records = []
device = devices[int(device_num)]
bus_id = 'PCI:' + ':'.join(map(lambda x: str(int(x, 16)), re.split(r'[:\.]', device['Slot'])))
xorg_conf.append(device_section.format(device_id=display, bus_id=bus_id))
xorg_conf.append(screen_section.format(device_id=display, screen_id=display))
screen_records.append('Screen {screen_id} "Screen{screen_id}" 0 0'.format(screen_id=display))
xorg_conf.append(server_layout_section.format(screen_records="\n ".join(screen_records)))
return "\n".join(xorg_conf)
@task
def startx(context, device_num, display):
import os
display = int(display)
if platform.system() != 'Linux':
raise Exception("Can only run startx on linux")
records = list(filter(lambda r: r.get('Vendor', '') == 'NVIDIA Corporation' and r['Class'] in ['VGA compatible controller', '3D controller'], pci_records()))
if not records:
raise Exception("no nvidia cards found")
try:
fd, path = tempfile.mkstemp()
with open(path, "w") as f:
f.write(generate_xorg_conf(records, device_num, display))
print(generate_xorg_conf(records, device_num, display))
command = shlex.split("sudo Xorg -noreset +extension GLX +extension RANDR +extension RENDER -config %s :%d" % (path, display))
subprocess.call(command)
finally:
os.close(fd)
os.unlink(path)