예제 #1
0
 def f(*args, **kwargs):
     task = args[0]
     task_id = task.request.id
     start = time.time()
     traceback_str = None
     res = {}
     try:
         outputs = func(*args, **kwargs)
         if task.name.endswith("sim"):
             version = outputs.pop("version", OUTPUTS_VERSION)
             if version == "v0":
                 res["model_version"] = "NA"
                 res.update(dict(outputs, **{"version": version}))
             else:
                 outputs = cs_storage.write(task_id, outputs)
                 res.update({
                     "model_version": functions.get_version(),
                     "outputs": outputs,
                     "version": version,
                 })
         else:
             res.update(outputs)
     except Exception:
         traceback_str = traceback.format_exc()
     finish = time.time()
     if "meta" not in res:
         res["meta"] = {}
     res["meta"]["task_times"] = [finish - start]
     if traceback_str is None:
         res["status"] = "SUCCESS"
     else:
         res["status"] = "FAIL"
         res["traceback"] = traceback_str
     return res
예제 #2
0
def done_callback(future, job_id, comp_url, comp_api_token, start_time):
    """
    This should be called like:

    callback = functools.partial(
        done_callback,
        job_id=job_id,
        comp_url=os.environ.get("COMP_URL"),
        comp_api_token=os.environ.get("comp_api_token"),
        start_time=time.time()
    )

    This is because this function needs the job id, comp url,
    api token, and start time arguments, but dask only passes the
    future object.
    """
    finish = time.time()
    print(f"job_id: {job_id}")
    print(f"from dask")
    print(f"state: {future.status}")
    res = {}
    traceback_str = None
    try:
        outputs = future.result()
        outputs = cs_storage.write(job_id, outputs)
        res.update({
            "model_version": functions.get_version(),
            "outputs": outputs,
            "version": "v1",
        })
    except Exception:
        traceback_str = traceback.format_exc()
        print(f"exception in callback with job_id: {job_id}")
        print(traceback_str)

    if "meta" not in res:
        res["meta"] = {}
    res["meta"]["task_times"] = [finish - start_time]
    if traceback_str is None:
        res["status"] = "SUCCESS"
    else:
        res["status"] = "FAIL"
        res["traceback"] = traceback_str

    res["job_id"] = job_id
    print("got result", res)
    print(f"posting data to {comp_url}/outputs/api/")
    resp = requests.put(
        f"{comp_url}/outputs/api/",
        json=res,
        headers={"Authorization": f"Token {comp_api_token}"},
    )
    print("resp", resp.status_code)
    if resp.status_code == 400:
        print("errors", resp.json())
예제 #3
0
async def task_wrapper(callback_url, task_name, func, task_kwargs=None):
    print("async task", callback_url, func, task_kwargs)
    start = time.time()
    traceback_str = None
    res = {
        "task_name": task_name,
    }
    try:
        if task_kwargs is None:
            print("getting task_kwargs")
            resp = await get_task_kwargs(callback_url)
            task_kwargs = resp.json()["inputs"]
        print("got task_kwargs", task_kwargs)
        outputs = func(**(task_kwargs or {}))
        res.update(
            {
                "model_version": functions.get_version(),
                "outputs": outputs,
                "version": "v1",
            }
        )
    except Exception:
        traceback_str = traceback.format_exc()

    finish = time.time()

    if "meta" not in res:
        res["meta"] = {}
    res["meta"]["task_times"] = [finish - start]

    if traceback_str is None:
        res["status"] = "SUCCESS"
    else:
        res["status"] = "FAIL"
        res["traceback"] = traceback_str

    print("saving results...")
    async with httpx.AsyncClient() as client:
        resp = await client.post(callback_url, json=res, timeout=120)

    print("resp", resp.status_code, resp.url)
    assert resp.status_code in (200, 201), f"Got code: {resp.status_code} ({resp.text})"

    return res
예제 #4
0
def inputs_version(self):
    return {"version": functions.get_version()}
예제 #5
0
def version(**task_kwargs):
    return {"version": functions.get_version()}