全部產品
Search
文件中心

Container Service for Kubernetes:Fluid資料緩衝最佳化策略最佳實務

更新時間:Aug 24, 2024

在計算與儲存分離的架構下,使用Fluid資料緩衝技術,能夠有效解決在Kubernetes叢集中訪問儲存系統資料時容易出現的高延遲及頻寬受限問題,從而提升資料處理效率。本文從效能維度、穩定性維度、讀寫一致性維度介紹如何使用Fluid資料緩衝策略。

使用情境

緩衝技術依賴局部性原理提升多次資料訪問的平均效能,許多資料密集型應用情境均存在這樣的局部性特徵,例如:

  • AI模型訓練情境:AI模型訓練過程中,相同的資料集將被按輪次(Epoch)周期性讀取,用於AI模型的迭代收斂過程。

  • AI模型推理服務啟動情境:當發布或更新某AI模型推理服務時,大量推理服務執行個體被並發拉起,各推理服務執行個體並發讀取儲存系統中相同的模型檔案,並載入到推理服務執行個體的GPU記憶體中。

  • 巨量資料分析情境:在巨量資料分析過程中,部分資料會被一個或多個資料分析任務共同使用。例如:在使用SparkSQL分析使用者畫像和商品資訊時,訂單資料將被這些分析任務共同使用。

因此,以上這些情境,均可以使用Fluid資料緩衝技術提升資料處理效率。

效能維度Fluid資料緩衝最佳化策略

為了使用Fluid構建的資料緩衝有效提升資料訪問的效率,您需要根據業務的效能需求以及預算成本合理配置Fluid資料緩衝使用的ECS機型、緩衝介質、緩衝系統參數配置、緩衝管理原則等。另外,還需要考慮用戶端資料讀取方式對效能的影響。您可以通過上述策略的綜合運用,有效提升Fluid資料緩衝效能表現,本節將詳細介紹這幾種策略。

策略一:選擇緩衝系統ECS機型

效能估算

分布式檔案快取系統能夠彙總多個節點上的儲存資源和頻寬資源,為上層應用提供更大的緩衝容量和更高的可用頻寬。關於緩衝容量、可用頻寬以及應用資料訪問的最大頻寬的理論上限值可根據以下公式估算:

  • 緩衝可用容量 = 每個分布式緩衝Worker Pod提供的緩衝容量 * 分布式緩衝Worker Pod副本數

  • 緩衝可用頻寬 = 分布式緩衝Worker Pod副本數 * min{Worker Pod所在ECS節點的最大可用頻寬, Worker Pod使用的緩衝介質I/O吞吐}。另外,緩衝可用頻寬不代表資料訪問過程中的實際頻寬,資料訪問過程的實際頻寬受用戶端ECS節點可用頻寬,以及資料訪問模式(順序讀、隨機讀)影響。

  • 應用Pod資料訪問過程的理論最大頻寬 = min{應用Pod所在ECS節點的可用頻寬,緩衝可用頻寬}。另外,當多個應用Pod並發訪問資料時,緩衝可用頻寬將被這些應用Pod共用佔用。

樣本

例如,在ACK叢集中擴容2台ecs.g7nex.8xlarge規格的ECS執行個體用於構建分布式緩衝叢集,分布式緩衝叢集包含2個緩衝Worker Pod,每個Pod設定的緩衝容量為100 GiB記憶體,兩個Pod分別運行於兩台ECS執行個體上。應用Pod部署於一台ecs.gn7i-c8g1.2xlarge(8 vCPU,30 GiB記憶體,16 Gbps頻寬)規格的ECS執行個體,其緩衝容量、可用頻寬以及最大頻寬的理論值如下所示:

  • 緩衝可用容量 = 100GiB * 2 = 200 GiB

  • 緩衝可用頻寬 = 2 * min{40 Gbps, 記憶體訪問I/O吞吐} = 80 Gbps

  • 快取命中時,應用Pod資料訪問最大可用頻寬 = min{80Gbps, 16Gbps} = 16 Gbps

