> 기술 주변기기 > 일체 포함 > PyTorch를 기반으로 한 WeChat의 대규모 추천 시스템 교육 실습

PyTorch를 기반으로 한 WeChat의 대규모 추천 시스템 교육 실습

王林
풀어 주다: 2023-04-12 12:13:02
앞으로
1337명이 탐색했습니다.

PyTorch를 기반으로 한 WeChat의 대규모 추천 시스템 교육 실습

이 글에서는 PyTorch를 기반으로 한 WeChat의 대규모 추천 시스템 교육을 소개합니다. 다른 딥러닝 분야와 달리 추천 시스템은 여전히 ​​Tensorflow를 교육 프레임워크로 사용하는데, 이는 대다수 개발자로부터 비판을 받고 있습니다. 추천 교육을 위해 PyTorch를 활용하는 사례도 있지만 규모가 작고 실제 사업 검증이 없어 사업 얼리 어답터 홍보가 어렵다.

2022년 2월, PyTorch 팀은 공식 추천 라이브러리인 TorchRec을 출시했습니다. 우리 팀은 5월부터 내부 업무에서 TorchRec을 시도하기 시작했고 TorchRec 팀과 일련의 협력을 시작했습니다. 몇 달 간의 시험 사용 동안 우리는 TorchRec의 많은 장점을 경험했으며, TorchRec이 초대형 모델에서는 여전히 일부 단점을 갖고 있다고 생각합니다. 이러한 단점을 보완하기 위해 확장된 기능을 설계했습니다. 2022년 9월, 우리가 설계한 확장 기능 동적 임베딩이 공식적으로 TorchRec의 메인 브랜치에 통합되었으며 공식 팀과 함께 지속적으로 최적화되고 있습니다.

PyTorch를 기반으로 한 WeChat의 대규모 추천 시스템 교육 실습


1. TorchRec이 우리에게 무엇을 가져다 줄 수 있나요? 추천 시스템은 회사의 현금 흐름과 직접적으로 연결되는 경우가 많고 시행착오의 비용이 매우 높기 때문에 모든 사람에게 필요한 것은 비즈니스에서 테스트한 프레임워크입니다. 이것이 PyTorch를 기반으로 한 일부 이전 추천 프레임워크가 널리 사용되지 않은 이유입니다. 공식 추천 프레임워크인 TorchRec은 2022년 1월에 출시되었습니다. Meta는 이미 이를 사용하여 Instagram Reels 비즈니스에서 1,250억 개의 매개변수 모델을 성공적으로 훈련하고 출시하여 비즈니스 테스트를 거친 PyTorch 프레임워크가 되었습니다. 인스타그램과 같은 대기업의 지원으로 우리는 더 많은 자신감을 갖게 되었고 마침내 PyTorch 기반 추천 프레임워크의 장점을 합리적으로 고려할 수 있게 되었습니다.

PyTorch를 기반으로 한 WeChat의 대규모 추천 시스템 교육 실습

TorchRec은 팀원마다 다양한 혜택을 제공합니다. 우선, 팀 내 대다수의 알고리즘 엔지니어는 PyTorch 권장 프레임워크를 통해 모든 사람이 마침내 CV 및 NLP 엔지니어가 경험한 보다 인간적인 동적 그래픽 및 디버깅 경험을 즐길 수 있게 되었습니다.

PyTorch를 기반으로 한 WeChat의 대규모 추천 시스템 교육 실습

또한 PyTorch1.8 기반 모델은 코드 한 줄도 변경하지 않고 최신 버전 1.13에서 실행할 수 있는 PyTorch의 뛰어난 호환성을 통해 알고리즘 엔지니어가 최종적으로 프레임워크를 자신있게 업그레이드할 수 있습니다. 최신 프레임워크 기능과 더 나은 성능을 제공합니다. 반면에 TensorFlow 기반의 일부 권장 프레임워크는 특정 버전의 TensorFlow에서 멈추는 경우가 많습니다. 예를 들어 많은 팀에서는 여전히 TensorFlow 1.x 기반의 내부 프레임워크를 사용할 수 있습니다. TensorFlow 1.x는 2021년 1월에 유지 관리를 중단했습니다. 즉, 지난 2년 동안 모든 새로운 버그와 새로운 기능이 제대로 지원되지 않을 것임을 의미합니다. 사용 중에 발생한 문제는 내부 유지 관리 팀에서만 수리할 수 있으며, 이로 인해 추가 비용이 발생합니다. 적시에 프레임워크를 업그레이드하면 속도가 무료로 향상될 수도 있습니다. PyTorch의 상위 버전은 상위 CUDA 버전과 일치하는 경우가 많을 뿐만 아니라 훈련 속도를 더욱 높이고 훈련 효율성을 향상시킬 수 있는 CUDA 그래프와 같은 몇 가지 새로운 기능도 있습니다.

