def updatestatus(fast=False): progress.remaining(2*len(jobs_pending)+len(jobs_running)) if not fast: for j in jobs_done[maxprinted[0]:]: if j.id==maxprinted[0]: print j.getmsg() maxprinted[0]+=1 else: break
def autotuneAlgchoice(tx, site, ctx, n, cutoffs): progress.push() cmd = mkcmd([ "--transform=" + nameof(ctx), "--autotune", "--autotune-transform=" + nameof(tx), "--autotune-site=%d" % site, "--max=%d" % n, "--max-sec=%d" % goodtimelimit() ]) for x in cutoffs: cmd.append("--autotune-tunable=" + nameof(x)) if options.debug or options.justprint: print ' '.join(cmd) if options.justprint: progress.pop() return True runsCur = 1 runsLast = 1 inputCur = 1 #progress formula assumes linear runtime of program calcprog = lambda: 1.0 - (math.log(inputCur, 2) + min( 1.0, runsCur / float(runsLast))) / (math.log(n, 2) + 1) p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=substderr) pfx = "tuning " + nameof(tx) + ":%d - " % site if site == -1: pfx = "tuning %d cutoffs in %s - " % (len(cutoffs), nameof(tx)) str = "" progress.status(pfx) while True: line = p.stdout.readline() if line == "": break #BEGIN ITERATION .... / 4096 m = iterRe.match(line) if m: inputCur = int(m.group(1)) runsLast = runsCur runsCur = 0 progress.remaining(calcprog()) #SLOT[0] KEEP .... = 1.25 m = slotRe.match(line) if m: if m.group(1) == "0": str = m.group(3) progress.status(pfx + str) # * TRY ... m = runRe.match(line) if m: runsCur += 1 progress.remaining(calcprog()) progress.pop() if p.wait() == 0: print "* " + pfx + str return True else: print 'FAILURE OF TUNING STEP:', ' '.join(cmd) return False
def updatestatus(fast=False): progress.remaining(2 * len(jobs_pending) + len(jobs_running)) if not fast: for j in jobs_done[maxprinted[0]:]: if j.id == maxprinted[0]: print j.getmsg() maxprinted[0] += 1 else: break
def optimizeParam(ctx, n, param, start=0, stop=-1, branchfactor=7, best=(-1, maxint), worst=(-1, -maxint)): def timeat(x, thresh): old = getConfigVal(param) setConfigVal(param, x) t = timingRun(ctx, n, thresh) setConfigVal(param, old) return t if stop < 0: stop = n step = (stop - start) / float(branchfactor - 1) progress.status( "optimizing %s in %s, searching [%d,%d], impact=%.2f" % (param, nameof(ctx), start, stop, max(0, (worst[1] - best[1]) / best[1]))) if step >= 1: xs = map(lambda i: start + int(round(step * i)), xrange(branchfactor)) ys = [] for i in xrange(len(xs)): progress.remaining( math.log(stop - start, branchfactor / 2.0) * branchfactor - i) x = xs[i] if x == best[0]: y = best[1] # cached value else: try: y = timeat(x, best[1] + 1) except pbutil.TimingRunTimeout, e: y = maxint if y < best[1]: best = (x, y) ys.append(y) minTime, minX = reduce(min, map(lambda i: (ys[i], xs[i]), xrange(len(xs)))) maxTime, maxX = reduce(max, map(lambda i: (ys[i], xs[i]), xrange(len(xs)))) improvement = (maxTime - minTime) / maxTime newStart = max(int(round(minX - step)), start) newStop = min(int(round(minX + step)), stop) best = (minX, minTime) if worst[1] < maxTime: worst = (maxX, maxTime) #print minX, start, stop, improvement if improvement > 0.05: return optimizeParam(ctx, n, param, newStart, newStop, branchfactor, best, worst)
def runTimingTest(tx): progress.push() progress.remaining(1) progress.status("running timing test") t=timingRun(tx, options.n) progress.remaining(0) if len(results)>0: speedup=results[-1]/t print "* timing test... %.4f (%.2fx speedup)"%(t, speedup) else: print "* initial timing test... %.4lf s"%t results.append(t) progress.pop()
def runTimingTest(tx): progress.push() progress.remaining(1) progress.status("running timing test") t = timingRun(tx, options.n) progress.remaining(0) if len(results) > 0: speedup = results[-1] / t print "* timing test... %.4f (%.2fx speedup)" % (t, speedup) else: print "* initial timing test... %.4lf s" % t results.append(t) progress.pop()
def autotuneAlgchoice(tx, site, ctx, n, cutoffs): progress.push() cmd=mkcmd(["--transform="+nameof(ctx), "--autotune", "--autotune-transform="+nameof(tx), "--autotune-site=%d"%site, "--max=%d"%n, "--max-sec=%d"%goodtimelimit()]) for x in cutoffs: cmd.append("--autotune-tunable="+nameof(x)) if options.debug or options.justprint: print ' '.join(cmd) if options.justprint: progress.pop() return True runsCur=1 runsLast=1 inputCur=1 #progress formula assumes linear runtime of program calcprog=lambda: 1.0 - (math.log(inputCur,2) + min(1.0,runsCur/float(runsLast)))/(math.log(n,2)+1) p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=substderr) pfx="tuning "+nameof(tx)+":%d - "%site if site == -1: pfx="tuning %d cutoffs in %s - " % (len(cutoffs), nameof(tx)) str="" progress.status(pfx) while True: line=p.stdout.readline() if line == "": break #BEGIN ITERATION .... / 4096 m=iterRe.match(line) if m: inputCur=int(m.group(1)) runsLast=runsCur runsCur=0 progress.remaining(calcprog()) #SLOT[0] KEEP .... = 1.25 m=slotRe.match(line) if m: if m.group(1)=="0": str=m.group(3) progress.status(pfx+str) # * TRY ... m=runRe.match(line) if m: runsCur+=1 progress.remaining(calcprog()) progress.pop() if p.wait()==0: print "* "+pfx+str return True else: print 'FAILURE OF TUNING STEP:', ' '.join(cmd) return False
def randomMutation(self, maxpopsize=None, mutatorFilter=lambda m: True): '''grow the population using cloning and random mutation''' originalPop = list(self.members) totalMutators = self.countMutators(mutatorFilter) tries = float(totalMutators)*config.mutations_per_mutator while tries>0: progress.remaining(tries) check_timeout() tries-=1 if maxpopsize and len(self.members) >= maxpopsize: break if config.multimutation: p=random.choice(self.members) else: p=random.choice(originalPop) try: c=p.cloneAndMutate(self.inputSize(), mutatorFilter=mutatorFilter) except candidatetester.NoMutators: if self.countMutators(mutatorFilter)>0: continue else: return tries if c.config in self.triedConfigs and c.lastMutator: c.lastMutator.result('fail') continue self.triedConfigs.add(c.config) try: self.testers[-1].testN(c, config.min_trials, limit=p.reasonableLimit(self.inputSize())) if self.birthFilter(p,c): self.members.append(c) self.onMembersChanged(False) else: c.rmfiles() self.notadded.append(c) except candidatetester.CrashException, e: c.rmfiles() if c.lastMutator: c.lastMutator.result('fail') warnings.warn(NewProgramCrash(e))
def optimizeParam(ctx, n, param, start=0, stop=-1, branchfactor=7, best=(-1, maxint), worst=(-1, -maxint)): def timeat(x, thresh): old=getConfigVal(param) setConfigVal(param, x) t=timingRun(ctx, n, thresh) setConfigVal(param, old) return t if stop<0: stop=n step=(stop-start)/float(branchfactor-1) progress.status("optimizing %s in %s, searching [%d,%d], impact=%.2f" %(param,nameof(ctx),start,stop,max(0,(worst[1]-best[1])/best[1]))) if step>=1: xs=map(lambda i: start+int(round(step*i)), xrange(branchfactor)) ys=[] for i in xrange(len(xs)): progress.remaining(math.log(stop-start, branchfactor/2.0)*branchfactor - i) x=xs[i] if x==best[0]: y=best[1] # cached value else: try: y=timeat(x, best[1]+1) except pbutil.TimingRunTimeout, e: y=maxint if y<best[1]: best=(x,y) ys.append(y) minTime, minX = reduce(min, map(lambda i: (ys[i], xs[i]), xrange(len(xs)))) maxTime, maxX = reduce(max, map(lambda i: (ys[i], xs[i]), xrange(len(xs)))) improvement=(maxTime-minTime)/maxTime newStart = max(int(round(minX-step)), start) newStop = min(int(round(minX+step)), stop) best=(minX, minTime) if worst[1]<maxTime: worst=(maxX, maxTime) #print minX, start, stop, improvement if improvement > 0.05: return optimizeParam(ctx, n, param, newStart, newStop, branchfactor, best, worst)
def main(argv): t1=time.time() global app global cfg global ignore_list global defaultArgs global substderr global options config_tool_path = os.path.split(argv[0])[0] + "/configtool.py" fast = False parser = optparse.OptionParser(usage="usage: %prog [options] BENCHMARK") parser.add_option("--min", type="int", dest="min", default=1) parser.add_option("-n", "--random", "--max", type="int", dest="n", default=-1) parser.add_option("--offset", type="int", dest="offset", default=0) parser.add_option("--max-sec", type="float", dest="maxsec", default=0) parser.add_option("-d", "--debug", action="store_true", dest="debug", default=False) parser.add_option("-f", "--fast", action="store_true", dest="fast", default=False) parser.add_option("--threads", type="int", dest="threads", default=pbutil.cpuCount()) parser.add_option("-c", "--config", dest="config", default=None) parser.add_option("--noisolation", action="store_true", dest="noisolation", default=False) parser.add_option("--print", action="store_true", dest="justprint", default=False) parser.add_option("--time", action="store_true", dest="time", default=False) parser.add_option("--acctrials", type="int", dest="acctrials", default=None) parser.add_option("--accimprovetries", type="int", dest="accimprovetries", default=None) parser.add_option("--trials", type="int", dest="trials", default=None) parser.add_option("--trials-sec", type="float", dest="trialssec", default=None) parser.add_option("--trials-max", type="int", dest="trialsmax", default=None) parser.add_option("--transform", dest="transform", default=None) options,args = parser.parse_args() if len(args) != 1: parser.error("expected benchmark name as arg") cfg=options.config app=args[0] pbutil.chdirToPetabricksRoot() pbutil.compilePetabricks() app = pbutil.normalizeBenchmarkName(app) pbutil.compileBenchmarks([app]) if options.debug: substderr = sys.__stderr__ if cfg is None: cfg = pbutil.benchmarkToCfg(app) defaultArgs = ['--config='+cfg, '--threads=%d'%options.threads, '--offset=%d'%options.offset, '--min=%d'%options.min] if options.noisolation: defaultArgs.append("--noisolation") if options.acctrials is not None: defaultArgs.append("--acctrials=%d"%options.acctrials) if options.trials is not None: defaultArgs.append("--trials=%d"%options.trials) if options.trialssec is not None: defaultArgs.append("--trials-sec=%f"%options.trialssec) if options.trialsmax is not None: defaultArgs.append("--trials-max=%d"%options.trialsmax) if options.accimprovetries is not None: defaultArgs.append("--accimprovetries=%d"%options.accimprovetries) getIgnoreList() try: infoxml = parse(pbutil.benchmarkToInfo(app)) except: print "Cannot parse:", pbutil.benchmarkToInfo(app) sys.exit(-1) #print "Reseting config entries" #reset() #build index of transforms for t in infoxml.getElementsByTagName("transform"): transforms[nameof(t)]=t if t.getAttribute("templateChoice")=="0": transforms[t.getAttribute("templateName")] = t if options.transform is None: maintx = transforms[mainname()] else: maintx = transforms[options.transform] print "Call tree:" walkCallTree(maintx, fnup=printTx) print print "Autotuning:" progress.status("building work queue") if options.n <= 0: tasks.append(TuneTask("determineInputSizes", determineInputSizes)) if options.time: tasks.append(TuneTask("runTimingTest", lambda:runTimingTest(maintx))) #build list of tasks if not options.fast: walkCallTree(maintx, lambda tx, depth, loops: enqueueAutotuneCmds(tx, maintx, 1, depth, loops)) walkCallTree(maintx, lambda tx, depth, loops: enqueueAutotuneCmds(tx, maintx, 2, depth, loops)) if options.time: tasks.append(TuneTask("runTimingTest", lambda:runTimingTest(maintx))) progress.status("autotuning") while len(tasks)>0: w1=remainingTaskWeight() task=tasks.pop(0) w2=remainingTaskWeight() progress.remaining(w1, w2) task.run() progress.clear() t2=time.time() sec=t2-t1 print "autotuning took %.2f sec"%(t2-t1) for k,v in taskStats.items(): print " %.2f sec in %s"%(v.sec, k) sec -= v.sec print " %.2f sec in unknown"%sec names=taskStats.keys() weights=map(lambda x: x.sec/float(max(x.count, 1)), taskStats.values()) scale=len(weights)/sum(weights) print "Suggested weights:" print "taskStats = {" + ", ".join(map(lambda i: "'%s':TaskStats(%.2f)"%(names[i], scale*weights[i]), xrange(len(names)))) + "}"
def main(argv): t1 = time.time() global app global cfg global ignore_list global defaultArgs global substderr global options config_tool_path = os.path.split(argv[0])[0] + "/configtool.py" fast = False parser = optparse.OptionParser(usage="usage: %prog [options] BENCHMARK") parser.add_option("--min", type="int", dest="min", default=1) parser.add_option("-n", "--random", "--max", type="int", dest="n", default=-1) parser.add_option("--offset", type="int", dest="offset", default=0) parser.add_option("--max-sec", type="float", dest="maxsec", default=0) parser.add_option("-d", "--debug", action="store_true", dest="debug", default=False) parser.add_option("-f", "--fast", action="store_true", dest="fast", default=False) parser.add_option("--threads", type="int", dest="threads", default=pbutil.cpuCount()) parser.add_option("-c", "--config", dest="config", default=None) parser.add_option("--noisolation", action="store_true", dest="noisolation", default=False) parser.add_option("--print", action="store_true", dest="justprint", default=False) parser.add_option("--time", action="store_true", dest="time", default=False) parser.add_option("--acctrials", type="int", dest="acctrials", default=None) parser.add_option("--accimprovetries", type="int", dest="accimprovetries", default=None) parser.add_option("--trials", type="int", dest="trials", default=None) parser.add_option("--trials-sec", type="float", dest="trialssec", default=None) parser.add_option("--trials-max", type="int", dest="trialsmax", default=None) parser.add_option("--transform", dest="transform", default=None) options, args = parser.parse_args() if len(args) != 1: parser.error("expected benchmark name as arg") cfg = options.config app = args[0] pbutil.chdirToPetabricksRoot() pbutil.compilePetabricks() app = pbutil.normalizeBenchmarkName(app) pbutil.compileBenchmarks([app]) if options.debug: substderr = sys.__stderr__ if cfg is None: cfg = pbutil.benchmarkToCfg(app) defaultArgs = [ '--config=' + cfg, '--threads=%d' % options.threads, '--offset=%d' % options.offset, '--min=%d' % options.min ] if options.noisolation: defaultArgs.append("--noisolation") if options.acctrials is not None: defaultArgs.append("--acctrials=%d" % options.acctrials) if options.trials is not None: defaultArgs.append("--trials=%d" % options.trials) if options.trialssec is not None: defaultArgs.append("--trials-sec=%f" % options.trialssec) if options.trialsmax is not None: defaultArgs.append("--trials-max=%d" % options.trialsmax) if options.accimprovetries is not None: defaultArgs.append("--accimprovetries=%d" % options.accimprovetries) getIgnoreList() try: infoxml = parse(pbutil.benchmarkToInfo(app)) except: print "Cannot parse:", pbutil.benchmarkToInfo(app) sys.exit(-1) #print "Reseting config entries" #reset() #build index of transforms for t in infoxml.getElementsByTagName("transform"): transforms[nameof(t)] = t if t.getAttribute("templateChoice") == "0": transforms[t.getAttribute("templateName")] = t if options.transform is None: maintx = transforms[mainname()] else: maintx = transforms[options.transform] print "Call tree:" walkCallTree(maintx, fnup=printTx) print print "Autotuning:" progress.status("building work queue") if options.n <= 0: tasks.append(TuneTask("determineInputSizes", determineInputSizes)) if options.time: tasks.append(TuneTask("runTimingTest", lambda: runTimingTest(maintx))) #build list of tasks if not options.fast: walkCallTree( maintx, lambda tx, depth, loops: enqueueAutotuneCmds( tx, maintx, 1, depth, loops)) walkCallTree( maintx, lambda tx, depth, loops: enqueueAutotuneCmds( tx, maintx, 2, depth, loops)) if options.time: tasks.append(TuneTask("runTimingTest", lambda: runTimingTest(maintx))) progress.status("autotuning") while len(tasks) > 0: w1 = remainingTaskWeight() task = tasks.pop(0) w2 = remainingTaskWeight() progress.remaining(w1, w2) task.run() progress.clear() t2 = time.time() sec = t2 - t1 print "autotuning took %.2f sec" % (t2 - t1) for k, v in taskStats.items(): print " %.2f sec in %s" % (v.sec, k) sec -= v.sec print " %.2f sec in unknown" % sec names = taskStats.keys() weights = map(lambda x: x.sec / float(max(x.count, 1)), taskStats.values()) scale = len(weights) / sum(weights) print "Suggested weights:" print "taskStats = {" + ", ".join( map(lambda i: "'%s':TaskStats(%.2f)" % (names[i], scale * weights[i]), xrange(len(names)))) + "}"
def autotuneInner(benchmark): progress.push() config.benchmark = benchmark candidate, tester = init(benchmark) try: pop = Population(candidate, tester, None) if not pop.isVariableAccuracy() and config.accuracy_target: logging.info("clearing accuracy_target") config.accuracy_target = None stats = storagedirs.openCsvStats("roundstats", ("round", "input_size", "cumulative_sec", "incremental_sec", "testing_sec", "inputgen_sec")+pop.statsHeader()) timers.total.start() config.end_time = time.time() + config.max_time try: progress.remaining(config.max_input_size*(1+config.final_rounds)) while pop.inputSize() < config.max_input_size: progress.status("autotuning %s: input %d of %d" % (config.benchmark, pop.inputSize(), config.max_input_size)) pop.generation() stats.writerow((pop.roundNumber, pop.inputSize(), timers.total.total(), timers.total.lap(), timers.testing.lap(), timers.inputgen.lap())+pop.stats()) pop.nextInputSize() progress.remaining(config.max_input_size - pop.inputSize() + config.max_input_size*config.final_rounds) for z in xrange(config.final_rounds): pop.generation() stats.writerow((pop.roundNumber, pop.inputSize(), timers.total.total(), timers.total.lap(), timers.testing.lap(), timers.inputgen.lap())+pop.stats()) progress.remaining((config.final_rounds - z)*config.max_input_size) except TrainingTimeout: pass timers.total.stop() #check to make sure we did something: if pop.firstRound: warnings.warn(tunerwarnings.AlwaysCrashes()) logging.info("TODO: using acc target: "+str(config.accuracy_target)) return pop.best finally: if pop.best and config.output_cfg: print pop.best.cfgfile(),"=>" , config.output_cfg shutil.copyfile(pop.best.cfgfile(), config.output_cfg) at = storagedirs.getactivetimers() if len(at): storagedirs.openCsvStats("timers", at.keys()).writerow(at.values()) if tester: tester.cleanup() progress.pop()