推薦ECS機型規格

分布式緩衝叢集的可用頻寬取決於叢集中各個ECS節點的最大可用頻寬和所使用的緩衝介質,為提升分布式緩衝系統效能,推薦您使用高頻寬的ECS執行個體規格,並使用記憶體或本地HDD或本地SSD盤作為緩衝介質。推薦使用的ECS執行個體規格如下所示。

ECS執行個體規格類型系列

ECS執行個體規格

ECS執行個體配置

網路增強通用型執行個體規格類型系列g7nex

ecs.g7nex.8xlarge

32 vCPU, 128GiB記憶體, 40 Gbps頻寬

ecs.g7nex.16xlarge

64 vCPU, 256 GiB記憶體, 80 Gbps頻寬

ecs.g7nex.32xlarge

128 vCPU, 512 GiB記憶體, 160 Gbps頻寬

本地SSD型執行個體規格類型系列i4g

ecs.i4g.16xlarge

64 vCPU, 256 GiB記憶體, 2 * 1920 GB本地SSD盤儲存,32 Gbps頻寬

ecs.i4g.32xlarge

128 vCPU, 512 GiB記憶體, 4 * 1920 GB本地SSD盤儲存, 64 Gbps頻寬

網路增強通用型執行個體規格類型系列g7ne

ecs.g7ne.8xlarge

32 vCPU, 128 GiB記憶體, 25 Gbps頻寬

ecs.g7ne.12xlarge

48 vCPU, 192 GiB記憶體,40 Gbps頻寬

ecs.g7ne.24xlarge

96 vCPU, 384 GiB記憶體,80 Gbps頻寬

通用型執行個體規格類型系列g8i

ecs.g8i.24xlarge

96 vCPU, 384 GiB記憶體, 50 Gbps頻寬

ecs.g8i.16xlarge

64 vCPU, 256 GiB記憶體,32 Gbps頻寬

關於ECS執行個體的詳細資料,請參見執行個體規格類型系列

策略二:選擇緩衝介質

分布式緩衝叢集的可用頻寬取決於叢集中各個ECS節點的最大可用頻寬和所使用的緩衝介質,為提升分布式緩衝系統效能,推薦您使用高頻寬的ECS執行個體規格,並使用記憶體或本地SSD盤作為緩衝介質。在Fluid中,可以通過配置Runtime資來源物件的spec.tieredstore參數來設定不同的緩衝介質以及緩衝容量。

說明

使用ESSD雲端硬碟作為緩衝介質往往無法滿足資料密集型應用情境的高效能資料訪問需求。例如:PL2雲端硬碟的單盤最大輸送量為750 MB/s,這意味著如果僅使用一塊PL2雲端硬碟作為緩衝介質,即使選擇可用頻寬大於750 MB/s的ECS機型,該ECS節點所能提供的緩衝可用頻寬上限也僅為750 MB/s,浪費ECS節點的最大可用頻寬。

使用記憶體作為緩衝介質

如果使用記憶體作為緩衝介質,配置Runtime資來源物件的spec.tieredstore為如下配置:

spec:
  tieredstore:
    levels:
      - mediumtype: MEM
        volumeType: emptyDir
        path: /dev/shm
        quota: 30Gi # 為單個分布式緩衝Worker副本所能提供的緩衝容量。
        high: "0.99"
        low: "0.95"