알고리즘 엔지니어 외에도 프레임워크 팀도 추천 팀의 중요한 부분입니다. 사내 프레임워크팀에서는 오픈소스 프레임워크 선정 후 내부 필요에 따라 2차 개발을 진행하게 됩니다. 이들에게 권장되는 PyTorch 프레임워크는 더욱 효율적인 개발 경험으로 이어질 것입니다. 많은 기존 TensorFlow 권장 프레임워크는 C++ 세션 기반 확장을 만들기 위해 TF 제공을 모방합니다. 이 설계 솔루션은 당시 매우 진보된 솔루션으로 간주되었습니다. 그러나 이를 위해서는 코드 한 줄만 변경하려면 전체 TensorFlow를 완전히 컴파일해야 합니다. 시간이 많이 걸리고, 인트라넷에서 외부 종속성을 다운로드하는 등의 사소한 문제까지 해결해야 하고, 개발 경험도 그다지 좋지 않습니다.

PyTorch는 Python 철학을 핵심으로 삼고 모든 사람이 자유롭게 확장할 수 있기를 바라기 때문에 PyTorch를 사용할 때 이러한 문제가 발생하지 않습니다. 2차 개발을 할 때는 pybind11과 같은 상대적으로 성숙한 Python 라이브러리로 캡슐화하고 라이브러리를 동적 링크 라이브러리로 패키징한 다음 로드하기만 하면 됩니다. 이러한 방식으로 전체 컴파일 속도는 자연스럽게 훨씬 빨라지고 학습 비용은 훨씬 낮아집니다.

앞서 언급했듯이 PyTorch는 이전 버전과의 호환성이 매우 뛰어난 프레임워크이므로 유지 관리 팀이 여러 버전을 유지할 필요가 없으며 모든 사람이 특정 문제에 집중할 수 있습니다. 필요에 따라 팀원의 효율성이 크게 향상됩니다.

위 내용은 PyTorch 추천 프레임워크로서 TorchRec의 모든 장점입니다. 우리를 매우 기쁘게 하는 것은 TorchRec 팀이 PyTorch 추천 프레임워크를 만드는 데 그치지 않는다는 것입니다. 그들은 기존 추천 모델 및 하드웨어의 특성을 관찰하고 프레임워크에 많은 새로운 기능을 추가하여 TorchRec에 기존 추천 프레임워크에 비해 확실한 성능 이점을 제공했습니다. 다음으로는 그 중 몇 가지를 골라 GPU 임베딩, TorchRec의 뛰어난 GPU 커널, 그리고 TorchRec이 네트워크 통신을 기반으로 수행할 수 있는 임베딩 분할을 소개하겠습니다.

PyTorch를 기반으로 한 WeChat의 대규모 추천 시스템 교육 실습

​첫 번째는 GPU 임베딩입니다. 먼저 기존 추천 시스템 GPU 훈련 프로세스를 검토해 보겠습니다. GPU 작업자에 특정 모델을 배치하고 임베딩은 원격 PS에 저장됩니다. 각 반복 단계에서는 먼저 원격 PS에서 매개변수를 가져온 다음 GPU에서 모델의 정방향 및 역방향 계산을 수행하고 경사도를 PS로 다시 전송하고 PS의 매개변수를 업데이트합니다.

사진의 녹색 부분은 GPU에서 수행되는 작업이고, 빨간색 부분은 네트워크나 CPU에서 수행되는 작업입니다. GPU는 시스템에서 가장 비싼 부분임에도 불구하고 많은 작업이 GPU에 배치되지 않는 것을 볼 수 있습니다. ​

PyTorch를 기반으로 한 WeChat의 대규모 추천 시스템 교육 실습

