O Fluid é um orquestrador e acelerador de conjuntos de dados distribuídos, nativo do Kubernetes e de código aberto, projetado para aplicações com uso intensivo de dados em cenários cloud-native. O Fluid proporciona observabilidade, escalabilidade e aceleração de acesso aos conjuntos de dados por meio do gerenciamento e agendamento de EFCRuntimes. Este tópico descreve como usar o Fluid EFCRuntime para acelerar o acesso a sistemas de arquivos File Storage NAS (NAS) ou CPFS.
ou CPFS
Pré-requisitos
A instância do Elastic Compute Service (ECS) usa o Alibaba Cloud Linux 2 como sistema operacional, com versão de kernel 4.19.91-23 ou superior.
Crie um cluster Container Service for Kubernetes (ACK) Pro com Kubernetes 1.18 ou posterior. Para mais informações, consulte Criar um cluster ACK Pro.
-
Ative o serviço NAS e garanta que os nós do cluster ACK Pro possam montar e acessar um sistema de arquivos NAS Capacity, NAS Performance .
NotaEm cenários de treinamento de IA, selecione o tipo de sistema de arquivos NAS com base no throughput exigido pelos jobs de treinamento. Para mais detalhes, consulte o Guia de seleção.
Conecte um cliente kubectl ao cluster ACK Pro. Consulte Conectar-se a um cluster ACK usando kubectl para obter instruções.
Visão geral do EFC
O Elastic File Client (EFC) é um cliente POSIX baseado em FUSE desenvolvido pela equipe técnica do NAS. Ele substitui o cliente NFS em modo kernel e permite acesso a dados via múltiplas conexões, cache de metadados e cache de dados distribuído para aumentar a velocidade de leitura. Além disso, o EFC oferece suporte a monitoramento de desempenho pelo Managed Service for Prometheus. Em comparação com os clientes NFS V3 e V4.x em modo kernel e outros clientes baseados em FUSE, o EFC apresenta as seguintes vantagens:
Consistência semântica forte: o mecanismo de bloqueio distribuído do EFC garante consistência rigorosa para arquivos e diretórios. Dados gravados em um arquivo tornam-se imediatamente legíveis por outros clientes, e arquivos recém-criados ficam acessíveis instantaneamente. Esse recurso facilita a sincronização de dados entre múltiplos nós.
Cache de leitura e escrita em servidores individuais: o EFC otimiza a lógica de cache do FUSE e utiliza uma pequena quantidade de memória no nó para acelerar operações em arquivos pequenos. Comparado aos clientes NFS tradicionais, o desempenho de leitura e escrita em cache melhora em mais de 50%.
Caches distribuídos somente leitura: o EFC usa a memória de vários nós para criar um pool de cache que escala horizontalmente de forma automática e atende à demanda crescente de computação.
Pré-busca de arquivos pequenos: o EFC pré-carrega dados frequentes em diretórios muito acessados para reduzir a sobrecarga associada à busca de dados.
Atualizações dinâmicas e capacidades de failover: o EFC executa failover em segundos e realiza atualizações dinâmicas nos clientes sem interromper seus serviços.
Use o Fluid EFCRuntime para acelerar o acesso a sistemas de arquivos NAS
O Fluid usa recursos personalizados do Kubernetes relacionados ao Fluid EFCRuntime para se conectar ao EFC e facilitar a implementação de observabilidade e escalabilidade para conjuntos de dados.
Limitações
O Fluid EFCRuntime apresenta as seguintes limitações:
O Fluid EFCRuntime não oferece suporte a pré-busca de cache via DataLoad. O armazenamento em cache ocorre apenas no primeiro acesso aos dados.
O Fluid EFCRuntime não expõe o status de cache dos conjuntos de dados.
O Fluid EFCRuntime está disponível apenas nas seguintes regiões: China (Zhangjiakou), China (Pequim), China (Guangzhou), China (Shenzhen) e China (Xangai).
Funcionamento do Fluid EFCRuntime
A figura abaixo ilustra como o Fluid EFCRuntime armazena em cache dados do NAS no armazenamento local para acelerar o acesso. O processo funciona da seguinte maneira:
Crie definições de recursos personalizados (CRDs) de datasets e EFCRuntimes para especificar informações sobre os sistemas de arquivos NAS de origem.
Os controladores do Fluid implantam os componentes EFC Cache Worker e EFC FUSE com base nas informações dos sistemas de arquivos de origem.
Ao criar um pod, use uma persistent volume claim (PVC) para montar o destino de montagem do sistema de arquivos, exposto pelo cliente EFC FUSE, no pod.
Ao acessar dados em um sistema de arquivos NAS montado, o cliente EFC FUSE encaminha a solicitação ao EFC Cache Worker. Esse componente verifica se os dados já existem no armazenamento local. Se estiverem em cache, o acesso é direto. Caso contrário, o EFC Cache Worker lê os dados do sistema de arquivos NAS , armazena-os localmente e permite o acesso ao cache.
Dataset: CRD definido pelo Fluid que representa uma coleção de dados logicamente relacionados, usados pelos mecanismos de computação das camadas superiores.
-
EFCRuntime: runtime responsável por acelerar o acesso aos conjuntos de dados, usando o EFC como mecanismo de cache. Os mecanismos de cache do EFC incluem os componentes EFC Cache Worker e EFC FUSE.
EFC Cache Worker: componente do lado do servidor que habilita o cache baseado em hash consistente. Você pode desativá-lo conforme necessário; porém, isso desabilita os caches distribuídos somente leitura, sem afetar outras funcionalidades.
EFC FUSE: componente do lado do cliente do EFC que expõe interfaces de acesso a dados via protocolo POSIX.
Procedimento
Etapa 1: Instalar o ack-fluid
Instale o pacote de IA cloud-native e o ack-fluid versão 0.9.10 ou posterior.
Se você instalou o Fluid open source, desinstale-o antes de instalar o componente ack-fluid.
Instalar ack-fluid sem o pacote de IA cloud-native
Ative a opção Fluid data acceleration durante a instalação do pacote de IA cloud-native. Para mais detalhes, consulte Implantar o pacote de IA cloud-native.
Instalar ack-fluid com o pacote de IA cloud-native já instalado
Faça login no console do ACK. No painel de navegação à esquerda, clique em Clusters.
Na página Clusters, clique no nome do seu cluster. No painel de navegação à esquerda, clique em .
Na página Cloud-native AI Suite, localize o ack-fluid e clique em Deploy na coluna Actions.
Na mensagem Install Component, clique em Confirm.
Atualizar ack-fluid para 0.9.10 ou posterior
Faça login no console do ACK. No painel de navegação à esquerda, clique em Clusters.
Na página Clusters, clique no nome do seu cluster. No painel de navegação à esquerda, clique em .
Na página Cloud-native AI Suite, localize o ack-fluid e clique em Upgrade na coluna Actions.
Na mensagem Upgrade Component, clique em Confirm.
Etapa 2: Gravar dados no sistema de arquivos NAS
Se o sistema de arquivos NAS já contiver dados armazenados, pule esta etapa.
Monte o sistema de arquivos NAS em uma instância ECS. Para mais informações, consulte Montar sistema de arquivos NFS com um clique.
-
Execute o comando a seguir para consultar o destino de montagem do sistema de arquivos CPFS:
findmnt /mntSaída esperada:
TARGET SOURCE FSTYPE OPTIONS /mnt/nfs xxxxxxxxxxx-xxxxx.cn-beijing.nas.aliyuncs.com:/ nfs rw,relatime,vers=3,rsize=1048576,wsize=1048576,namlen=255,hard,nolock,no -
Execute o comando abaixo para criar um arquivo de 10 GB no diretório de montagem do sistema de arquivos NAS:
dd if=/dev/zero of=/mnt/nfs/allzero-demo count=1024 bs=10MSaída esperada:
1024+0 records in 1024+0 records out 10737418240 bytes (11 GB) copied, 50.9437 s, 211 MB/s
Etapa 3: Criar um dataset e um EFCRuntime
-
Crie um arquivo chamado dataset.yaml e copie o conteúdo abaixo para ele:
Exemplo de código NAS
apiVersion: data.fluid.io/v1alpha1 kind: Dataset metadata: name: efc-demo spec: mounts: - mountPoint: "nfs://<nas_url>:<nas_dir>" name: efc path: "/" --- apiVersion: data.fluid.io/v1alpha1 kind: EFCRuntime metadata: name: efc-demo spec: replicas: 3 master: networkMode: ContainerNetwork worker: networkMode: ContainerNetwork fuse: networkMode: ContainerNetwork tieredstore: levels: - mediumtype: MEM path: /dev/shm quota: 15GiExemplo de código CPFS
apiVersion: data.fluid.io/v1alpha1 kind: Dataset metadata: name: efc-demo spec: mounts: - mountPoint: "cpfs://file-system-id.region.cpfs.aliyuncs.com:/share/path" name: efc path: "/mnt" --- apiVersion: data.fluid.io/v1alpha1 kind: EFCRuntime metadata: name: efc-demo spec: replicas: 3 master: networkMode: ContainerNetwork worker: networkMode: ContainerNetwork fuse: networkMode: ContainerNetwork tieredstore: levels: - mediumtype: MEM path: /dev/shm quota: 15GiModelo de exemplo para sistema de arquivos NAS
apiVersion: data.fluid.io/v1alpha1 kind: Dataset metadata: name: efc-demo spec: mounts: - mountPoint: "nfs://<nas_url>:<nas_dir>" name: efc path: "/" --- apiVersion: data.fluid.io/v1alpha1 kind: EFCRuntime metadata: name: efc-demo spec: replicas: 3 master: networkMode: ContainerNetwork worker: networkMode: ContainerNetwork fuse: networkMode: ContainerNetwork tieredstore: levels: - mediumtype: MEM path: /dev/shm quota: 15GiO arquivo dataset.yaml serve para criar um dataset e um EFCRuntime.
O dataset especifica informações sobre o sistema de arquivos NAS , incluindo a URL do sistema NAS e o diretório desejado para montagem.
O EFCRuntime inicia um sistema de cache EFC para fornecer serviços de cache. Defina o número de pods replicados para o componente worker do sistema de cache EFC e a capacidade de cache de cada componente worker.
Parâmetro
Descrição
mountPoint
Para sistemas de arquivos NAS, defina o valor no formato
nfs://<nas_url>:<nas_dir>.nas_url: URL do sistema de arquivos NAS.
Para obter a URL do sistema de arquivos NAS, realize as seguintes operações: Faça login no console do NAS. No painel de navegação à esquerda, escolha File System > File System List. Na página File System List, localize o sistema de arquivos NAS que deseja montar e clique em Manage na coluna Actions. Na página exibida, clique em Mount Targets. Para mais informações, veja Gerenciar destinos de montagem.
nas_dir: Subdiretório que você deseja montar. Geralmente, defina o valor como o diretório raiz. Por exemplo, o valor
efc://xxxxxxxxxxx-xxxxx.cn-beijing.nas.aliyuncs.com:/especifica o diretório raiz de um sistema de arquivos NAS.
replicas
Quantidade de pods replicados criados para o componente worker do sistema de cache EFC. Defina o valor considerando o tamanho da memória do nó de computação e o tamanho do conjunto de dados. Recomenda-se garantir que o produto do valor de quota pelo valor de replicas seja maior que o tamanho do conjunto de dados.
networkMode
Valores válidos: ContainerNetwork e HostNetwork. Em ambientes ACK, configure como ContainerNetwork. Este modo de rede não compromete o desempenho da rede.
mediumtype
Tipo de cache. Valores válidos: HDD, SSD e MEM. O valor MEM indica memória. Para cenários de treinamento de IA, defina este parâmetro como MEM. Ao escolher MEM, configure o parâmetro path para um sistema de arquivos em memória, como tmpfs.
path
Diretório de cache nos pods dos componentes worker do sistema de cache EFC. Defina este parâmetro como /dev/shm.
quota
Capacidade de cache de cada componente worker. Configure o valor baseando-se no tamanho da memória do nó de computação e no tamanho do conjunto de dados. Garanta que o produto do valor de quota pelo valor de replicas exceda o tamanho do conjunto de dados.
-
Execute o comando a seguir para criar um EFCRuntime e um dataset:
kubectl create -f dataset.yaml -
Execute o comando abaixo para verificar se o Dataset foi implantado:
kubectl get dataset efc-demoSaída esperada:
NAME UFS TOTAL SIZE CACHED CACHE CAPACITY CACHED PERCENTAGE PHASE AGE efc-demo Bound 24mO estado Bound do dataset indica que o sistema de cache EFC opera corretamente no cluster e que os pods da aplicação podem acessar os dados fornecidos pelo dataset.
-
Execute o seguinte comando para confirmar a implantação do EFCRuntime:
kubectl get efcruntimeSaída esperada:
NAME MASTER PHASE WORKER PHASE FUSE PHASE AGE efc-demo Ready Ready Ready 27mOs resultados mostram que os componentes master, worker e FUSE encontram-se no estado Ready.
-
Execute os comandos abaixo para verificar a criação do persistent volume (PV) e da PVC:
Após o dataset e o sistema de cache EFC estarem prontos, o Fluid cria automaticamente uma PVC e um PV.
kubectl get pv,pvcSaída esperada:
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE persistentvolume/default-efc-demo 100Gi ROX Retain Bound default/efc-demo fluid 94m NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE persistentvolumeclaim/efc-demo Bound default-efc-demo 100Gi ROX fluid 94m
Etapa 4: Criar uma aplicação para acessar dados
Crie uma aplicação para validar a aceleração no acesso aos dados. Neste exemplo, cria-se uma aplicação com dois pods para acessar o sistema de arquivos NAS múltiplas vezes a partir de dois nós diferentes. Avalie o desempenho de aceleração do Fluid EFCRuntime medindo o tempo necessário para acessar os dados.
-
Crie um arquivo chamado app.yaml e copie o conteúdo a seguir para ele.
O conteúdo abaixo define um StatefulSet chamado efc-app, contendo dois pods. Cada pod possui a PVC efc-demo montada no diretório /data.
apiVersion: apps/v1 kind: StatefulSet metadata: name: efc-app labels: app: nginx spec: serviceName: nginx replicas: 2 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: registry.openanolis.cn/openanolis/nginx:1.14.1-8.6 command: ["/bin/bash"] args: ["-c", "sleep inf"] volumeMounts: - mountPath: "/data" name: data-vol volumes: - name: data-vol persistentVolumeClaim: claimName: efc-demo -
Execute o comando a seguir para criar um StatefulSet denominado efc-app:
kubectl create -f app.yaml -
Execute o comando abaixo para consultar o tamanho do arquivo especificado:
kubectl exec -it efc-app-0 -- du -h /data/allzero-demoSaída esperada:
10G /data/allzero-demo -
Consulte o tempo necessário para ler o arquivo especificado a partir da aplicação.
NotaO tempo e o throughput podem variar dependendo do ambiente de execução e do método de medição. Neste tópico, o cluster possui três instâncias ECS do tipo ecs.g7ne.8xlarge. O EFCRuntime efc-demo tem três pods worker rodando na mesma instância ECS. Já o StatefulSet efc-app possui dois pods executando separadamente nas outras duas instâncias ECS. O tempo de acesso aos dados não sofre influência do cache do kernel no nó onde o cliente EFC FUSE está em execução.
-
Execute o comando a seguir para verificar o tempo necessário para ler o arquivo especificado a partir do pod efc-app-0 do StatefulSet:
NotaPara ler outro arquivo, substitua /data/allzero-demo pelo caminho do arquivo desejado.
kubectl exec -it efc-app-0 -- bash -c "time cat /data/allzero-demo > /dev/null"Saída esperada:
real 0m15.792s user 0m0.023s sys 0m2.404sOs resultados indicam que foram necessários 15.792 segundos para ler um arquivo de 10 GB, resultando em uma velocidade de leitura de 648 MiB/s.
-
Execute o comando abaixo para verificar o tempo necessário para ler o mesmo arquivo de 10 GB a partir do outro pod do StatefulSet:
NotaCaso deseje ler outro arquivo, substitua
/data/allzero-demopelo caminho correspondente.kubectl exec -it efc-app-1 -- bash -c "time cat /data/allzero-demo > /dev/null"Saída esperada:
real 0m9.970s user 0m0.012s sys 0m2.283sOs resultados mostram que foram gastos 9.970 segundos para ler um arquivo de 10 GB, atingindo uma velocidade de leitura de 1.034,3 MiB/s.
Com o uso do Fluid EFCRuntime, a velocidade de leitura aumentou de 648 MiB/s para 1.034,3 MiB/s. Para o mesmo arquivo, o Fluid EFCRuntime elevou a velocidade de leitura em aproximadamente 100%.
-