#
# Collective Knowledge (universal advice about experiments, bugs, models,
# features, optimizations, adaptation,
# community remarks ...)
#
# See CK LICENSE.txt for licensing details
# See CK COPYRIGHT.txt for copyright details
#
# Developer: Grigori Fursin, Grigori.Fursin@cTuning.org, http://fursin.net
#
cfg={} # Will be updated by CK (meta description of this module)
work={} # Will be updated by CK (temporal data)
ck=None # Will be updated by CK (initialized CK kernel)
# Local settings
hextra='
\n'
hextra+=' [ Project website ], '
hextra+=' [ Partners ], '
hextra+=' [ CGO\'17 test of time award for our interdisiplinary R&D ], '
hextra+=' [ Community-driven AI R&D powered by CK ], '
hextra+=' [ CK-Caffe ], '
hextra+=' [ CK-TensorFlow ], '
hextra+=' [ Wikipedia, \n'
hextra+='paper 1, \n'
hextra+='Paper 2, \n'
hextra+='YouTube CK intro ] \n'
hextra+='\n'
hextra+='\n'
form_name='ck_ai_web_form'
onchange='document.'+form_name+'.submit();'
##############################################################################
# Initialize module
def init(i):
"""
Input: {}
Output: {
return - return code = 0, if successful
> 0, if error
(error) - error text if return > 0
}
"""
return {'return':0}
##############################################################################
# access available CK-AI self-optimizing functions
def show(i):
"""
Input: {
}
Output: {
return - return code = 0, if successful
> 0, if error
(error) - error text if return > 0
}
"""
import copy
h=''
st=''
h+='\n'
h+='\n\n\n\n'
# h+='Aggregated results from Caffe crowd-benchmarking (time, accuracy, energy, cost, ...)
\n'
h+=hextra
# Check host URL prefix and default module/action
rx=ck.access({'action':'form_url_prefix',
'module_uoa':'wfe',
'host':i.get('host',''),
'port':i.get('port',''),
'template':i.get('template','')})
if rx['return']>0: return rx
url0=rx['url']
template=rx['template']
url=url0
action=i.get('action','')
muoa=i.get('module_uoa','')
url+='action=index&module_uoa=wfe&native_action='+action+'&'+'native_module_uoa='+muoa
url1=url
# Start form
r=ck.access({'action':'start_form',
'module_uoa':cfg['module_deps']['wfe'],
'url':url1,
'name':form_name})
if r['return']>0: return r
h+=r['html']
# Check available API is modules
r=ck.access({'action':'search',
'module_uoa':cfg['module_deps']['module'],
'tags':'ck-ai-json-web-api'})
if r['return']>0: return r
l=r['lst']
if len(l)==0:
h='WARNING: No CK modules found with CK AI JSON web API\n'
else:
dt=[{'name':'', 'value':''}]
for x in l:
v=x['data_uid']
# Load module info
r=ck.access({'action':'load',
'module_uoa':cfg['module_deps']['module'],
'data_uoa':v})
if r['return']>0: return r
d=r['dict']
name=d.get('actions',{}).get('ask_ai_web',{}).get('desc','')
if name!='':
dt.append({'name':name, 'value':v})
# Create selector
ai=i.get('ai_scenario','')
ii={'action':'create_selector',
'module_uoa':cfg['module_deps']['wfe'],
'data':dt,
'name':'ai_scenario',
'onchange':onchange,
'skip_sort':'yes',
'selected_value':ai}
r=ck.access(ii)
if r['return']>0: return r
x=r['html']
h+='
Select AI scenario with unified CK AI JSON API :
'+x+'
'
# Render scenario
if ai!='':
ii=copy.deepcopy(i)
ii['action']='ask_ai_web'
ii['module_uoa']=ai
ii['widget']='yes'
ii['prepared_url0']=url0
ii['prepared_url1']=url1
ii['prepared_form_name']=form_name
r=ck.access(ii)
if r['return']>0: return r
h+='\n'
h+='\n\n'+r.get('html','')
h+='
\n'
st+='\n'+r.get('style','')+'\n'
h+='Want to survive Cambrian AI/SW/HW explosion but lost in technological chaos?
\n'
h+='
\n'
h+='Join the growing consortium\n'
h+='using and enhancing Collective Knowledge technology to\n'
h+=' a) clean up this mess, b) reinvent computer engineering and make it more collaborative, reproducible and reusable,\n'
h+=' c) develop efficient and reliable computer systems from IoT to supercomputers, \n'
h+=' d) enable open science via reusable and customizable artifacts,\n'
h+=' and e) eventually enable and accelerate open AI research!\n'
return {'return':0, 'html':h, 'style':st}
##############################################################################
# CK-AI dashboard
def browse(i):
"""
Input: {
}
Output: {
return - return code = 0, if successful
> 0, if error
(error) - error text if return > 0
}
"""
i['action']='browser'
i['cid']=''
i['module_uoa']=''
i['template']='ck-ai-basic'
return ck.access(i)
##############################################################################
# ask AI advice via CK JSON API and CK DNN engines
def ask(i):
"""
Input: {
to - which advice ("predict_compiler_flags", "classify_image")
(local) - if 'yes', use local optimization rather than public from cKnowledge.org/repo
If predict_compiler_flags:
compiler - compiler name
See GCC: http://cknowledge.org/repo/web.php?native_action=show&native_module_uoa=program.optimization&scenario=8289e0cf24346aa7
See LLVM: http://cknowledge.org/repo/web.php?native_action=show&native_module_uoa=program.optimization&scenario=2aaed4c520956635
scenario
cpu_name
features (MILEPOST feature vector: http://ctuning.org/wiki/index.php/CTools:MilepostGCC:StaticFeatures:MILEPOST_V2.1)
If classify_image
dnn_engine (caffe, caffe2, tensorflow)
image - file with image
}
Output: {
return - return code = 0, if successful
> 0, if error
(error) - error text if return > 0
}
"""
import os
to=i.get('to','')
if to=='':
return {'return':1, 'error':'--to is not defined'}
# Check where to look for optimizations
er=i.get('exchange_repo','')
if er=='': er=ck.cfg['default_exchange_repo_uoa']
esr=''
aa='show_json'
if i.get('local','')=='yes':
er='local'
esr=''
aa='show'
rr={'return':0}
if to=='predict_compiler_flags':
# This is just a demo of MILEPOST project combined with CK-powered collective optimization
# We plan to considerably improve modeling based on our Collective Mind part II vision paper
# (bringing community to share optimizations, features, models and enable dynamic adaptation).
# Check if module exists
r=ck.access({'action':'find',
'module_uoa':cfg['module_deps']['module'],
'data_uoa':cfg['module_deps']['milepost']})
if r['return']>0 and r['return']!=16: return r
if r['return']==16:
return {'return':1, 'error':'Please, install CK MILEPOST repository using "ck pull repo:reproduce-milepost-project"'}
compiler=i.get('compiler','')
if compiler=='':
return {'return':1, 'error':'--compiler is not defined'}
scenario=i.get('scenario','')
if scenario=='':
if compiler.lower().startswith('gcc'):
scenario=cfg['module_deps']['experiment.tune.compiler.flags.gcc.e']
elif compiler.lower().startswith('llvm'):
scenario=cfg['module_deps']['experiment.tune.compiler.flags.llvm.e']
else:
return {'return':1, 'error':'scenario is not defined (see "ck search module --tags="program optimization,program-features"'}
cpu_name=i.get('cpu_name','')
if cpu_name=='':
return {'return':1, 'error':'--cpu_name is not defined'}
features=i.get('features',[])
xfeatures={}
for k in i:
if k.startswith('ft'):
k1=int(k[2:])
v1=i[k]
xfeatures[k1]=v1
for k in range(0,66):
if k in xfeatures:
features.append(xfeatures[k])
if len(features)==0:
return {'return':1, 'error':'feature vector is not defined'}
# Search optimization results
ii={'action':aa,
'module_uoa':cfg['module_deps']['program.optimization'],
'repo_uoa':er,
'remote_repo_uoa':esr,
'scenario':scenario,
'__web_prune__compiler':compiler,
'__web_prune__cpu_name':cpu_name,
'skip_html':'yes'}
r=ck.access(ii)
if r['return']>0: return r
results=r['results']
if len(results)==0:
return {'return':1, 'error':'optimization results are not found for such configuration'}
if len(results)>1:
return {'return':1, 'error':'ambiguity - more then 1 configuration found'}
# Predict
muoa=results[0]['module_uoa']
duoa=results[0]['data_uoa']
ii={'action':aa,
'module_uoa':cfg['module_deps']['milepost'],
'repo_uoa':er,
'remote_repo_uoa':esr,
'view_solution_'+muoa+'_'+duoa:'',
'skip_html':'yes'}
j=1
for v in features:
ii['mft'+str(j)]=v
j+=1
rr=ck.access(ii)
if rr['return']>0: return rr
popt=rr.get('predicted_opt','')
if popt=='':
ck.out('WARNING: could not predict optimization')
else:
ck.out('Predicted optimization:')
ck.out('')
ck.out(popt)
############################################################################################################
elif to=='classify_image':
engine=i.get('dnn_engine','')
if engine=='': engine='caffe'
image=i.get('image','')
if image=='' or not os.path.isfile(image):
return {'return':1, 'error':'image not found'}
r=ck.convert_file_to_upload_string({'filename':image})
if r['return']>0: return r
fcb64=r['file_content_base64']
# Search optimization results
ii={'action':aa,
'module_uoa':cfg['module_deps']['model.image.classification'],
'repo_uoa':er,
'remote_repo_uoa':esr,
'dnn_engine':engine,
'file_content_base64':fcb64,
'skip_html':'yes'}
rr=ck.access(ii)
if rr['return']>0: return rr
warning=rr.get('warning','')
prediction=rr.get('prediction','')
if warning!='':
ck.out('WARNING: '+warning)
if prediction!='':
ck.out('')
ck.out('Preciction:')
ck.out('')
ck.out(prediction)
else:
return {'return':1, 'error':'we do not have such scenario yet ('+to+')'}
return rr