기존 프로세스에서는 GPU를 최대한 활용하지 않습니다. 동시에, 하드웨어 관점에서 볼 때 단일 GPU 카드의 메모리는 점점 더 커지고 있으며 일부 밀도가 높은 모델은 NVIDIA의 지속적인 최적화를 통해 NV 링크와 GPU 다이렉트 RDMA도 인터를 만들었습니다. - 카드 통신이 더욱 빨라졌습니다.

PyTorch를 기반으로 한 WeChat의 대규모 추천 시스템 교육 실습

GPU 임베딩은 매우 간단한 솔루션입니다. 그는 임베딩을 직접 나누어 GPU에 배치합니다. 예를 들어 단일 시스템에 8개의 카드가 있는 경우 임베딩을 8개의 부분으로 직접 나누고 각 부분을 카드에 배치합니다. 카드. . GPU 활용 효율이 크게 향상되고, 훈련 속도도 질적으로 향상됩니다. GPU의 비디오 메모리 공간이 부족하다고 걱정되는 경우 TorchRec은 UVM도 지원합니다. UVM은 비디오 메모리에 대한 보충으로 호스트의 메모리 일부를 미리 나누어 내부에 배치할 수 있는 임베딩 크기를 늘릴 수 있습니다. 단일 기계.

PyTorch를 기반으로 한 WeChat의 대규모 추천 시스템 교육 실습

TorchRec은 GPU 임베딩 외에도 매우 뛰어난 GPU 커널을 구현합니다. 이러한 커널은 최신 하드웨어 기능과 CUDA 기능을 최대한 활용합니다.

PyTorch를 기반으로 한 WeChat의 대규모 추천 시스템 교육 실습

예를 들어 임베딩 조회 커널을 구현하려는 경우, 즉 대규모 임베딩의 ID에 해당하는 임베딩 벡터 묶음을 찾아야 하는 경우 일반적인 구현에서 각 GPU 스레드는 ID를 할당하고 각각 해당하는 임베딩을 찾도록 하세요. 이때 GPU의 맨 아래 레이어는 워프에 따라 스케줄링되며, 워프에 있는 32개의 스레드가 함께 비디오 메모리를 읽고 쓴다는 점을 고려해야 합니다. 이는 위의 과정에서 ID를 읽을 때 비디오 메모리에 계속 액세스하더라도 후속 복사본은 무작위 읽기 및 쓰기 상태가 된다는 것을 의미합니다. 하드웨어의 경우 임의 읽기 및 쓰기는 메모리 대역폭을 완전히 활용할 수 없으며 작동 효율성도 충분히 높지 않습니다.

PyTorch를 기반으로 한 WeChat의 대규모 추천 시스템 교육 실습

TorchRec은 shuffle_sync와 같은 워프 프리미티브를 사용하여 각 스레드에서 ID를 읽은 후 워프의 모든 스레드에 ID를 브로드캐스팅하여 랩 내의 32개 스레드가 동시에 처리할 수 있도록 합니다. 동일한 임베딩으로 , 지속적인 메모리 읽기 및 쓰기가 수행될 수 있어 비디오 메모리의 대역폭 활용 효율성이 크게 향상되고 커널 속도가 여러 배 증가합니다.

PyTorch를 기반으로 한 WeChat의 대규모 추천 시스템 교육 실습

이 표는 임베딩 조회 성능 향상에 대한 공식 테스트입니다. 여기서 Fused EBC는 최적화된 커널입니다. 다양한 설정에서 TorchRec은 기본 PyTorch에 비해 성능이 수십 배 향상되었음을 알 수 있습니다. TorchRec을 기반으로 우리는 임베딩이 상대적으로 작을 때(128개 미만) 절반 이상의 스레드가 유휴 상태일 수 있으므로 워프의 스레드를 추가로 그룹화하여 동시에 여러 임베딩을 처리할 수 있음을 발견했습니다.

PyTorch를 기반으로 한 WeChat의 대규모 추천 시스템 교육 실습

PyTorch를 기반으로 한 WeChat의 대규모 추천 시스템 교육 실습

개선을 통해 Small Embedding Dim의 커널이 10%~30% 향상되었습니다. 이 최적화는 공식 저장소에도 통합되었습니다. TorchRec의 커널은 FBGEMM 라이브러리에 위치합니다. 관심 있는 친구들은 살펴볼 수 있습니다.