使用本機存放區作為緩衝介質

  • 如果使用本地系統硬碟儲存作為緩衝介質:

    spec:
      tieredstore:
        levels:
          - mediumtype: SSD
            volumeType: emptyDir # 使用emptyDir確保快取資料的生命週期與分布式緩衝Worker Pod一致,避免快取資料殘留。
            path: /var/lib/fluid/cache
            quota: 100Gi # 為單個分布式緩衝Worker副本所能提供的緩衝容量。
            high: "0.99"
            low: "0.95
  • 如果使用額外掛載的SSD資料盤作為緩衝介質:

    spec:
      tieredstore:
        levels:
          - mediumtype: SSD
            volumeType: hostPath
            path: /mnt/disk1 # /mnt/disk1為宿主機的本地SSD盤掛載路徑。
            quota: 100Gi # 為單個分布式緩衝Worker副本所能提供的緩衝容量。
            high: "0.99"
            low: "0.95"
  • 如果同時使用多塊SSD資料盤作為緩衝介質:

    spec:
      tieredstore:
        levels:
          - mediumtype: SSD
            volumeType: hostPath
            path: /mnt/disk1,/mnt/disk2 # /mnt/disk1和/mnt/disk2均為宿主機的資料盤掛載路徑。
            quota: 100Gi # 單個分布式緩衝Worker副本所能提供的緩衝容量,容量將均分在多個緩衝路徑上(例如:/mnt/disk1和/mnt/disk2各分配50Gi容量)。
            high: "0.99"
            low: "0.95"

策略三:配置資料緩衝與應用間調度親和性

當資料訪問請求命中緩衝時,應用Pod從緩衝系統中讀取資料。因此,如果應用Pod與緩衝系統分別部署在不同的可用性區域內,應用需要跨可用性區域訪問快取資料。如果希望降低跨可用性區域網路波動對資料訪問過程的影響,需要考慮應用Pod與緩衝系統相關Pod之間的調度親和性,具體而言:

  • 緩衝系統Worker Pod盡量親和部署在相同可用性區域內。

  • 應用Pod與緩衝系統Worker Pod盡量親和部署在相同可用性區域內。

重要

將多個應用Pod與緩衝系統Worker Pod部署在單一可用性區域內會降低應用和相關服務的容災能力,您可以根據自身業務SLA平衡選擇效能影響和服務可用性。

在Fluid中,可以通過配置Dataset資來源物件的spec.nodeAffinity,設定緩衝系統Worker Pod的調度親和性,如下所示:

apiVersion: data.fluid.io/v1alpha1
kind: Dataset
metadata:
  name: demo-dataset
spec:
  ...
  nodeAffinity:
    required:
      nodeSelectorTerms:
        - matchExpressions:
            - key: topology.kubernetes.io/zone
              operator: In
              values:
                - <ZONE_ID> # 所在的可用性區域,例如cn-beijing-i。

上述配置將分布式緩衝系統Worker Pod均部署在<ZONE_ID>可用性區域的ECS節點。

另外,Fluid可以在應用Pod中自動注入該應用Pod所需緩衝的親和性資訊,實現應用Pod與緩衝系統Worker Pod盡量同可用性區域親和部署。更多資訊,請參見資料緩衝親和性調度最佳化

策略四:大檔案全量順序讀情境參數配置最佳化

許多資料密集型情境中涉及大檔案全量順序讀的資料訪問模式,例如,基於TFRecord或Tar格式的資料集進行模型訓練、AI模型推理服務啟動時載入1個或多個模型參數檔案、讀取Parquet檔案格式進行分布式資料分析等。針對此類情境,可以使用更加激進的預讀策略,提升資料訪問效能,例如適當增大緩衝系統預讀的並發度、預讀資料量等。

在Fluid中,不同分布式緩衝運行時在預讀策略方面的配置需要有不同的參數配置,如下所示:

使用JindoRuntime作為緩衝運行時

如果使用JindoRuntime作為緩衝運行時,您需要配置spec.fuse.properties參數,自訂Jindo Fuse的行為和效能。

kind: JindoRuntime
metadata:
  ...
spec:
  fuse:
    properties:
      fs.oss.download.thread.concurrency: "200"
      fs.oss.read.buffer.size: "8388608"
      fs.oss.read.readahead.max.buffer.count: "200"
      fs.oss.read.sequence.ambiguity.range: "2147483647" # 約2G。
  • fs.oss.download.thread.concurrency:Jindo用戶端預讀的並發線程數,每個線程會用於預讀一個緩衝區。

  • fs.oss.read.buffer.size:單個buffer的大小。

  • fs.oss.read.readahead.max.buffer.count:Jindo用戶端單流預讀的最大buffer數量。

  • fs.oss.read.sequence.ambiguity.range:Jindo用戶端判定進程是否順序讀取檔案的判定範圍。

