一文读懂gallery模型生命周期管理从ModelDownloadStatus看本地AI模型的完整管理方案【免费下载链接】galleryA gallery that showcases on-device ML/GenAI use cases and allows people to try and use models locally.项目地址: https://gitcode.com/gh_mirrors/gallery44/gallerygallery是一款专注于本地机器学习ML和生成式AIGenAI用例展示的应用它允许用户在设备上本地尝试和使用AI模型。本文将深入解析gallery项目中模型生命周期管理的核心实现重点剖析ModelDownloadStatus如何追踪和管理AI模型从下载到使用的完整流程帮助开发者和用户理解本地AI模型的高效管理机制。模型生命周期的核心状态ModelDownloadStatusType详解在gallery项目中模型的下载状态通过ModelDownloadStatusType枚举类定义这是理解模型生命周期的基础。该枚举位于Model.kt文件中定义了模型在设备上可能存在的六种状态NOT_DOWNLOADED模型尚未下载这是初始状态PARTIALLY_DOWNLOADED模型部分下载可能由于网络中断等原因导致IN_PROGRESS模型正在下载中UNZIPPING模型下载完成正在解压SUCCEEDED模型下载并解压成功可随时使用FAILED模型下载或解压失败这些状态形成了一个完整的状态机覆盖了模型从开始下载到可用的整个过程。通过这些状态应用能够清晰地向用户展示当前模型的状态并采取相应的操作。状态管理的实现ModelDownloadStatus数据类ModelDownloadStatus数据类是跟踪模型下载过程的关键它不仅包含了当前状态还提供了丰富的下载进度信息。在Model.kt中定义如下data class ModelDownloadStatus( val status: ModelDownloadStatusType, val totalBytes: Long 0, val receivedBytes: Long 0, val errorMessage: String , val bytesPerSecond: Long 0, val remainingMs: Long 0, )这个类包含了下载状态管理所需的全部信息status当前下载状态ModelDownloadStatusTypetotalBytes文件总大小receivedBytes已接收字节数errorMessage错误信息如下载失败时bytesPerSecond下载速度remainingMs预计剩余时间这些信息使得应用能够向用户展示详细的下载进度包括进度条、剩余时间和下载速度等关键指标。状态管理的核心逻辑ModelManagerViewModel模型下载状态的管理逻辑集中在ModelManagerViewModel.kt中这个类负责处理模型的下载、取消、删除和状态更新等核心操作。1. 下载状态的初始化当应用启动或模型列表更新时系统会为每个模型初始化下载状态private fun getModelDownloadStatus(model: Model): ModelDownloadStatus { // 检查模型文件是否已存在 if (File(model.getPath(context)).exists()) { return ModelDownloadStatus( status ModelDownloadStatusType.SUCCEEDED, totalBytes model.totalBytes, receivedBytes model.totalBytes ) } // 检查是否存在部分下载的临时文件 var status ModelDownloadStatusType.NOT_DOWNLOADED val tmpFile File(${model.getPath(context)}.tmp) if (tmpFile.exists()) { val tmpFileSize tmpFile.length() if (tmpFileSize 0) { status ModelDownloadStatusType.PARTIALLY_DOWNLOADED return ModelDownloadStatus( status status, totalBytes model.totalBytes, receivedBytes tmpFileSize ) } } return ModelDownloadStatus(status status) }2. 发起下载与状态更新当用户触发模型下载时系统会更新状态为IN_PROGRESS并开始下载fun downloadModel(task: Task?, model: Model) { // 更新状态为下载中 setDownloadStatus( curModel model, status ModelDownloadStatus(status ModelDownloadStatusType.IN_PROGRESS), ) // 先删除已有的模型文件 deleteModel(model model) // 开始下载请求 downloadRepository.downloadModel( task task, model model, onStatusUpdated this::setDownloadStatus, ) }下载过程中setDownloadStatus函数会被定期调用以更新下载进度fun setDownloadStatus(curModel: Model, status: ModelDownloadStatus) { val curModelDownloadStatus uiState.value.modelDownloadStatus.toMutableMap() curModelDownloadStatus[curModel.name] status val newUiState uiState.value.copy(modelDownloadStatus curModelDownloadStatus) // 如果状态是失败或未下载删除已下载的文件 if (status.status ModelDownloadStatusType.FAILED || status.status ModelDownloadStatusType.NOT_DOWNLOADED) { deleteFileFromExternalFilesDir(curModel.downloadFileName) } _uiState.update { newUiState } }3. 取消下载与状态重置用户可以随时取消下载此时系统会清理临时文件并重置状态fun cancelDownloadModel(model: Model) { downloadRepository.cancelDownloadModel(model) deleteModel(model model) } fun deleteModel(model: Model) { // 删除模型文件 if (model.imported) { deleteFilesFromImportDir(model.downloadFileName) } else { deleteDirFromExternalFilesDir(model.normalizedName) } // 更新模型下载状态为未下载 val curModelDownloadStatus uiState.value.modelDownloadStatus.toMutableMap() curModelDownloadStatus[model.name] ModelDownloadStatus(status ModelDownloadStatusType.NOT_DOWNLOADED) // ...其他清理逻辑 }状态展示与用户交互模型下载状态不仅在后台被跟踪还通过UI组件实时展示给用户。在ModelDownloadStatusInfoPanel.kt中根据不同的下载状态显示相应的UIfun ModelDownloadStatusInfoPanel( downloadStatus: ModelDownloadStatus?, onDownloadClick: () - Unit, onCancelClick: () - Unit, ) { when (downloadStatus?.status) { ModelDownloadStatusType.NOT_DOWNLOADED - { DownloadAndTryButton(onClick onDownloadClick) } ModelDownloadStatusType.IN_PROGRESS, ModelDownloadStatusType.PARTIALLY_DOWNLOADED, ModelDownloadStatusType.UNZIPPING - { // 显示进度条和取消按钮 LinearProgressIndicator( progress downloadStatus.receivedBytes.toFloat() / downloadStatus.totalBytes.toFloat() ) Text(${downloadStatus.receivedBytes.humanReadableBytes()} / ${downloadStatus.totalBytes.humanReadableBytes()}) Button(onClick onCancelClick) { Text(取消) } } ModelDownloadStatusType.FAILED - { Text(下载失败: ${downloadStatus.errorMessage}) Button(onClick onDownloadClick) { Text(重试) } } else - Unit // 已下载状态不显示此面板 } }此外在StatusIcon.kt中不同的下载状态会显示不同的图标fun StatusIcon(downloadStatus: ModelDownloadStatus?) { when (downloadStatus?.status) { ModelDownloadStatusType.NOT_DOWNLOADED - Icon(Icons.Default.CloudDownload, 未下载) ModelDownloadStatusType.IN_PROGRESS - CircularProgressIndicator() ModelDownloadStatusType.SUCCEEDED - Icon(Icons.Default.CheckCircle, 已下载) ModelDownloadStatusType.FAILED - Icon(Icons.Default.Error, 下载失败) // 其他状态的图标... } }实际应用场景与最佳实践1. 处理网络中断当网络中断导致下载失败时系统会将状态设置为PARTIALLY_DOWNLOADED。当应用重新获得网络连接时会自动尝试继续下载private fun processPendingDownloads() { for (task in uiState.value.tasks) { for (model in task.models) { val downloadStatus uiState.value.modelDownloadStatus[model.name]?.status if (downloadStatus ModelDownloadStatusType.PARTIALLY_DOWNLOADED) { Log.d(TAG, 继续下载模型: ${model.name}) downloadRepository.downloadModel( task task, model model, onStatusUpdated thisModelManagerViewModel::setDownloadStatus, ) } } } }2. 多模型管理应用支持同时管理多个模型的下载状态使用modelDownloadStatus映射来跟踪每个模型的状态data class ModelManagerUiState( // ...其他状态 val modelDownloadStatus: MapString, ModelDownloadStatus, )这种设计允许应用同时处理多个模型的下载每个模型都有独立的状态跟踪。3. 存储空间管理在下载大模型时应用会检查设备存储空间是否充足并在空间不足时提示用户fun checkStorageSpace(model: Model): Boolean { val freeSpace externalFilesDir?.freeSpace ?: 0 // 预留20%的额外空间 return freeSpace model.totalBytes * 1.2 }总结高效管理本地AI模型的关键gallery项目通过ModelDownloadStatus和ModelDownloadStatusType构建了一个健壮的模型生命周期管理系统主要优势体现在完整的状态跟踪覆盖了模型从下载到可用的全部状态详细的进度信息提供下载速度、剩余时间等关键指标健壮的错误处理网络中断、空间不足等问题的优雅处理良好的用户体验清晰的状态展示和直观的操作界面这种设计确保了用户能够在本地设备上无缝地管理和使用AI模型为离线AI应用提供了可靠的基础。无论是开发类似的本地AI应用还是优化现有应用的模型管理功能gallery的模型生命周期管理方案都提供了宝贵的参考。要开始使用gallery项目体验本地AI模型管理只需克隆仓库并按照开发指南进行构建git clone https://gitcode.com/gh_mirrors/gallery44/gallery通过深入理解ModelDownloadStatus的实现原理开发者可以构建出更加可靠和用户友好的本地AI应用推动AI技术在离线环境下的广泛应用。【免费下载链接】galleryA gallery that showcases on-device ML/GenAI use cases and allows people to try and use models locally.项目地址: https://gitcode.com/gh_mirrors/gallery44/gallery创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
一文读懂gallery模型生命周期管理:从ModelDownloadStatus看本地AI模型的完整管理方案
一文读懂gallery模型生命周期管理从ModelDownloadStatus看本地AI模型的完整管理方案【免费下载链接】galleryA gallery that showcases on-device ML/GenAI use cases and allows people to try and use models locally.项目地址: https://gitcode.com/gh_mirrors/gallery44/gallerygallery是一款专注于本地机器学习ML和生成式AIGenAI用例展示的应用它允许用户在设备上本地尝试和使用AI模型。本文将深入解析gallery项目中模型生命周期管理的核心实现重点剖析ModelDownloadStatus如何追踪和管理AI模型从下载到使用的完整流程帮助开发者和用户理解本地AI模型的高效管理机制。模型生命周期的核心状态ModelDownloadStatusType详解在gallery项目中模型的下载状态通过ModelDownloadStatusType枚举类定义这是理解模型生命周期的基础。该枚举位于Model.kt文件中定义了模型在设备上可能存在的六种状态NOT_DOWNLOADED模型尚未下载这是初始状态PARTIALLY_DOWNLOADED模型部分下载可能由于网络中断等原因导致IN_PROGRESS模型正在下载中UNZIPPING模型下载完成正在解压SUCCEEDED模型下载并解压成功可随时使用FAILED模型下载或解压失败这些状态形成了一个完整的状态机覆盖了模型从开始下载到可用的整个过程。通过这些状态应用能够清晰地向用户展示当前模型的状态并采取相应的操作。状态管理的实现ModelDownloadStatus数据类ModelDownloadStatus数据类是跟踪模型下载过程的关键它不仅包含了当前状态还提供了丰富的下载进度信息。在Model.kt中定义如下data class ModelDownloadStatus( val status: ModelDownloadStatusType, val totalBytes: Long 0, val receivedBytes: Long 0, val errorMessage: String , val bytesPerSecond: Long 0, val remainingMs: Long 0, )这个类包含了下载状态管理所需的全部信息status当前下载状态ModelDownloadStatusTypetotalBytes文件总大小receivedBytes已接收字节数errorMessage错误信息如下载失败时bytesPerSecond下载速度remainingMs预计剩余时间这些信息使得应用能够向用户展示详细的下载进度包括进度条、剩余时间和下载速度等关键指标。状态管理的核心逻辑ModelManagerViewModel模型下载状态的管理逻辑集中在ModelManagerViewModel.kt中这个类负责处理模型的下载、取消、删除和状态更新等核心操作。1. 下载状态的初始化当应用启动或模型列表更新时系统会为每个模型初始化下载状态private fun getModelDownloadStatus(model: Model): ModelDownloadStatus { // 检查模型文件是否已存在 if (File(model.getPath(context)).exists()) { return ModelDownloadStatus( status ModelDownloadStatusType.SUCCEEDED, totalBytes model.totalBytes, receivedBytes model.totalBytes ) } // 检查是否存在部分下载的临时文件 var status ModelDownloadStatusType.NOT_DOWNLOADED val tmpFile File(${model.getPath(context)}.tmp) if (tmpFile.exists()) { val tmpFileSize tmpFile.length() if (tmpFileSize 0) { status ModelDownloadStatusType.PARTIALLY_DOWNLOADED return ModelDownloadStatus( status status, totalBytes model.totalBytes, receivedBytes tmpFileSize ) } } return ModelDownloadStatus(status status) }2. 发起下载与状态更新当用户触发模型下载时系统会更新状态为IN_PROGRESS并开始下载fun downloadModel(task: Task?, model: Model) { // 更新状态为下载中 setDownloadStatus( curModel model, status ModelDownloadStatus(status ModelDownloadStatusType.IN_PROGRESS), ) // 先删除已有的模型文件 deleteModel(model model) // 开始下载请求 downloadRepository.downloadModel( task task, model model, onStatusUpdated this::setDownloadStatus, ) }下载过程中setDownloadStatus函数会被定期调用以更新下载进度fun setDownloadStatus(curModel: Model, status: ModelDownloadStatus) { val curModelDownloadStatus uiState.value.modelDownloadStatus.toMutableMap() curModelDownloadStatus[curModel.name] status val newUiState uiState.value.copy(modelDownloadStatus curModelDownloadStatus) // 如果状态是失败或未下载删除已下载的文件 if (status.status ModelDownloadStatusType.FAILED || status.status ModelDownloadStatusType.NOT_DOWNLOADED) { deleteFileFromExternalFilesDir(curModel.downloadFileName) } _uiState.update { newUiState } }3. 取消下载与状态重置用户可以随时取消下载此时系统会清理临时文件并重置状态fun cancelDownloadModel(model: Model) { downloadRepository.cancelDownloadModel(model) deleteModel(model model) } fun deleteModel(model: Model) { // 删除模型文件 if (model.imported) { deleteFilesFromImportDir(model.downloadFileName) } else { deleteDirFromExternalFilesDir(model.normalizedName) } // 更新模型下载状态为未下载 val curModelDownloadStatus uiState.value.modelDownloadStatus.toMutableMap() curModelDownloadStatus[model.name] ModelDownloadStatus(status ModelDownloadStatusType.NOT_DOWNLOADED) // ...其他清理逻辑 }状态展示与用户交互模型下载状态不仅在后台被跟踪还通过UI组件实时展示给用户。在ModelDownloadStatusInfoPanel.kt中根据不同的下载状态显示相应的UIfun ModelDownloadStatusInfoPanel( downloadStatus: ModelDownloadStatus?, onDownloadClick: () - Unit, onCancelClick: () - Unit, ) { when (downloadStatus?.status) { ModelDownloadStatusType.NOT_DOWNLOADED - { DownloadAndTryButton(onClick onDownloadClick) } ModelDownloadStatusType.IN_PROGRESS, ModelDownloadStatusType.PARTIALLY_DOWNLOADED, ModelDownloadStatusType.UNZIPPING - { // 显示进度条和取消按钮 LinearProgressIndicator( progress downloadStatus.receivedBytes.toFloat() / downloadStatus.totalBytes.toFloat() ) Text(${downloadStatus.receivedBytes.humanReadableBytes()} / ${downloadStatus.totalBytes.humanReadableBytes()}) Button(onClick onCancelClick) { Text(取消) } } ModelDownloadStatusType.FAILED - { Text(下载失败: ${downloadStatus.errorMessage}) Button(onClick onDownloadClick) { Text(重试) } } else - Unit // 已下载状态不显示此面板 } }此外在StatusIcon.kt中不同的下载状态会显示不同的图标fun StatusIcon(downloadStatus: ModelDownloadStatus?) { when (downloadStatus?.status) { ModelDownloadStatusType.NOT_DOWNLOADED - Icon(Icons.Default.CloudDownload, 未下载) ModelDownloadStatusType.IN_PROGRESS - CircularProgressIndicator() ModelDownloadStatusType.SUCCEEDED - Icon(Icons.Default.CheckCircle, 已下载) ModelDownloadStatusType.FAILED - Icon(Icons.Default.Error, 下载失败) // 其他状态的图标... } }实际应用场景与最佳实践1. 处理网络中断当网络中断导致下载失败时系统会将状态设置为PARTIALLY_DOWNLOADED。当应用重新获得网络连接时会自动尝试继续下载private fun processPendingDownloads() { for (task in uiState.value.tasks) { for (model in task.models) { val downloadStatus uiState.value.modelDownloadStatus[model.name]?.status if (downloadStatus ModelDownloadStatusType.PARTIALLY_DOWNLOADED) { Log.d(TAG, 继续下载模型: ${model.name}) downloadRepository.downloadModel( task task, model model, onStatusUpdated thisModelManagerViewModel::setDownloadStatus, ) } } } }2. 多模型管理应用支持同时管理多个模型的下载状态使用modelDownloadStatus映射来跟踪每个模型的状态data class ModelManagerUiState( // ...其他状态 val modelDownloadStatus: MapString, ModelDownloadStatus, )这种设计允许应用同时处理多个模型的下载每个模型都有独立的状态跟踪。3. 存储空间管理在下载大模型时应用会检查设备存储空间是否充足并在空间不足时提示用户fun checkStorageSpace(model: Model): Boolean { val freeSpace externalFilesDir?.freeSpace ?: 0 // 预留20%的额外空间 return freeSpace model.totalBytes * 1.2 }总结高效管理本地AI模型的关键gallery项目通过ModelDownloadStatus和ModelDownloadStatusType构建了一个健壮的模型生命周期管理系统主要优势体现在完整的状态跟踪覆盖了模型从下载到可用的全部状态详细的进度信息提供下载速度、剩余时间等关键指标健壮的错误处理网络中断、空间不足等问题的优雅处理良好的用户体验清晰的状态展示和直观的操作界面这种设计确保了用户能够在本地设备上无缝地管理和使用AI模型为离线AI应用提供了可靠的基础。无论是开发类似的本地AI应用还是优化现有应用的模型管理功能gallery的模型生命周期管理方案都提供了宝贵的参考。要开始使用gallery项目体验本地AI模型管理只需克隆仓库并按照开发指南进行构建git clone https://gitcode.com/gh_mirrors/gallery44/gallery通过深入理解ModelDownloadStatus的实现原理开发者可以构建出更加可靠和用户友好的本地AI应用推动AI技术在离线环境下的广泛应用。【免费下载链接】galleryA gallery that showcases on-device ML/GenAI use cases and allows people to try and use models locally.项目地址: https://gitcode.com/gh_mirrors/gallery44/gallery创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考