PyTorch를 기반으로 한 WeChat의 대규모 추천 시스템 교육 실습

마지막으로 TorchRec의 Embedding 분할 메커니즘을 소개하겠습니다. 앞서 언급한 것처럼 GPU 임베딩은 임베딩을 나누어서 카드에 넣는 방식이므로 어떻게 분할할지 고민이 필요한 문제가 됩니다. 전통적으로 행별(Rowwise)과 열별(Columnwise)이라는 두 가지 나누기 아이디어가 있습니다. 행 방식은 20,000개의 특성이 있는 경우 0에서 10000까지의 숫자가 카드 1에 배치되고 10000에서 20000까지의 숫자가 카드 2에 배치된다는 의미입니다. 이런 식으로 학습할 때 ID가 카드 1에 해당하면 시작합니다. from 카드 1에서 가져오고, 카드 2에 해당하면 카드 2에서 가져옵니다. Rowwise의 문제점은 처음 10,000개 번호와 마지막 10,000개 번호의 트래픽 양 사이에 큰 차이가 있는지 여부를 알 수 없기 때문에 통신이 불균형하고 네트워크 하드웨어를 완전히 활용할 수 없다는 것입니다.

칼럼 방향은 삽입 길이의 관점에서 나누어집니다. 예를 들어 임베딩의 전체 길이는 128입니다. 처음 64차원과 마지막 64차원을 서로 다른 위치에 배치할 수 있습니다. 이렇게 하면 통신이 더욱 균형을 이루게 되지만 읽을 때는 모든 카드나 PS와 통신해야 합니다. .

PyTorch를 기반으로 한 WeChat의 대규모 추천 시스템 교육 실습

분할 모드의 차이로 인해 선택이 절충됩니다. 기존 추천 프레임워크는 디자인에서 임베딩 분할 방법을 수정하는 반면, TorchRec은 행 단위, 열 단위, 심지어 테이블 단위, 데이터 병렬과 같은 여러 분할 방법을 지원하고 Planner, Estimator, PerfModel 및 기타 모듈과 같은 내부 기능을 자동으로 제공합니다. 대역폭, 비디오 메모리, 메모리, 모델 크기 및 사용 시나리오의 기타 매개변수를 기반으로 분할 방법을 계산합니다. 이런 식으로 우리의 실제 하드웨어 조건에 따라 임베딩을 가장 효율적으로 분할할 수 있으며, 하드웨어를 가장 효율적으로 활용할 수 있습니다. 이러한 함수의 대부분은 Python으로 구현됩니다. 이를 통해 우리 내부 환경에 맞게 맞춤화할 수 있고, 우리 내부 환경에 가장 적합한 추천 시스템을 쉽게 구축할 수 있습니다.

2. 수백억 개의 모델에 대한 실험 결과

PyTorch를 기반으로 한 WeChat의 대규모 추천 시스템 교육 실습

DeepFM, DCN과 같은 표준 모델에 대해 TorchRec이 권장하는 프레임워크는 이전 벤치마크와 비교했을 때 놀라운 10~15배의 성능을 발휘합니다. 성능 개량. 이러한 성능 향상을 얻으면 TorchRec을 사업에 착수할 수 있다는 자신감을 갖게 됩니다.

PyTorch를 기반으로 한 WeChat의 대규모 추천 시스템 교육 실습

WeChat 읽기 미세 인쇄 모델의 경우 정렬 정확도를 기반으로 실제 데이터에서는 약 3배, 가짜 데이터에서는 약 10배 정도 성능이 향상되는 것을 확인했습니다. 여기서 차이점은 훈련을 위해 데이터를 읽는 것이 병목 현상이 발생했다는 것이며, 우리는 이와 관련하여 계속해서 최적화를 진행하고 있다는 것입니다.

03

원래 솔루션은 1000억개 이상의 모델에서는 단점이 있습니다

PyTorch를 기반으로 한 WeChat의 대규모 추천 시스템 교육 실습