使用JuiceFSRuntime作為緩衝運行時

如果使用JuiceFSRuntime作為緩衝運行時,您可以通過配置Runtime資來源物件的spec.fuse.optionsspec.worker.options分別設定FUSE組件和Worker組件的參數。

kind: JuiceFSRuntime
metadata:
  ...
spec:
  fuse:
    options:
      buffer-size: "2048"
      cache-size: "0"
      max-uploads: "150"
  worker:
    options:
      buffer-size: "2048"
      max-downloads: "200"
      max-uploads: "150"
  master:
    resources:
      requests:
        memory: 2Gi
      limits:
        memory: 8Gi
  ...
  • buffer-size:讀寫緩衝區大小。

  • max-downloads:預讀過程的下載並發度。

  • fuse cache-size:設定JuiceFS FUSE組件可用的本機快取容量。

例如,通過設定JuiceFS FUSE組件可用的本機快取容量為0,並設定FUSE組件記憶體requests為較小值(例如2 GiB)。FUSE組件會在Linux檔案系統核心中自動利用節點可用記憶體作為近地緩衝(Page Cache),近地緩衝未命中時直接讀取JuiceFS Worker分布式緩衝中的資料,實現高效訪問。更多效能調優和參數細節,請參見JuiceFS官方文檔

穩定性維度Fluid資料緩衝最佳化策略

為了確保Fluid資料緩衝系統長期穩定運行,您需要根據業務實際需求,謹慎規避將含有大量檔案的目錄作為資料緩衝的掛載點,以防止單點過載;實施中繼資料持久化策略,利用持久化儲存(如ESSD雲端硬碟)加強系統韌性與故障恢複能力;合理配置FUSE Pod資源,確保資源供需平衡,避免資源競爭引起的不穩定;啟用FUSE自愈機制,自動響應故障。整合運用這些策略,以增強Fluid資料緩衝的穩定性和可靠性。本節將詳細介紹如何運用以上這些策略。

策略一:避免掛載包含大量檔案的目錄作為底層資料來源

緩衝系統需要維護掛載底層儲存目錄下全部檔案的元資訊,並記錄各檔案的緩衝狀態等額外元資訊。如果緩衝系統掛載了包含大量檔案的底層儲存目錄(例如:大規模儲存系統的根目錄),緩衝系統必須使用大量記憶體資源儲存相關元資訊,並使用更多CPU資源處理相關的元資訊訪問請求。

Fluid定義了Dataset的抽象概念,Dataset是面向上層特定應用,邏輯上是一組相關資料的集合。一個Dataset會對應啟動一個分布式緩衝系統,並且一個Dataset應當僅為一個或某些相關的資料密集型任務提供資料訪問加速服務。因此,推薦您建立多個Dataset,並在每個Dataset中分別定義底層資料來源的不同子目錄,具體子目錄層級與業務應用所需的資料集合相關,不同的業務應用可以使用不同的Dataset綁定的緩衝系統訪問資料,這將使得各業務應用間有著更好的隔離性,保證系統穩定性和效能。Dataset配置樣本如下:

apiVersion: data.fluid.io/v1alpha1
kind: Dataset
metadata:
  name: demo-dataset
spec:
  ...
  mounts:
  - mountPoint: oss://<BUCKET>/<PATH1>/<SUBPATH>/
    name: sub-bucket

建立多個緩衝系統可能導致額外的營運複雜性,可根據實際業務需求靈活選擇架構方案,例如:

  • 如果所需緩衝的資料集儲存在單一後端儲存系統中,且規模不大,檔案數量不多,有較強的相關性,推薦建立單個Fluid Dataset和分布式緩衝系統提供服務。

  • 如果所需緩衝的資料集規模較大、檔案數量較多,推薦根據資料目錄的業務含義,分拆為多個Fluid Dataset和分布式緩衝系統提供服務,應用Pod可聲明掛載一個或多個Fluid Dataset到指定目錄下。

  • 如果所需緩衝的資料集來自於多個使用者的不同的儲存系統,並且業務要求保證使用者間的資料隔離性。推薦為每個使用者或使用者的一系列資料相關的作業建立有著較短生命週期的Fluid Dataset,通過開發Kubernetes Operator靈活營運叢集中多個Fluid Dataset。

策略二:使用元資訊持久化提升緩衝系統穩定性

許多分布式緩衝系統採用Master-Worker的分布式架構,它們依賴於Master Pod組件維護掛載的後端儲存系統目錄的檔案元資訊,並記錄各檔案的緩衝狀態。當應用通過此類緩衝系統訪問資料時,首先需要從Master Pod組件中擷取檔案元資訊,接著從底層檔案儲存體或緩衝Worker組件中擷取資料。因此,緩衝Master Pod組件的穩定性對緩衝系統的高可用性至關重要。

如果使用JindoRuntime作為緩衝運行時,在Fluid中推薦使用以下配置提升緩衝Master Pod組件的可用性:

apiVersion: data.fluid.io/v1alpha1
kind: JindoRuntime
metadata:
  name: sd-dataset
spec:
  ...
  volumes:
    - name: meta-vol
      persistentVolumeClaim:
        claimName: demo-jindo-master-meta
  master:
    resources:
      requests:
        memory: 4Gi
      limits:
        memory: 8Gi
    volumeMounts:
      - name: meta-vol
        mountPath: /root/jindofs-meta
    properties:
      namespace.meta-dir: "/root/jindofs-meta"

在上述YAML樣本中,demo-jindo-master-meta為提前建立的PVC,該PVC使用ESSD雲端硬碟作為儲存卷,這意味著Master Pod組件維護的元資訊能夠持久化儲存,並能夠隨Pod遷移。更多資訊,請參見通過配置JindoRuntime實現Master Pod組件狀態持久化儲存

策略三:合理配置FUSE Pod資源

緩衝系統用戶端程式運行於FUSE Pod中,FUSE Pod在節點上掛載FUSE檔案系統,該檔案系統將被掛載到應用Pod的指定路徑上,並暴露POSIX檔案提供者。這使得應用Pod往往不需要修改應用代碼,即可像訪問本機存放區一樣訪問遠程儲存系統中的資料,並享受到緩衝帶來的加速效果。FUSE程式維持了應用和緩衝系統之間的資料通道,因此推薦對FUSE Pod所使用的資源進行配置。

在Fluid中,可以通過配置Runtime資來源物件的spec.fuse.resources設定FUSE Pod的資源使用。為避免因FUSE程式OOM導致的檔案掛載點斷裂問題,推薦您對FUSE Pod不設定或設定較大的記憶體限制。例如,可以設定FUSE Pod的記憶體限制接近ECS節點的可分配記憶體大小。

spec:
  fuse:
    resources:
      requests:
        memory: 8Gi
    # limits:
    #   memory: <ECS_ALLOCATABLE_MEMORY>

策略四:開啟FUSE自愈功能提升資料訪問用戶端可用性

FUSE程式維持了應用和緩衝系統之間的資料通道。預設情況下,如果FUSE程式因某些預期之外的行為崩潰,即使FUSE程式重啟後恢複正常,應用程式容器也無法再通過該FUSE檔案系統掛載點訪問資料。為解決該問題,應用程式容器必須重啟(重新觸發FUSE檔案系統掛載點到應用Pod的綁定掛載邏輯)來恢複資料訪問,這將影響應用Pod的可用性。

Fluid提供了FUSE自愈機制,開啟該機制後應用程式容器無需重啟,即可在FUSE程式重啟後的一段時間後,自動回復應用程式容器內FUSE掛載點的資料訪問。

重要

