Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
O
OpenXG-Erm
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
OpenXG
OpenXG-Erm
Commits
a156dc47
Commit
a156dc47
authored
Apr 12, 2021
by
Suzhi Bi
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Update code
parent
261ea31b
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
258 additions
and
0 deletions
+258
-0
code
code
+258
-0
No files found.
code
View file @
a156dc47
import subprocess
import socket
import sys
import os
import struct
import numpy as np
import time
def allocation(workload, cpu_per_core, core_num, arrival, requirement, queueing_time):
gain = 1.6
print('A new task arrives.')
flag1 = 0
start.append(arrival + queueing_time)
deadline.append(arrival + requirement)
cpu_remain_0 = np.ones(core_num) * cpu_per_core
if len(finish) != 0:
for i in range(core_num):
cpu_remain_0[i] = cpu_per_core - sum(((np.array(finish) * (np.array(cpu_index) == i)) > start[-1]) * cpu)
index = np.argsort(cpu_remain_0)
if len(finish) != 0:
index = index[::-1]
flag2 = -1
for i in index:
flag2 = flag2 + 1
start[-1] = arrival + queueing_time
if flag2 > 0:
cpu.pop()
if len(finish) != 0:
cpu_remain = cpu_per_core - sum((( np.array(finish) * (np.array(cpu_index) == i) ) > start[-1]) * cpu)
cpu.append(max(gain * workload/requirement, 150 * 10 ** 6))
if cpu[-1] <= cpu_remain:
finish.append(start[-1] + workload/cpu[-1])
cpu_index.append(i)
print("Current task assignment %0.2f MHz frequency of cpu_%d." %(cpu[-1] * 10 ** -6, cpu_index[-1]))
print('--------------------------------------------')
break
else:
temp = np.array(finish) * (np.array(cpu_index) == i) - start[-1]
n = sum(temp > 0)
if n == 0:
if i == (core_num - 1):
cpu[-1] = 0
start[-1] = float('inf')
finish.append(0)
cpu_index.append(-1)
print("drop")
print('--------------------------------------------')
else:
temp[temp < 0] = 10 ** 8 # inf
min_index = np.argsort(temp)
for j in range(n):
cpu_remain = cpu[min_index[j]] + cpu_remain
start[-1] = finish[min_index[j]]
if deadline[-1] <= start[-1] :
if i == (core_num - 1):
cpu[-1] = 0
start[-1] = float('inf')
finish.append(0)
cpu_index.append(-1)
print("drop")
print('--------------------------------------------')
break
cpu[-1] = max(gain * workload/(deadline[-1] - start[-1]), 150 * 10 ** 6)
if cpu[-1] <= cpu_remain:
finish.append(start[-1] + workload/cpu[-1])
cpu_index.append(i)
print("Wait a while.")
print("Current task assignment %0.2f MHz frequency of cpu_%d." %(cpu[-1] * 10 ** -6, cpu_index[-1]))
print('--------------------------------------------')
flag1 = 1
break
if j == (n - 1) and i == (core_num - 1):
cpu[-1] = 0
start[-1] = float('inf')
finish.append(0)
cpu_index.append(-1)
print("drop")
print('--------------------------------------------')
if flag1 == 1:
break
else:
cpu.append(max(gain * workload/requirement, 150 * 10 ** 6))
if cpu[-1] <= cpu_per_core:
finish.append(start[-1] + workload/cpu[-1])
cpu_index.append(i)
print("Current task assignment %0.2f MHz frequency of cpu_%d." %(cpu[-1] * 10 ** -6, cpu_index[-1]))
print('--------------------------------------------')
break
else:
if i == (core_num - 1):
cpu[-1] = 0
start[-1] = float('inf')
finish.append(0)
cpu_index.append(-1)
print("drop")
print('--------------------------------------------')
def deal_data(conn, addr):
print ('Accept new connection from {0}'.format(addr))
fileinfo_size = struct.calcsize('128sq')
buf = conn.recv(fileinfo_size)
global flag
flag = 0
if buf:
if buf.decode('utf-8', 'ignore').isdigit() and len(buf.decode('utf-8', 'ignore')) < 5:
global time_max
time_max = int(buf.decode('utf-8'))
print('The maximum time (seconds) allowed for picture(s) is %d.' %time_max)
flag = 1
else:
global filesize
filename, filesize = struct.unpack('128sq', buf)
fn = filename.strip(str.encode('\00'))
global new_filename
new_filename = os.path.join(str.encode('./'), fn)
print ('file new name is {0}, filesize if {1}'.format(new_filename, filesize))
recvd_size = 0
fp = open(new_filename, 'wb')
print ("start receiving...")
while not recvd_size == filesize:
if filesize - recvd_size > 1024:
data = conn.recv(1024)
recvd_size += len(data)
else:
data = conn.recv(filesize - recvd_size)
recvd_size = filesize
fp.write(data)
fp.close()
print("end receive...")
else:
flag = 1
print("not received...")
conn.close()
ip = '192.168.191.4'
print ("Waiting...")
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((ip, 8080))
s.listen(10)
except socket.error as msg:
print(msg)
sys.exit(1)
global cpu
cpu = []
global cpu_index
cpu_index = []
global start
start = []
global finish
finish = []
global deadline
deadline = []
data_size = []
workload = []
quota = []
name = []
result = []
image_location = []
python_code = []
core_num = 4
cpu_per_core = 15 * 10 ** 8
period = 10000
new_image = []
time_arrival = []
time_require = []
k = -1
t_start = time.time()
while 1:
conn, addr = s.accept()
deal_data(conn, addr)
if flag == 1:
continue
k = k + 1
t1 = time.time()
new_image.append(str(new_filename, encoding="utf-8"))
data_size.append(os.path.getsize(new_image[k]))
workload.append(data_size[k] * 10 ** 6)
time_arrival.append(t1 - t_start)
time_require.append(time_max)
python_code.append("/classifier_api/image_classification/classifier.py")
image_location.append("/classifier_api/" + str(k) + ".jpg")
name.append("class_" + str(k))
result.append("result_" + str(addr[0]) + "_" + str(os.path.split(new_image[k])[-1]).split('.')[0])
os.system("echo $(docker ps -aq) >> 1.txt")
os.system("echo $(wc 1.txt) >> 2.txt")
f = open("2.txt", "r")
for line in f.readlines():
line = line.strip()
num = int(line.split()[1])
os.system("rm -f 1.txt 2.txt")
queueing_time = 0
while num > 30:
time.sleep(1)
os.system("echo $(docker ps -aq) >> 1.txt")
os.system("echo $(wc 1.txt) >> 2.txt")
f = open("2.txt", "r")
for line in f.readlines():
line = line.strip()
num = int(line.split()[1])
os.system("rm -f 1.txt 2.txt")
queueing_time = queueing_time + 1
allocation(workload[k], cpu_per_core, core_num, time_arrival[k], time_require[k], queueing_time)
quota.append(int(cpu[k]/cpu_per_core * period))
if finish[k] == 0:
message = "The delay of " + str(os.path.split(new_image[k])[-1]) + " is not satisfied."
print(message)
cmd1 = "echo " + str(message) + " >> " + str(result[k]) + ".txt"
os.system(cmd1)
cmd2 = "python3 result_return.py " + str(addr[0]) + " " + str(os.path.split(new_image[k])[-1]).split('.')[0] + ".txt"
os.system(cmd2)
cmd3 = "rm -f result_" + str(addr[0]) + "_" + str(os.path.split(new_image[k])[-1]).split('.')[0] + ".txt"
os.system(cmd3)
os.system("echo Timeout. >> time.txt")
continue
if data_size[k] != filesize:
message = "Error receiving " + str(os.path.split(new_image[k])[-1])
print(message)
cmd1 = "echo " + str(message) + " >> " + str(result[k]) + ".txt"
os.system(cmd1)
cmd2 = "python3 result_return.py " + str(addr[0]) + " " + str(os.path.split(new_image[k])[-1]).split('.')[0] + ".txt"
os.system(cmd2)
cmd3 = "rm -f result_" + str(addr[0]) + "_" + str(os.path.split(new_image[k])[-1]).split('.')[0] + ".txt"
os.system(cmd3)
os.system("echo Error receiving. >> time.txt")
continue
waiting_time = start[k] - time_arrival[k]
time.sleep(waiting_time)
waiting_time = int(waiting_time)
print("start container...")
cmd1 = "docker run --name " + str(name[k]) + " --cpuset-cpus=" + str(cpu_index[k]) + " --cpu-period=" + str(period) + " --cpu-quota=" + str(quota[k]) + " -dt class_api/v1 /bin/bash"
cmd2 = "docker cp " + str(new_image[k]) + " " + str(name[k]) + ":/" + str(image_location[k])
cmd3 = "docker exec " + str(name[k]) + " python3 -W ignore::RuntimeWarning " + str(python_code[k]) + " --image_file " + str(image_location[k]) + " --num_top_predictions 1 >> " + str(result[k]) + ".txt"
cmd4 = "docker stop " + str(name[k])
cmd4_1 = "echo $(($(date --date=$(docker inspect --format='{{.State.FinishedAt}}' " + str(name[k]) + " ) +%s) - $(date --date=$(docker inspect --format='{{.State.StartedAt}}' " + str(name[k]) + " ) +%s)))\(" + str(waiting_time) + "\) seconds/" + str(time_max) + " seconds >> time.txt"
cmd5 = "docker rm " + str(name[k])
cmd6 = "python3 result_return.py " + str(addr[0]) + " " + str(os.path.split(new_image[k])[-1]).split('.')[0] + ".txt"
cmd7 = "rm -f result_" + str(addr[0]) + "_" + str(os.path.split(new_image[k])[-1]).split('.')[0] + ".txt"
cmd = cmd1 + " && " + cmd2 + " && " + cmd3 + " && " + cmd4 + " && " + cmd4_1 + " && " + cmd5 + " && " + cmd6 + " && " + cmd7 # + " && " + cmd8
p = subprocess.Popen(cmd, shell = True, stderr=subprocess.STDOUT, stdin=subprocess.PIPE)
\ No newline at end of file
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment