Hi,
How do I retrieve Profile information using the Profiling APIs.
It says to use getProfileTfliteJob and I’m not sure where and how to call this function/api.
Any help on this would be highly appreciated.
Regards,
Pratyush
Hi,
How do I retrieve Profile information using the Profiling APIs.
It says to use getProfileTfliteJob and I’m not sure where and how to call this function/api.
Any help on this would be highly appreciated.
Regards,
Pratyush
Hi Pratyush,
The API can be used if you are building a local python script for instance, and you need to retrieve the information from the studio using the script.
You can use Python or cURL to retrieve this information.
Regards,
Omar
Hi @pratyush
try this:
import requests, json, datetime, time, re, base64
PROJECT_ID = 1 # YOUR PROJECT ID
API_KEY = "ei_..." # YOUR API KEY
DEVICE = 'infineon-cy8ckit-062s2'
REFERENCE_MODEL = 'keywords-2d-i8' # just hardcode this for now
def profile_tflite_model(tflite_file_path):
url = f"https://studio.edgeimpulse.com/v1/api/{PROJECT_ID}/jobs/profile-tflite"
base64_encoded_file = ''
with open(tflite_file_path, "rb") as f:
base64_encoded_file = base64.b64encode(f.read()).decode('utf-8')
payload = {
'tfliteFileBase64': base64_encoded_file,
'device': DEVICE,
'referenceModel': REFERENCE_MODEL,
}
headers = {
"x-api-key": API_KEY,
"Accept": "application/json",
"Content-Type": "application/json",
}
response = requests.request("POST", url, json=payload, headers=headers)
body = json.loads(response.text)
if (not body['success']):
raise Exception(body['error'])
return body['id']
def get_stdout(job_id, skip_line_no):
url = f"https://studio.edgeimpulse.com/v1/api/{PROJECT_ID}/jobs/{job_id}/stdout"
headers = {
"x-api-key": API_KEY,
"Accept": "application/json",
"Content-Type": "application/json",
}
response = requests.request("GET", url, headers=headers)
body = json.loads(response.text)
if (not body['success']):
raise Exception(body['error'])
stdout = body['stdout'][::-1] # reverse array so it's old -> new
return [ x['data'] for x in stdout[skip_line_no:] ]
def wait_for_job_completion(job_id):
skip_line_no = 0
url = f"https://studio.edgeimpulse.com/v1/api/{PROJECT_ID}/jobs/{job_id}/status"
headers = {
"x-api-key": API_KEY,
"Accept": "application/json",
"Content-Type": "application/json",
}
while True:
response = requests.request("GET", url, headers=headers)
body = json.loads(response.text)
if (not body['success']):
raise Exception(body['error'])
stdout = get_stdout(job_id, skip_line_no)
for l in stdout:
print(l, end='')
skip_line_no = skip_line_no + len(stdout)
if (not 'finished' in body['job']):
# print('Job', job_id, 'is not finished yet...', body['job'])
time.sleep(1)
continue
if (not body['job']['finishedSuccessful']):
raise Exception('Job failed')
else:
break
def get_perf_results(job_id):
url = f"https://studio.edgeimpulse.com/v1/api/{PROJECT_ID}/jobs/profile-tflite/{job_id}/result"
headers = {
"x-api-key": API_KEY,
"Accept": "application/json",
"Content-Type": "application/json",
}
response = requests.request("POST", url, headers=headers)
body = json.loads(response.text)
if (not body['success']):
raise Exception(body['error'])
return body
if __name__ == "__main__":
job_id = profile_tflite_model('path-to-your-tflite-file.tflite')
print('Job ID is', job_id)
wait_for_job_completion(job_id)
print('Job', job_id, 'is finished')
perf_data = get_perf_results(job_id)
print('Memory usage', perf_data['memory'])
print('Time per inference (' + DEVICE + ')', perf_data['timePerInferenceMs'])