在FUSE程式崩潰到重啟後的短暫時間內,應用Pod內掛載點仍然會處於不可訪問的狀態,這意味著應用必須自行處理此類I/O錯誤,避免應用崩潰,並包含重試邏輯。

如需開啟並使用FUSE自愈功能,請參見如何開啟FUSE自動回復能力。FUSE自愈能力存在較多限制,推薦僅在某些具有明確需求且業務適合的應用情境選擇性開啟此能力,例如:互動式編程開發情境,即使用線上Notebook或其他環境互動式開發調試某些應用程式。

緩衝讀寫一致性最佳實務

緩衝系統協助應用提升了資料訪問的效率,但相對地也會引入緩衝一致性問題。更強的一致性往往意味著效能損失或營運複雜度,因此推薦您根據需求選擇滿足業務情境需求的緩衝讀寫一致性配置策略。本節介紹如何在多種情境下配置緩衝讀寫一致性。

情境一:資料唯讀且後端儲存資料無變化

應用案例:單次AI模型訓練過程中,讀取固定資料集中的資料範例,執行AI模型的迭代訓練,訓練完成後資料緩衝即被清理。

配置方案:該情境為Fluid預設支援的應用情境,Fluid Dataset使用預設配置或顯式設定為唯讀即可。

配置樣本

apiVersion: data.fluid.io/v1alpha1
kind: Dataset
metadata:
  name: demo-dataset
spec:
  ...
  # accessModes: ["ReadOnlyMany"] ReadOnlyMany為預設值

通過設定accessModes: ["ReadOnlyMany"]確保資料集以唯讀形式掛載,可以避免訓練過程中對資料集的意外修改,同時也簡化了資料管理和緩衝策略。

情境二:資料唯讀且後端儲存資料周期性規律變化

應用案例:緩衝系統常駐於Kubernetes叢集中,業務相關資料每日被採集並儲存到後端儲存系統中。每日淩晨需要定時執行資料分析任務,對當天新增的業務相關資料進行分析處理和匯總,匯總結果不通過緩衝,直接寫入後端儲存系統。

配置方案:Fluid Dataset使用預設配置或顯式設定為唯讀;按周期規律定時執行資料預熱,同步後端儲存系統資料變化。

配置樣本

apiVersion: data.fluid.io/v1alpha1
kind: Dataset
metadata:
  name: demo-dataset
spec:
  ...
  # accessModes: ["ReadOnlyMany"] ReadOnlyMany為預設值。
---
apiVersion: data.fluid.io/v1alpha1
kind: DataLoad
metadata:
  name: demo-dataset-warmup
spec:
  ...
  policy: Cron
  schedule: "0 0 * * *" # 每日0點執行資料預熱。
  loadMetadata: true # 資料預熱時同步後端儲存系統資料變化。
  target:
  - path: /path/to/warmup # 指定了需要預熱的後端儲存系統路徑。
  • 通過設定accessModes: ["ReadOnlyMany"],確保資料集主要服務於讀取操作,即業務資料的寫入直接發生於後端儲存系統,而不會干擾到緩衝層,保證了資料的一致性與完整性。

  • 通過設定policy: Cronschedule: "0 0 * * *",確保了每天淩晨0點自動執行資料預熱操作,實現了資料的周期性預熱。同時,loadMetadata: true確保了在預熱過程中中繼資料也會被同步。

情境三:資料唯讀但後端儲存資料根據業務事件變化

應用案例:某模型推理服務允許上傳自訂的AI模型,並使用自訂模型執行推理。即上傳的AI模型不通過緩衝,直接寫入後端儲存系統,模型上傳成功後,可以選擇該模型執行推理,並查看推理結果。

配置方案:Fluid Dataset使用預設配置或顯式設定為唯讀;Runtime FUSE設定檔案元資訊逾時時間為較小值;禁用緩衝系統服務端的元資訊緩衝。

配置樣本:

使用JindoRuntime作為緩衝運行時:

apiVersion: data.fluid.io/v1alpha1
kind: Dataset
metadata:
  name: demo-dataset