앞서 소개한 모델들은 기본적으로 모델들입니다 100억 이하. 즉, 단일 기계에 들어갈 수 있는 모델입니다. TorchRec을 더 큰 모델로 추진하는 동안 우리는 TorchRec의 기본 디자인에서 몇 가지 문제를 발견했습니다. 대형 모델의 경우 TorchRec의 순수 GPU 임베딩 솔루션에는 더 많은 카드가 필요합니다. 8개의 카드의 원래 학습 속도는 모든 데이터를 흡수할 수 있지만 임베딩을 배치하려면 16개의 카드를 사용해야 하므로 GPU 하드웨어를 개선하기가 어렵습니다. 활용 효율성이 다시 저하되었습니다.

그리고 대규모 모델 시나리오의 경우 알고리즘 팀에서는 일주일 동안 액세스하지 않은 ID를 삭제하는 등 임베딩을 위한 동적 추가 및 삭제 요구 사항을 제시하는 경우가 많습니다. TorchRec의 솔루션은 이러한 기능을 지원하지 않습니다. 또한 매우 큰 모델 비즈니스에는 일반적으로 많은 팀이 참여하므로 기본 프레임워크를 마이그레이션하는 데 큰 저항이 발생합니다. 우리에게 필요한 것은 점진적이고 점진적인 마이그레이션에 대한 지원이며 모든 사람이 당면한 작업을 중단하도록 할 수는 없습니다. 이는 비용이 너무 많이 들고 위험합니다.

PyTorch를 기반으로 한 WeChat의 대규모 추천 시스템 교육 실습

위의 요구 사항을 기반으로 매우 대규모 모델의 시나리오에 적응할 수 있도록 TorchRec을 수정하는 방법을 고려했습니다. 우리는 원격 CPU PS가 매우 성숙하고 임베딩의 동적 추가를 쉽게 지원할 수 있기 때문에 초대형 훈련에서는 여전히 원격 PS 연결을 지원해야 한다고 믿습니다. 동시에 팀 간 협력을 위해 PS를 사용하여 훈련과 추론을 분리하여 점진적인 마이그레이션을 달성할 수 있습니다.

PyTorch를 기반으로 한 WeChat의 대규모 추천 시스템 교육 실습

그럼 다음 질문은 PS 소개 방법입니다. PS가 GPU 임베딩에 직접 연결된 경우 각 반복 단계는 여전히 원격 PS에 액세스해야 하므로 전체 네트워크 및 CPU 작업의 비율이 증가하고 GPU 사용률이 낮아집니다.

04

WeChat 팀의 동적 임베딩 문제를 해결하는 방법

PyTorch를 기반으로 한 WeChat의 대규모 추천 시스템 교육 실습

이번에 우리는 단위 시간당 데이터의 새 ID가 실제로는 단지 전체 데이터 중 아주 작은 부분을 차지합니다. 작은 부분에 대해 HugeCTR도 논문에서 비슷한 결론을 언급했습니다. 즉, ID의 작은 부분만이 자주 액세스됩니다. 여기서 우리는 정상적으로 훈련을 위해 GPU 임베딩을 사용하고, 디스플레이 메모리가 가득 차면 일괄적으로 ID를 PS로 내보내는 것을 생각했습니다.

PyTorch를 기반으로 한 WeChat의 대규모 추천 시스템 교육 실습

이 아이디어에 따르면 n개의 ID만 GPU 임베딩에 저장할 수 있고 ID의 총 개수는 N이거나 심지어 무한할 수도 있습니다. 전역 ID는 0, 1, 2, 3... 순으로 매핑될 수 있으며, 매핑 관계는 ID 변환이라는 구조에 저장되어 GPU 임베딩이 매핑 결과를 일반 훈련에 사용할 수 있도록 합니다. GPU 임베딩이 가득 차면, 즉 ID 변환기에 n 쌍의 매핑이 있으면 ID가 일괄적으로 PS로 제거됩니다.

PyTorch를 기반으로 한 WeChat의 대규모 추천 시스템 교육 실습

PyTorch를 기반으로 한 WeChat의 대규모 추천 시스템 교육 실습

이 설계에서는 PS가 거의 개입할 수 없으며 퇴거할 때만 GPU 작업자와 PS 통신이 필요합니다.

PyTorch를 기반으로 한 WeChat의 대규모 추천 시스템 교육 실습

