Azure Durable Functions运行MNIST分类代码遇'./MNIST'未实现错误求解
问题与解决方案
问题描述
使用Azure Durable Functions编写MNIST分类代码,部署到Azure运行时后出现错误:Function not implemented: './MNIST'。核心代码包含自定义PyTorch Lightning模型、Azure Blob日志器,以及Durable Functions的编排器和活动函数。
错误原因
Azure Functions运行环境的当前工作目录(./)是只读的,代码中使用datasets.MNIST('./', ...)尝试将MNIST数据集下载到当前目录,触发写入权限限制,导致报错。
解决方案
1. 切换到临时可写目录
Azure Functions提供TEMP环境变量,指向具备读写权限的临时目录,将MNIST数据集的存储路径切换到该目录即可解决权限问题。
2. 修改代码步骤
- 新增导入
os模块,用于获取临时目录路径 - 将数据集初始化代码中的路径替换为
os.environ.get("TEMP", "./")
修改后的活动函数核心代码片段:
### activity function ### import os # 新增导入 @app.blob_output(arg_name="outputblob", path="newblob/test.txt", connection="BlobStorageConnection") @app.activity_trigger(input_name="blank") def origin_image(blank: str, outputblob: func.Out[str]): # 获取Azure Functions临时目录 data_dir = os.environ.get("TEMP", "./") # Define dataset transformation transform = transforms.Compose([transforms.ToTensor()]) # 使用临时目录存储MNIST数据集 train_val = datasets.MNIST(data_dir, train=True, download=True, transform=transform) test = datasets.MNIST(data_dir, train=False, download=True, transform=transform) # 后续代码保持不变...
3. 优化建议(可选)
若要避免每次函数运行重复下载MNIST数据集,可提前将数据集上传到Azure Blob Storage,再在活动函数中下载到临时目录后加载,示例代码片段:
# 从Blob下载数据集到临时目录 blob_service_client = BlobServiceClient.from_connection_string(os.environ.get("BlobStorageConnection")) container_client = blob_service_client.get_container_client("mnist-data") # 下载MNIST数据集文件 for blob_name in ["train-images-idx3-ubyte.gz", "train-labels-idx1-ubyte.gz", "t10k-images-idx3-ubyte.gz", "t10k-labels-idx1-ubyte.gz"]: blob_client = container_client.get_blob_client(blob_name) with open(os.path.join(data_dir, blob_name), "wb") as f: f.write(blob_client.download_blob().readall()) # 加载本地数据集(无需再次下载) train_val = datasets.MNIST(data_dir, train=True, download=False, transform=transform)
内容的提问来源于stack exchange,提问作者TY00
相关产品推荐
相关产品推荐