spec:
  mounts:
    - mountPoint: <MOUNTPOINT>
      name: data
      path: /
      options:
        metaPolicy: ALWAYS # 通過設定metaPolicy: ALWAYS,禁用了服務端的中繼資料快取。
 ---
 apiVersion: data.fluid.io/v1alpha1
kind: JindoRuntime
metadata:
  name: demo-dataset
spec:
  fuse:
    args:
      - -oauto_cache
      # 設定元資訊逾時時間為30s。如果xxx_timeout=0能提供強一致性,但可能會大大降低資料讀取效率。
      - -oattr_timeout=30 
      - -oentry_timeout=30
      - -onegative_timeout=30
      - -ometrics_port=0

通過設定metaPolicy: ALWAYS,禁用了服務端的中繼資料快取。這確保了每次訪問都是直接查詢後端儲存,擷取最新中繼資料,適合需要更強一致性的應用情境。

情境四:資料讀取和寫入請求位於不同目錄

應用案例:大規模分布式AI訓練中,訓練任務從目錄A下讀取資料集中的資料範例,並在每輪(Epoch)訓練完成後,將模型的Checkpoint寫入到目錄B下。由於模型Checkpoint可能較大,希望通過緩衝寫入以提升效率。

配置方案:建立兩個Fluid Dataset,一個設定讀寫入模式為唯讀,一個設定讀寫入模式為讀寫,兩個Fluid Dataset分別掛載於目錄A和目錄B下,實現讀寫分離。

配置樣本:

apiVersion: data.fluid.io/v1alpha1
kind: Dataset
metadata:
  name: train-samples
spec:
  ...
  # accessModes: ["ReadOnlyMany"] ReadOnlyMany為預設值。
---
apiVersion: data.fluid.io/v1alpha1
kind: Dataset
metadata:
  name: model-ckpt
spec:
  ...
  accessModes: ["ReadWriteMany"] 

通過將訓練資料集train-samples設定為唯讀訪問模式accessModes: ["ReadOnlyMany"](ReadOnlyMany為預設值),從而使所有訓練任務只能從該目錄讀取資料,保證了資料來源的不可變性,避免了訓練過程中因寫操作引入的潛在一致性問題。同時,為模型Checkpoint目錄(model-ckpt)配置了讀寫入模式(accessModes: ["ReadWriteMany"]),允許訓練任務在每輪迭代後安全地寫入模型Checkpoint,提升了寫入效率。

應用Pod定義參考樣本如下:

apiVersion: v1
kind: Pod
metadata:
  ...
spec:
  containers:
  ...
    volumeMounts:
    - name: train-samples-vol
      mountPath: /data/A
    - name: model-ckpt-vol
      mountPath: /data/B
  volumes:
    - name: train-samples-vol
      persistentVolumeClaim:
        claimName: train-samples
    - name: model-ckpt-vol
      persistentVolumeClaim:
        claimName: model-ckpt

通過掛載兩個不同的Volume(train-samples-volmodel-ckpt-vol)到指定路徑(/data/A/data/B),實現了訓練資料集與模型Checkpoint目錄的物理隔離。

情境五:資料讀取和寫入請求必須在相同目錄

應用案例:在互動式編程開發情境(例如線上Jupyter Notebook開發或線上VSCode開發等),您擁有一個屬於自己的工作空間目錄。工作空間目錄中儲存了資料集、代碼等檔案。您可能會經常在工作空間目錄下新增、刪除、修改檔案。

配置方案:Dataset設定讀寫入模式為讀寫;推薦使用具有完整POSIX相容性的儲存系統作為後端實現。

配置樣本:

apiVersion: data.fluid.io/v1alpha1
kind: Dataset
metadata:
  name: myworkspace
spec:
  ...
  accessModes: ["ReadWriteMany"] 

通過設定accessModes: ["ReadWriteMany"],確保多個使用者或進程可以同時讀取和寫入同一個工作空間目錄。