class_docstr: Use mlflow to implement a Recorder.
  
  Due to the fact that mlflow will only log artifact from a file or directory, we decide to
  use file manager to help maintain the objects in the project.
  
  Instead of using mlflow directly, we use another interface wrapping mlflow to log experiments.
  Though it takes extra efforts, but it brings users benefits due to following reasons.
  - It will be more convenient to change the experiment logging backend without changing any code in upper level
  - We can provide more convenience to automatically do some extra things and make interface easier. For examples:
      - Automatically logging the uncommitted code
      - Automatically logging part of environment variables
      - User can control several different runs by just creating different Recorder (in mlflow, you always have to switch artifact_uri and pass in run ids frequently)
class_docstr_tok: ["Use","mlflow","to","implement","a","Recorder",".","Due","to","the","fact","that","mlflow","will","only","log","artifact","from","a","file","or","directory",",","we","decide","to","use","file","manager","to","help","maintain","the","objects","in","the","project",".","Instead","of","using","mlflow","directly",",","we","use","another","interface","wrapping","mlflow","to","log","experiments",".","Though","it","takes","extra","efforts",",","but","it","brings","users","benefits","due","to","following","reasons",".","-","It","will","be","more","convenient","to","change","the","experiment","logging","backend","without","changing","any","code","in","upper","level","-","We","can","provide","more","convenience","to","automatically","do","some","extra","things","and","make","interface","easier",".","For","examples",":","-","Automatically","logging","the","uncommitted","code","-","Automatically","logging","part","of","environment","variables","-","User","can","control","several","different","runs","by","just","creating","different","Recorder","(","in","mlflow",",","you","always","have","to","switch","artifact_uri","and","pass","in","run","ids","frequently",")"]
code: def artifact_uri(self):
      return self._artifact_uri
  
imports: import os
  import sys
  from typing import Optional
  import mlflow
  import shutil
  import pickle
  import tempfile
  import subprocess
  from pathlib import Path
  from datetime import datetime
  from qlib.utils.serial import Serializable
  from qlib.utils.exceptions import LoadObjectError
  from qlib.utils.paral import AsyncCaller
  from ..log import TimeInspector, get_module_logger
  from mlflow.store.artifact.azure_blob_artifact_repo import AzureBlobArtifactRepository
label_desc: Use image node_id 6 for calling the MLflowRecorder obj's underlying member method code with example usage: obj.artifact_uri() and returns: self