또한 이 설계에서는 PS를 KV로만 사용하면 되며 매개변수 업데이트를 지원할 필요가 없으므로 PS 팀이 허용합니다. 스토리지 관련 작업에 집중합니다. 모든 KV 스토리지를 구현하는 플러그인도 지원하며, 오픈소스 버전에는 Redis 플러그인이 내장되어 있어 Redis를 PS로도 사용할 수 있습니다.

PyTorch를 기반으로 한 WeChat의 대규모 추천 시스템 교육 실습

다음은 동적 임베딩의 몇 가지 디자인 세부 사항입니다. 우리가 구현한 가장 단순하고 기본적인 ID 변환기는 실제로 PyTorch의 고성능 ska::plat_hash_map을 사용하여 해시 테이블을 사용합니다.

PyTorch를 기반으로 한 WeChat의 대규모 추천 시스템 교육 실습

ID Transformer는 프로세스 내 유일한 CPU 작업으로 상대적으로 높은 성능 요구 사항을 가질 수 있으므로 메모리 액세스 효율성을 더욱 향상시키기 위해 L1 캐시라인 단위에 저장되는 고성능 버전도 구현했습니다. .

PyTorch를 기반으로 한 WeChat의 대규모 추천 시스템 교육 실습

또한 퇴거 방식을 위해 메모리 캐시 부담을 늘리지 않고 LRU와 LFU를 효율적으로 융합할 수 있기를 바랍니다. Redis의 LFU 솔루션에서 영감을 받아 확률적 알고리즘을 설계했습니다. ID 액세스 빈도의 인덱스만 저장됩니다. 예를 들어 32번 접속하면 5가 저장됩니다. 빈도 업데이트 시 해당 ID에 다시 접속하면 5자리 난수가 생성되는데, 5자리가 모두 0인 경우, 즉 1/32 확률의 이벤트가 발생한 경우 빈도 지수를 증가시킵니다. 6으로. 이러한 확률 알고리즘을 통해 LRU와 LFU의 주파수를 uint32에 넣어 메모리 액세스 압력을 높이지 않고 LRU와 LFU를 통합할 수 있습니다.

PyTorch를 기반으로 한 WeChat의 대규모 추천 시스템 교육 실습

마지막으로 멀티카드 솔루션을 간략히 소개하겠습니다. 우리는 현재 모든 카드 데이터를 카드 1의 ID 변환기로 수집한 다음 이를 다시 방송합니다. 우리가 구현한 ID Transformer는 성능이 매우 뛰어나고 GPU 컴퓨팅 파이프라인과 결합할 수 있기 때문에 특정 성능 병목 현상이 발생하지 않습니다.

PyTorch를 기반으로 한 WeChat의 대규모 추천 시스템 교육 실습

위는 동적 임베딩을 위한 몇 가지 디자인 아이디어입니다. 내부 조 단위 비즈니스 중 하나인 정렬 정확도의 경우 동적 임베딩 솔루션은 내부 원래 GPU Tensorflow 프레임워크에 비해 약 3배의 성능 향상을 제공합니다. TF 최적화 버전과 비교하면 여전히 50% 이상의 성능 이점이 있습니다.

PyTorch를 기반으로 한 WeChat의 대규모 추천 시스템 교육 실습

마지막으로 모든 분들이 Torchrec을 사용해 보시길 권합니다. 수백억 개의 기업과 같이 상대적으로 소규모 기업의 경우 기본 TorchRec을 직접 사용하는 것이 좋습니다. 플러그 앤 플레이로 2차 개발이 필요하지 않으며 성능을 두 배로 높일 수 있습니다. 대규모 기업의 경우 TorchRec의 동적 임베딩을 통합해 보는 것이 좋습니다. 한편으로는 내부 PS에 연결하는 것이 편리하고, 다른 한편으로는 임베딩의 확장 및 점진적인 마이그레이션도 지원합니다. 동시에 특정 성능 향상을 얻을 수 있습니다.

PyTorch를 기반으로 한 WeChat의 대규모 추천 시스템 교육 실습

다음은 우리가 준비한 정밀 모델과 기존 응용 시나리오입니다. 관심 있는 친구들은 시험해 볼 수 있습니다.

위 내용은 PyTorch를 기반으로 한 WeChat의 대규모 추천 시스템 교육 실습의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:51cto.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