diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/404.html b/404.html new file mode 100644 index 0000000..cce5c96 --- /dev/null +++ b/404.html @@ -0,0 +1,28 @@ + + + + + + 404 | 飞桨开源社区博客 + + + + + + + + + + + + + + + + + +

404 Page Not Found

+ + + + \ No newline at end of file diff --git a/about.html b/about.html new file mode 100644 index 0000000..c5b25b3 --- /dev/null +++ b/about.html @@ -0,0 +1,32 @@ + + + + + + 关于我们 | 飞桨开源社区博客 + + + + + + + + + + + + + + + + + + + + + +

关于我们

关于我们

这是一个半官方的、由社区成员自发维护的、用来记录飞桨开源社区故事的博客。

  • 如果你对分享 故事、技术、段子...内容创作 感兴趣,可提 issue 联系 @sunzhongkai588

    欢迎大家创作投稿。投稿方式:在 blog 代码仓库里提交 Pull Request 即可,Pull Request 会自动触发 CI,CI 通过并且被 approve 后,你的文章就会被自动发布到这里 📄

  • 如果你对优化 前端、后端、前后一锅端...网站建设 感兴趣,可提 issue 联系 @SigureMo

    同时也感谢 001 @SigureMo 帮忙搭建了这个博客 🌹

博客总览

置顶博客🔝 【飞桨开源社区成为国内 Top,我们做对了什么?】


一、特色栏目: 开源江湖闲聊录📚

【开源江湖闲聊录】 是一项专门为 Paddle 社区的开发者打造的特色访谈栏目📚。在这里,我们邀请到每一位别具一格且富有热情的开发者,通过文字或语音的方式进行深入采访 🎙️,探索并展现他们背后独一无二的故事,将他们的经历、见解和创意整理成精彩内容,呈现给整个社区。


二、日常社区活动剪影 🎬


三、开源活动进展 📄


写在最后

笔者很喜欢一句话: The world is a stage, life is a performance. 每个社区故事都是一场表演,我们每个人都是舞台上的演员。而建立博客的初衷,就是为了记录这些精彩绝伦的演出,让台下的观众能够为我们鼓掌喝彩,鼓舞更多的人来参与其中。

希望我们的博客能够带给大家更多惊喜,谢谢大家~

+ + + + \ No newline at end of file diff --git a/assets/3-3-individual-contributors.aY9Y6Qby.jpg b/assets/3-3-individual-contributors.aY9Y6Qby.jpg new file mode 100644 index 0000000..bf138f4 Binary files /dev/null and b/assets/3-3-individual-contributors.aY9Y6Qby.jpg differ diff --git a/assets/4-1-projects.CgY3HNnv.jpg b/assets/4-1-projects.CgY3HNnv.jpg new file mode 100644 index 0000000..4143cf8 Binary files /dev/null and b/assets/4-1-projects.CgY3HNnv.jpg differ diff --git a/assets/5-1-honours.DJKT6dKl.jpg b/assets/5-1-honours.DJKT6dKl.jpg new file mode 100644 index 0000000..d23dd67 Binary files /dev/null and b/assets/5-1-honours.DJKT6dKl.jpg differ diff --git a/assets/6-1-issues.BbL5Qc0u.jpg b/assets/6-1-issues.BbL5Qc0u.jpg new file mode 100644 index 0000000..0abc8f3 Binary files /dev/null and b/assets/6-1-issues.BbL5Qc0u.jpg differ diff --git a/assets/6-2-nianhouzaishuo.qZiVLkTz.jpg b/assets/6-2-nianhouzaishuo.qZiVLkTz.jpg new file mode 100644 index 0000000..da51d80 Binary files /dev/null and b/assets/6-2-nianhouzaishuo.qZiVLkTz.jpg differ diff --git a/assets/6-3-pullrequests.UoAleJ38.jpg b/assets/6-3-pullrequests.UoAleJ38.jpg new file mode 100644 index 0000000..cad9da7 Binary files /dev/null and b/assets/6-3-pullrequests.UoAleJ38.jpg differ diff --git a/assets/7-1-xdoctest-project.oqw0ghKZ.jpg b/assets/7-1-xdoctest-project.oqw0ghKZ.jpg new file mode 100644 index 0000000..aaa5994 Binary files /dev/null and b/assets/7-1-xdoctest-project.oqw0ghKZ.jpg differ diff --git a/assets/7-2-paddlepaddle-hackathon.CoasP8de.jpg b/assets/7-2-paddlepaddle-hackathon.CoasP8de.jpg new file mode 100644 index 0000000..4282e0a Binary files /dev/null and b/assets/7-2-paddlepaddle-hackathon.CoasP8de.jpg differ diff --git a/assets/9-1-funny-memes.Cm8SrYal.jpg b/assets/9-1-funny-memes.Cm8SrYal.jpg new file mode 100644 index 0000000..6772589 Binary files /dev/null and b/assets/9-1-funny-memes.Cm8SrYal.jpg differ diff --git a/assets/Captain-01.gy7CxJts.jpg b/assets/Captain-01.gy7CxJts.jpg new file mode 100644 index 0000000..4117c8e Binary files /dev/null and b/assets/Captain-01.gy7CxJts.jpg differ diff --git a/assets/Captain-02.oqPjuBMJ.jpg b/assets/Captain-02.oqPjuBMJ.jpg new file mode 100644 index 0000000..e321394 Binary files /dev/null and b/assets/Captain-02.oqPjuBMJ.jpg differ diff --git a/assets/Captain-03.D6Fwywaf.jpg b/assets/Captain-03.D6Fwywaf.jpg new file mode 100644 index 0000000..2cf4e08 Binary files /dev/null and b/assets/Captain-03.D6Fwywaf.jpg differ diff --git a/assets/Captain-04.DSnRKHge.jpeg b/assets/Captain-04.DSnRKHge.jpeg new file mode 100644 index 0000000..26ced21 Binary files /dev/null and b/assets/Captain-04.DSnRKHge.jpeg differ diff --git a/assets/Captain-05.B2PP1fn2.jpeg b/assets/Captain-05.B2PP1fn2.jpeg new file mode 100644 index 0000000..6e6ba19 Binary files /dev/null and b/assets/Captain-05.B2PP1fn2.jpeg differ diff --git a/assets/Captain-06.B04Ukp-4.jpg b/assets/Captain-06.B04Ukp-4.jpg new file mode 100644 index 0000000..bb0eb10 Binary files /dev/null and b/assets/Captain-06.B04Ukp-4.jpg differ diff --git a/assets/NKNaN-1.L6B9mBNY.jpeg b/assets/NKNaN-1.L6B9mBNY.jpeg new file mode 100644 index 0000000..150d6c2 Binary files /dev/null and b/assets/NKNaN-1.L6B9mBNY.jpeg differ diff --git a/assets/NKNaN-10.OH6Ys9wN.jpeg b/assets/NKNaN-10.OH6Ys9wN.jpeg new file mode 100644 index 0000000..be9bf23 Binary files /dev/null and b/assets/NKNaN-10.OH6Ys9wN.jpeg differ diff --git a/assets/NKNaN-2.DsOESAXA.jpeg b/assets/NKNaN-2.DsOESAXA.jpeg new file mode 100644 index 0000000..cd19058 Binary files /dev/null and b/assets/NKNaN-2.DsOESAXA.jpeg differ diff --git a/assets/NKNaN-3.BgREEBki.jpeg b/assets/NKNaN-3.BgREEBki.jpeg new file mode 100644 index 0000000..d97996b Binary files /dev/null and b/assets/NKNaN-3.BgREEBki.jpeg differ diff --git a/assets/NKNaN-4.aUQgvqgN.jpeg b/assets/NKNaN-4.aUQgvqgN.jpeg new file mode 100644 index 0000000..2326800 Binary files /dev/null and b/assets/NKNaN-4.aUQgvqgN.jpeg differ diff --git a/assets/NKNaN-5.CRSa-9AH.jpeg b/assets/NKNaN-5.CRSa-9AH.jpeg new file mode 100644 index 0000000..1cb4140 Binary files /dev/null and b/assets/NKNaN-5.CRSa-9AH.jpeg differ diff --git a/assets/NKNaN-6.Cs90Nvon.jpeg b/assets/NKNaN-6.Cs90Nvon.jpeg new file mode 100644 index 0000000..7851b52 Binary files /dev/null and b/assets/NKNaN-6.Cs90Nvon.jpeg differ diff --git a/assets/NKNaN-7.BpooYvDx.jpeg b/assets/NKNaN-7.BpooYvDx.jpeg new file mode 100644 index 0000000..7636839 Binary files /dev/null and b/assets/NKNaN-7.BpooYvDx.jpeg differ diff --git a/assets/NKNaN-8.DxaDPc8s.jpeg b/assets/NKNaN-8.DxaDPc8s.jpeg new file mode 100644 index 0000000..ef6bc9f Binary files /dev/null and b/assets/NKNaN-8.DxaDPc8s.jpeg differ diff --git a/assets/NKNaN-9.BRRQUkq7.jpeg b/assets/NKNaN-9.BRRQUkq7.jpeg new file mode 100644 index 0000000..036b728 Binary files /dev/null and b/assets/NKNaN-9.BRRQUkq7.jpeg differ diff --git a/assets/OS-Contributors-01.TDrl-t3l.jpeg b/assets/OS-Contributors-01.TDrl-t3l.jpeg new file mode 100644 index 0000000..51c2c09 Binary files /dev/null and b/assets/OS-Contributors-01.TDrl-t3l.jpeg differ diff --git a/assets/OS-Contributors-02.wAuNCrPo.jpeg b/assets/OS-Contributors-02.wAuNCrPo.jpeg new file mode 100644 index 0000000..6167d22 Binary files /dev/null and b/assets/OS-Contributors-02.wAuNCrPo.jpeg differ diff --git a/assets/OS-Contributors-03.9OnUxDBJ.jpeg b/assets/OS-Contributors-03.9OnUxDBJ.jpeg new file mode 100644 index 0000000..dbcf518 Binary files /dev/null and b/assets/OS-Contributors-03.9OnUxDBJ.jpeg differ diff --git a/assets/OS-Projects.Wxwhgkfx.jpeg b/assets/OS-Projects.Wxwhgkfx.jpeg new file mode 100644 index 0000000..c73997a Binary files /dev/null and b/assets/OS-Projects.Wxwhgkfx.jpeg differ diff --git a/assets/SLANet-LCNetV2.CZld0Zi9.png b/assets/SLANet-LCNetV2.CZld0Zi9.png new file mode 100644 index 0000000..4e89de7 Binary files /dev/null and b/assets/SLANet-LCNetV2.CZld0Zi9.png differ diff --git a/assets/SVTRv2.5HokU9Qv.png b/assets/SVTRv2.5HokU9Qv.png new file mode 100644 index 0000000..ab01a27 Binary files /dev/null and b/assets/SVTRv2.5HokU9Qv.png differ diff --git a/assets/about.md.CffTn8Vs.js b/assets/about.md.CffTn8Vs.js new file mode 100644 index 0000000..cf9aa5c --- /dev/null +++ b/assets/about.md.CffTn8Vs.js @@ -0,0 +1 @@ +import{_ as a}from"./chunks/first-post.CGto_Bts.js";import{_ as e,c as t,o,l as r}from"./chunks/framework.CEb3mtFd.js";const _=JSON.parse('{"title":"关于我们","description":"","frontmatter":{"layout":"about","title":"关于我们"},"headers":[],"relativePath":"about.md","filePath":"about.md"}'),l={name:"about.md"},s=r('

关于我们

这是一个半官方的、由社区成员自发维护的、用来记录飞桨开源社区故事的博客。

博客总览

置顶博客🔝 【飞桨开源社区成为国内 Top,我们做对了什么?】


一、特色栏目: 开源江湖闲聊录📚

【开源江湖闲聊录】 是一项专门为 Paddle 社区的开发者打造的特色访谈栏目📚。在这里,我们邀请到每一位别具一格且富有热情的开发者,通过文字或语音的方式进行深入采访 🎙️,探索并展现他们背后独一无二的故事,将他们的经历、见解和创意整理成精彩内容,呈现给整个社区。


二、日常社区活动剪影 🎬


三、开源活动进展 📄


写在最后

笔者很喜欢一句话: The world is a stage, life is a performance. 每个社区故事都是一场表演,我们每个人都是舞台上的演员。而建立博客的初衷,就是为了记录这些精彩绝伦的演出,让台下的观众能够为我们鼓掌喝彩,鼓舞更多的人来参与其中。

希望我们的博客能够带给大家更多惊喜,谢谢大家~

',20),i=[s];function h(n,u,p,c,d,f){return o(),t("div",null,i)}const m=e(l,[["render",h]]);export{_ as __pageData,m as default}; diff --git a/assets/about.md.CffTn8Vs.lean.js b/assets/about.md.CffTn8Vs.lean.js new file mode 100644 index 0000000..47ac694 --- /dev/null +++ b/assets/about.md.CffTn8Vs.lean.js @@ -0,0 +1 @@ +import{_ as a}from"./chunks/first-post.CGto_Bts.js";import{_ as e,c as t,o,l as r}from"./chunks/framework.CEb3mtFd.js";const _=JSON.parse('{"title":"关于我们","description":"","frontmatter":{"layout":"about","title":"关于我们"},"headers":[],"relativePath":"about.md","filePath":"about.md"}'),l={name:"about.md"},s=r("",20),i=[s];function h(n,u,p,c,d,f){return o(),t("div",null,i)}const m=e(l,[["render",h]]);export{_ as __pageData,m as default}; diff --git a/assets/apollo-park-all.B5rKS27b.jpg b/assets/apollo-park-all.B5rKS27b.jpg new file mode 100644 index 0000000..ecb5f49 Binary files /dev/null and b/assets/apollo-park-all.B5rKS27b.jpg differ diff --git a/assets/apollo-park-meng-present.C8_YR9Ph.jpg b/assets/apollo-park-meng-present.C8_YR9Ph.jpg new file mode 100644 index 0000000..480b528 Binary files /dev/null and b/assets/apollo-park-meng-present.C8_YR9Ph.jpg differ diff --git a/assets/app.B1K96np7.js b/assets/app.B1K96np7.js new file mode 100644 index 0000000..d7aeb85 --- /dev/null +++ b/assets/app.B1K96np7.js @@ -0,0 +1,7 @@ +function __vite__mapDeps(indexes) { + if (!__vite__mapDeps.viteFileDeps) { + __vite__mapDeps.viteFileDeps = [] + } + return indexes.map((i) => __vite__mapDeps.viteFileDeps[i]) +} +import{z as o,A as p,R as u,B as l,C as c,D as f,E as d,G as m,H as h,I as A,J as g,q as P,d as _,e as v,K as R,L as C,M as E,N as w,O as y,s as T}from"./chunks/framework.CEb3mtFd.js";import{R as b}from"./chunks/theme.C9Uh9Mc2.js";function i(e){if(e.extends){const t=i(e.extends);return{...t,...e,async enhanceApp(a){t.enhanceApp&&await t.enhanceApp(a),e.enhanceApp&&await e.enhanceApp(a)}}}return e}const s=i(b),D=_({name:"VitePressApp",setup(){const{site:e,lang:t,dir:a}=v();return R(()=>{C(()=>{document.documentElement.lang=t.value,document.documentElement.dir=a.value})}),e.value.router.prefetchLinks&&E(),w(),y(),s.setup&&s.setup(),()=>T(s.Layout)}});async function S(){globalThis.__VITEPRESS__=!0;const e=O(),t=L();t.provide(u,e);const a=l(e.route);return t.provide(c,a),t.component("Content",f),t.component("ClientOnly",d),Object.defineProperties(t.config.globalProperties,{$frontmatter:{get(){return a.frontmatter.value}},$params:{get(){return a.page.value.params}}}),s.enhanceApp&&await s.enhanceApp({app:t,router:e,siteData:m}),{app:t,router:e,data:a}}function L(){return h(D)}function O(){let e=o,t;return A(a=>{let n=g(a),r=null;return n&&(e&&(t=n),(e||t===n)&&(n=n.replace(/\.js$/,".lean.js")),r=P(()=>import(n),__vite__mapDeps([]))),o&&(e=!1),r},s.NotFound)}o&&S().then(({app:e,router:t,data:a})=>{t.go().then(()=>{p(t.route,a.site),e.mount("#app")})});export{S as createApp}; diff --git a/assets/award_ceremony.B4pBO3vf.jpg b/assets/award_ceremony.B4pBO3vf.jpg new file mode 100644 index 0000000..fb5b1e9 Binary files /dev/null and b/assets/award_ceremony.B4pBO3vf.jpg differ diff --git a/assets/chengdu-egg.BDf4-r8r.jpg b/assets/chengdu-egg.BDf4-r8r.jpg new file mode 100644 index 0000000..173e3a3 Binary files /dev/null and b/assets/chengdu-egg.BDf4-r8r.jpg differ diff --git a/assets/chengdu-kaiyuanshe-01.D_gtc2JY.jpg b/assets/chengdu-kaiyuanshe-01.D_gtc2JY.jpg new file mode 100644 index 0000000..528b6de Binary files /dev/null and b/assets/chengdu-kaiyuanshe-01.D_gtc2JY.jpg differ diff --git a/assets/chengdu-kaiyuanshe-02.TIbUct4S.jpg b/assets/chengdu-kaiyuanshe-02.TIbUct4S.jpg new file mode 100644 index 0000000..97ead06 Binary files /dev/null and b/assets/chengdu-kaiyuanshe-02.TIbUct4S.jpg differ diff --git a/assets/chengdu-kaiyuanshe-03.D9ILJX09.jpg b/assets/chengdu-kaiyuanshe-03.D9ILJX09.jpg new file mode 100644 index 0000000..02c237b Binary files /dev/null and b/assets/chengdu-kaiyuanshe-03.D9ILJX09.jpg differ diff --git a/assets/chengdu-kaiyuanshe-04.Buo76V4B.jpg b/assets/chengdu-kaiyuanshe-04.Buo76V4B.jpg new file mode 100644 index 0000000..5568410 Binary files /dev/null and b/assets/chengdu-kaiyuanshe-04.Buo76V4B.jpg differ diff --git a/assets/chengdu-kaiyuanshe-05.DdgzhQlp.jpg b/assets/chengdu-kaiyuanshe-05.DdgzhQlp.jpg new file mode 100644 index 0000000..8da36f6 Binary files /dev/null and b/assets/chengdu-kaiyuanshe-05.DdgzhQlp.jpg differ diff --git a/assets/chuan-01.G-cxJRwy.jpg b/assets/chuan-01.G-cxJRwy.jpg new file mode 100644 index 0000000..2bc3e23 Binary files /dev/null and b/assets/chuan-01.G-cxJRwy.jpg differ diff --git a/assets/chuan-02.qE5JSX5Y.jpg b/assets/chuan-02.qE5JSX5Y.jpg new file mode 100644 index 0000000..d52a4ae Binary files /dev/null and b/assets/chuan-02.qE5JSX5Y.jpg differ diff --git a/assets/chuan-03.NXP-Ww_V.jpg b/assets/chuan-03.NXP-Ww_V.jpg new file mode 100644 index 0000000..0530996 Binary files /dev/null and b/assets/chuan-03.NXP-Ww_V.jpg differ diff --git a/assets/chuan-04.prZsqaDd.jpg b/assets/chuan-04.prZsqaDd.jpg new file mode 100644 index 0000000..6c8a1db Binary files /dev/null and b/assets/chuan-04.prZsqaDd.jpg differ diff --git a/assets/chuan-05.CTY1_QPh.jpg b/assets/chuan-05.CTY1_QPh.jpg new file mode 100644 index 0000000..d3ea5e0 Binary files /dev/null and b/assets/chuan-05.CTY1_QPh.jpg differ diff --git a/assets/chuan-06.Scj6rPAw.jpg b/assets/chuan-06.Scj6rPAw.jpg new file mode 100644 index 0000000..fe94038 Binary files /dev/null and b/assets/chuan-06.Scj6rPAw.jpg differ diff --git a/assets/chuan-07.DoP7Tkq4.jpg b/assets/chuan-07.DoP7Tkq4.jpg new file mode 100644 index 0000000..8370c1c Binary files /dev/null and b/assets/chuan-07.DoP7Tkq4.jpg differ diff --git a/assets/chuan-08.0g__Lgih.jpg b/assets/chuan-08.0g__Lgih.jpg new file mode 100644 index 0000000..ce20092 Binary files /dev/null and b/assets/chuan-08.0g__Lgih.jpg differ diff --git a/assets/chuan-09.o4wJxXln.jpg b/assets/chuan-09.o4wJxXln.jpg new file mode 100644 index 0000000..9969f4c Binary files /dev/null and b/assets/chuan-09.o4wJxXln.jpg differ diff --git a/assets/chuan-10.CQs76eIH.jpg b/assets/chuan-10.CQs76eIH.jpg new file mode 100644 index 0000000..fd5f7e5 Binary files /dev/null and b/assets/chuan-10.CQs76eIH.jpg differ diff --git a/assets/chuan-11.B0MWhn9d.jpg b/assets/chuan-11.B0MWhn9d.jpg new file mode 100644 index 0000000..dee03be Binary files /dev/null and b/assets/chuan-11.B0MWhn9d.jpg differ diff --git a/assets/chuan-12.uS2sz8Vz.jpg b/assets/chuan-12.uS2sz8Vz.jpg new file mode 100644 index 0000000..0550f02 Binary files /dev/null and b/assets/chuan-12.uS2sz8Vz.jpg differ diff --git a/assets/chuan-13.BzlKW8CG.jpg b/assets/chuan-13.BzlKW8CG.jpg new file mode 100644 index 0000000..d0d6203 Binary files /dev/null and b/assets/chuan-13.BzlKW8CG.jpg differ diff --git a/assets/chuan-14.B1YsXHnP.jpg b/assets/chuan-14.B1YsXHnP.jpg new file mode 100644 index 0000000..4d73f4f Binary files /dev/null and b/assets/chuan-14.B1YsXHnP.jpg differ diff --git a/assets/chuan-15.Dxfq_RNd.jpg b/assets/chuan-15.Dxfq_RNd.jpg new file mode 100644 index 0000000..b6b4e87 Binary files /dev/null and b/assets/chuan-15.Dxfq_RNd.jpg differ diff --git a/assets/chuan-16.IkFqI2uB.jpg b/assets/chuan-16.IkFqI2uB.jpg new file mode 100644 index 0000000..ce94d6f Binary files /dev/null and b/assets/chuan-16.IkFqI2uB.jpg differ diff --git a/assets/chuan-17.BT7EnFZw.jpg b/assets/chuan-17.BT7EnFZw.jpg new file mode 100644 index 0000000..967c875 Binary files /dev/null and b/assets/chuan-17.BT7EnFZw.jpg differ diff --git a/assets/chunks/MessageBox.BjkmF0_f.js b/assets/chunks/MessageBox.BjkmF0_f.js new file mode 100644 index 0000000..13b654a --- /dev/null +++ b/assets/chunks/MessageBox.BjkmF0_f.js @@ -0,0 +1 @@ +import{d as g,f as t,o as r,c as n,h,a,t as v,y as i,n as u,_ as y}from"./framework.CEb3mtFd.js";const x=["src"],b={class:"text-neutral-500 dark:text-neutral-400"},k={class:"inline-block bg-slate-200 px-2 py-2 rounded-md dark:bg-zinc-700"},z=g({__name:"Message",props:{name:{},github:{},avatar:{},type:{}},setup(s){const{name:m,github:o,avatar:d,type:p}=s,l=t(()=>d??(o?`https://github.com/${o}.png`:void 0)),c=t(()=>{const e=p??"left";return["left","right"].includes(e)?e:(console.warn(`Message type must be 'left' or 'right', but got '${e}'`),"left")}),_=t(()=>c.value==="left"?{"mr-10":!0}:{"flex-row-reverse":!0,"ml-10":!0}),f=t(()=>c.value==="left"?{"items-start":!0}:{"items-end":!0});return(e,B)=>(r(),n("li",{class:u(["flex items-start space-y-2",_.value])},[l.value?(r(),n("img",{key:0,src:l.value,alt:"author image",class:"w-10 h-10 rounded-md m-0"},null,8,x)):h("",!0),a("div",{class:u(["flex flex-col px-3 !mt-0",f.value])},[a("span",b,v(e.name),1),a("div",k,[i(e.$slots,"default")])],2)],2))}}),$={},C={class:"p-0"};function M(s,m){return r(),n("ul",C,[i(s.$slots,"default")])}const D=y($,[["render",M]]);export{D as M,z as _}; diff --git a/assets/chunks/first-post.CGto_Bts.js b/assets/chunks/first-post.CGto_Bts.js new file mode 100644 index 0000000..d108874 --- /dev/null +++ b/assets/chunks/first-post.CGto_Bts.js @@ -0,0 +1 @@ +const s="/assets/first-post.BVGNSVjw.jpg";export{s as _}; diff --git a/assets/chunks/framework.CEb3mtFd.js b/assets/chunks/framework.CEb3mtFd.js new file mode 100644 index 0000000..e9eb000 --- /dev/null +++ b/assets/chunks/framework.CEb3mtFd.js @@ -0,0 +1,17 @@ +/** +* @vue/shared v3.4.21 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/function kn(e,t){const n=new Set(e.split(","));return t?s=>n.has(s.toLowerCase()):s=>n.has(s)}const ee={},st=[],we=()=>{},Ei=()=>!1,Ot=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),qn=e=>e.startsWith("onUpdate:"),le=Object.assign,Gn=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},Si=Object.prototype.hasOwnProperty,k=(e,t)=>Si.call(e,t),j=Array.isArray,rt=e=>nn(e)==="[object Map]",ir=e=>nn(e)==="[object Set]",V=e=>typeof e=="function",ne=e=>typeof e=="string",pt=e=>typeof e=="symbol",Q=e=>e!==null&&typeof e=="object",or=e=>(Q(e)||V(e))&&V(e.then)&&V(e.catch),lr=Object.prototype.toString,nn=e=>lr.call(e),Ci=e=>nn(e).slice(8,-1),cr=e=>nn(e)==="[object Object]",zn=e=>ne(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,it=kn(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),sn=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},Ti=/-(\w)/g,Oe=sn(e=>e.replace(Ti,(t,n)=>n?n.toUpperCase():"")),Ri=/\B([A-Z])/g,gt=sn(e=>e.replace(Ri,"-$1").toLowerCase()),rn=sn(e=>e.charAt(0).toUpperCase()+e.slice(1)),bn=sn(e=>e?`on${rn(e)}`:""),We=(e,t)=>!Object.is(e,t),wn=(e,t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,value:n})},Ai=e=>{const t=parseFloat(e);return isNaN(t)?e:t};let ys;const fr=()=>ys||(ys=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function Jn(e){if(j(e)){const t={};for(let n=0;n{if(n){const s=n.split(Pi);s.length>1&&(t[s[0].trim()]=s[1].trim())}}),t}function Xn(e){let t="";if(ne(e))t=e;else if(j(e))for(let n=0;nne(e)?e:e==null?"":j(e)||Q(e)&&(e.toString===lr||!V(e.toString))?JSON.stringify(e,ar,2):String(e),ar=(e,t)=>t&&t.__v_isRef?ar(e,t.value):rt(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[s,r],i)=>(n[vn(s,i)+" =>"]=r,n),{})}:ir(t)?{[`Set(${t.size})`]:[...t.values()].map(n=>vn(n))}:pt(t)?vn(t):Q(t)&&!j(t)&&!cr(t)?String(t):t,vn=(e,t="")=>{var n;return pt(e)?`Symbol(${(n=e.description)!=null?n:t})`:e};/** +* @vue/reactivity v3.4.21 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/let me;class Ni{constructor(t=!1){this.detached=t,this._active=!0,this.effects=[],this.cleanups=[],this.parent=me,!t&&me&&(this.index=(me.scopes||(me.scopes=[])).push(this)-1)}get active(){return this._active}run(t){if(this._active){const n=me;try{return me=this,t()}finally{me=n}}}on(){me=this}off(){me=this.parent}stop(t){if(this._active){let n,s;for(n=0,s=this.effects.length;n=4))break}this._dirtyLevel===1&&(this._dirtyLevel=0),Ze()}return this._dirtyLevel>=4}set dirty(t){this._dirtyLevel=t?4:0}run(){if(this._dirtyLevel=0,!this.active)return this.fn();let t=Be,n=ze;try{return Be=!0,ze=this,this._runnings++,bs(this),this.fn()}finally{ws(this),this._runnings--,ze=n,Be=t}}stop(){var t;this.active&&(bs(this),ws(this),(t=this.onStop)==null||t.call(this),this.active=!1)}}function Hi(e){return e.value}function bs(e){e._trackId++,e._depsLength=0}function ws(e){if(e.deps.length>e._depsLength){for(let t=e._depsLength;t{const n=new Map;return n.cleanup=e,n.computed=t,n},zt=new WeakMap,Je=Symbol(""),jn=Symbol("");function pe(e,t,n){if(Be&&ze){let s=zt.get(e);s||zt.set(e,s=new Map);let r=s.get(n);r||s.set(n,r=_r(()=>s.delete(n))),gr(ze,r)}}function Me(e,t,n,s,r,i){const o=zt.get(e);if(!o)return;let l=[];if(t==="clear")l=[...o.values()];else if(n==="length"&&j(e)){const c=Number(s);o.forEach((a,d)=>{(d==="length"||!pt(d)&&d>=c)&&l.push(a)})}else switch(n!==void 0&&l.push(o.get(n)),t){case"add":j(e)?zn(n)&&l.push(o.get("length")):(l.push(o.get(Je)),rt(e)&&l.push(o.get(jn)));break;case"delete":j(e)||(l.push(o.get(Je)),rt(e)&&l.push(o.get(jn)));break;case"set":rt(e)&&l.push(o.get(Je));break}Qn();for(const c of l)c&&mr(c,4);Zn()}function Ui(e,t){var n;return(n=zt.get(e))==null?void 0:n.get(t)}const Vi=kn("__proto__,__v_isRef,__isVue"),yr=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(pt)),vs=Di();function Di(){const e={};return["includes","indexOf","lastIndexOf"].forEach(t=>{e[t]=function(...n){const s=G(this);for(let i=0,o=this.length;i{e[t]=function(...n){Qe(),Qn();const s=G(this)[t].apply(this,n);return Zn(),Ze(),s}}),e}function Bi(e){const t=G(this);return pe(t,"has",e),t.hasOwnProperty(e)}class br{constructor(t=!1,n=!1){this._isReadonly=t,this._isShallow=n}get(t,n,s){const r=this._isReadonly,i=this._isShallow;if(n==="__v_isReactive")return!r;if(n==="__v_isReadonly")return r;if(n==="__v_isShallow")return i;if(n==="__v_raw")return s===(r?i?to:Er:i?xr:vr).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(s)?t:void 0;const o=j(t);if(!r){if(o&&k(vs,n))return Reflect.get(vs,n,s);if(n==="hasOwnProperty")return Bi}const l=Reflect.get(t,n,s);return(pt(n)?yr.has(n):Vi(n))||(r||pe(t,"get",n),i)?l:ue(l)?o&&zn(n)?l:l.value:Q(l)?r?cn(l):ln(l):l}}class wr extends br{constructor(t=!1){super(!1,t)}set(t,n,s,r){let i=t[n];if(!this._isShallow){const c=ut(i);if(!Jt(s)&&!ut(s)&&(i=G(i),s=G(s)),!j(t)&&ue(i)&&!ue(s))return c?!1:(i.value=s,!0)}const o=j(t)&&zn(n)?Number(n)e,on=e=>Reflect.getPrototypeOf(e);function Ft(e,t,n=!1,s=!1){e=e.__v_raw;const r=G(e),i=G(t);n||(We(t,i)&&pe(r,"get",t),pe(r,"get",i));const{has:o}=on(r),l=s?es:n?ss:Ct;if(o.call(r,t))return l(e.get(t));if(o.call(r,i))return l(e.get(i));e!==r&&e.get(t)}function Nt(e,t=!1){const n=this.__v_raw,s=G(n),r=G(e);return t||(We(e,r)&&pe(s,"has",e),pe(s,"has",r)),e===r?n.has(e):n.has(e)||n.has(r)}function $t(e,t=!1){return e=e.__v_raw,!t&&pe(G(e),"iterate",Je),Reflect.get(e,"size",e)}function xs(e){e=G(e);const t=G(this);return on(t).has.call(t,e)||(t.add(e),Me(t,"add",e,e)),this}function Es(e,t){t=G(t);const n=G(this),{has:s,get:r}=on(n);let i=s.call(n,e);i||(e=G(e),i=s.call(n,e));const o=r.call(n,e);return n.set(e,t),i?We(t,o)&&Me(n,"set",e,t):Me(n,"add",e,t),this}function Ss(e){const t=G(this),{has:n,get:s}=on(t);let r=n.call(t,e);r||(e=G(e),r=n.call(t,e)),s&&s.call(t,e);const i=t.delete(e);return r&&Me(t,"delete",e,void 0),i}function Cs(){const e=G(this),t=e.size!==0,n=e.clear();return t&&Me(e,"clear",void 0,void 0),n}function jt(e,t){return function(s,r){const i=this,o=i.__v_raw,l=G(o),c=t?es:e?ss:Ct;return!e&&pe(l,"iterate",Je),o.forEach((a,d)=>s.call(r,c(a),c(d),i))}}function Ht(e,t,n){return function(...s){const r=this.__v_raw,i=G(r),o=rt(i),l=e==="entries"||e===Symbol.iterator&&o,c=e==="keys"&&o,a=r[e](...s),d=n?es:t?ss:Ct;return!t&&pe(i,"iterate",c?jn:Je),{next(){const{value:g,done:x}=a.next();return x?{value:g,done:x}:{value:l?[d(g[0]),d(g[1])]:d(g),done:x}},[Symbol.iterator](){return this}}}}function je(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function Gi(){const e={get(i){return Ft(this,i)},get size(){return $t(this)},has:Nt,add:xs,set:Es,delete:Ss,clear:Cs,forEach:jt(!1,!1)},t={get(i){return Ft(this,i,!1,!0)},get size(){return $t(this)},has:Nt,add:xs,set:Es,delete:Ss,clear:Cs,forEach:jt(!1,!0)},n={get(i){return Ft(this,i,!0)},get size(){return $t(this,!0)},has(i){return Nt.call(this,i,!0)},add:je("add"),set:je("set"),delete:je("delete"),clear:je("clear"),forEach:jt(!0,!1)},s={get(i){return Ft(this,i,!0,!0)},get size(){return $t(this,!0)},has(i){return Nt.call(this,i,!0)},add:je("add"),set:je("set"),delete:je("delete"),clear:je("clear"),forEach:jt(!0,!0)};return["keys","values","entries",Symbol.iterator].forEach(i=>{e[i]=Ht(i,!1,!1),n[i]=Ht(i,!0,!1),t[i]=Ht(i,!1,!0),s[i]=Ht(i,!0,!0)}),[e,n,t,s]}const[zi,Ji,Xi,Yi]=Gi();function ts(e,t){const n=t?e?Yi:Xi:e?Ji:zi;return(s,r,i)=>r==="__v_isReactive"?!e:r==="__v_isReadonly"?e:r==="__v_raw"?s:Reflect.get(k(n,r)&&r in s?n:s,r,i)}const Qi={get:ts(!1,!1)},Zi={get:ts(!1,!0)},eo={get:ts(!0,!1)},vr=new WeakMap,xr=new WeakMap,Er=new WeakMap,to=new WeakMap;function no(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function so(e){return e.__v_skip||!Object.isExtensible(e)?0:no(Ci(e))}function ln(e){return ut(e)?e:ns(e,!1,Wi,Qi,vr)}function ro(e){return ns(e,!1,qi,Zi,xr)}function cn(e){return ns(e,!0,ki,eo,Er)}function ns(e,t,n,s,r){if(!Q(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const i=r.get(e);if(i)return i;const o=so(e);if(o===0)return e;const l=new Proxy(e,o===2?s:n);return r.set(e,l),l}function ot(e){return ut(e)?ot(e.__v_raw):!!(e&&e.__v_isReactive)}function ut(e){return!!(e&&e.__v_isReadonly)}function Jt(e){return!!(e&&e.__v_isShallow)}function Sr(e){return ot(e)||ut(e)}function G(e){const t=e&&e.__v_raw;return t?G(t):e}function bt(e){return Object.isExtensible(e)&&Gt(e,"__v_skip",!0),e}const Ct=e=>Q(e)?ln(e):e,ss=e=>Q(e)?cn(e):e;class Cr{constructor(t,n,s,r){this.getter=t,this._setter=n,this.dep=void 0,this.__v_isRef=!0,this.__v_isReadonly=!1,this.effect=new Yn(()=>t(this._value),()=>wt(this,this.effect._dirtyLevel===2?2:3)),this.effect.computed=this,this.effect.active=this._cacheable=!r,this.__v_isReadonly=s}get value(){const t=G(this);return(!t._cacheable||t.effect.dirty)&&We(t._value,t._value=t.effect.run())&&wt(t,4),rs(t),t.effect._dirtyLevel>=2&&wt(t,2),t._value}set value(t){this._setter(t)}get _dirty(){return this.effect.dirty}set _dirty(t){this.effect.dirty=t}}function io(e,t,n=!1){let s,r;const i=V(e);return i?(s=e,r=we):(s=e.get,r=e.set),new Cr(s,r,i||!r,n)}function rs(e){var t;Be&&ze&&(e=G(e),gr(ze,(t=e.dep)!=null?t:e.dep=_r(()=>e.dep=void 0,e instanceof Cr?e:void 0)))}function wt(e,t=4,n){e=G(e);const s=e.dep;s&&mr(s,t)}function ue(e){return!!(e&&e.__v_isRef===!0)}function Fe(e){return Rr(e,!1)}function Tr(e){return Rr(e,!0)}function Rr(e,t){return ue(e)?e:new oo(e,t)}class oo{constructor(t,n){this.__v_isShallow=n,this.dep=void 0,this.__v_isRef=!0,this._rawValue=n?t:G(t),this._value=n?t:Ct(t)}get value(){return rs(this),this._value}set value(t){const n=this.__v_isShallow||Jt(t)||ut(t);t=n?t:G(t),We(t,this._rawValue)&&(this._rawValue=t,this._value=n?t:Ct(t),wt(this,4))}}function Ar(e){return ue(e)?e.value:e}const lo={get:(e,t,n)=>Ar(Reflect.get(e,t,n)),set:(e,t,n,s)=>{const r=e[t];return ue(r)&&!ue(n)?(r.value=n,!0):Reflect.set(e,t,n,s)}};function Or(e){return ot(e)?e:new Proxy(e,lo)}class co{constructor(t){this.dep=void 0,this.__v_isRef=!0;const{get:n,set:s}=t(()=>rs(this),()=>wt(this));this._get=n,this._set=s}get value(){return this._get()}set value(t){this._set(t)}}function fo(e){return new co(e)}class uo{constructor(t,n,s){this._object=t,this._key=n,this._defaultValue=s,this.__v_isRef=!0}get value(){const t=this._object[this._key];return t===void 0?this._defaultValue:t}set value(t){this._object[this._key]=t}get dep(){return Ui(G(this._object),this._key)}}class ao{constructor(t){this._getter=t,this.__v_isRef=!0,this.__v_isReadonly=!0}get value(){return this._getter()}}function ho(e,t,n){return ue(e)?e:V(e)?new ao(e):Q(e)&&arguments.length>1?po(e,t,n):Fe(e)}function po(e,t,n){const s=e[t];return ue(s)?s:new uo(e,t,n)}/** +* @vue/runtime-core v3.4.21 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/function Ke(e,t,n,s){try{return s?e(...s):e()}catch(r){fn(r,t,n)}}function Se(e,t,n,s){if(V(e)){const i=Ke(e,t,n,s);return i&&or(i)&&i.catch(o=>{fn(o,t,n)}),i}const r=[];for(let i=0;i>>1,r=ce[s],i=Rt(r);iAe&&ce.splice(t,1)}function yo(e){j(e)?lt.push(...e):(!Ue||!Ue.includes(e,e.allowRecurse?Ge+1:Ge))&<.push(e),Ir()}function Ts(e,t,n=Tt?Ae+1:0){for(;nRt(n)-Rt(s));if(lt.length=0,Ue){Ue.push(...t);return}for(Ue=t,Ge=0;Gee.id==null?1/0:e.id,bo=(e,t)=>{const n=Rt(e)-Rt(t);if(n===0){if(e.pre&&!t.pre)return-1;if(t.pre&&!e.pre)return 1}return n};function Lr(e){Hn=!1,Tt=!0,ce.sort(bo);try{for(Ae=0;Aene(C)?C.trim():C)),g&&(r=n.map(Ai))}let l,c=s[l=bn(t)]||s[l=bn(Oe(t))];!c&&i&&(c=s[l=bn(gt(t))]),c&&Se(c,e,6,r);const a=s[l+"Once"];if(a){if(!e.emitted)e.emitted={};else if(e.emitted[l])return;e.emitted[l]=!0,Se(a,e,6,r)}}function Mr(e,t,n=!1){const s=t.emitsCache,r=s.get(e);if(r!==void 0)return r;const i=e.emits;let o={},l=!1;if(!V(e)){const c=a=>{const d=Mr(a,t,!0);d&&(l=!0,le(o,d))};!n&&t.mixins.length&&t.mixins.forEach(c),e.extends&&c(e.extends),e.mixins&&e.mixins.forEach(c)}return!i&&!l?(Q(e)&&s.set(e,null),null):(j(i)?i.forEach(c=>o[c]=null):le(o,i),Q(e)&&s.set(e,o),o)}function an(e,t){return!e||!Ot(t)?!1:(t=t.slice(2).replace(/Once$/,""),k(e,t[0].toLowerCase()+t.slice(1))||k(e,gt(t))||k(e,t))}let fe=null,Fr=null;function Yt(e){const t=fe;return fe=e,Fr=e&&e.type.__scopeId||null,t}function vo(e,t=fe,n){if(!t||e._n)return e;const s=(...r)=>{s._d&&js(-1);const i=Yt(t);let o;try{o=e(...r)}finally{Yt(i),s._d&&js(1)}return o};return s._n=!0,s._c=!0,s._d=!0,s}function xn(e){const{type:t,vnode:n,proxy:s,withProxy:r,props:i,propsOptions:[o],slots:l,attrs:c,emit:a,render:d,renderCache:g,data:x,setupState:C,ctx:M,inheritAttrs:F}=e;let H,q;const Y=Yt(e);try{if(n.shapeFlag&4){const y=r||s,P=y;H=xe(d.call(P,y,g,i,C,x,M)),q=c}else{const y=t;H=xe(y.length>1?y(i,{attrs:c,slots:l,emit:a}):y(i,null)),q=t.props?c:xo(c)}}catch(y){St.length=0,fn(y,e,1),H=oe(Ne)}let p=H;if(q&&F!==!1){const y=Object.keys(q),{shapeFlag:P}=p;y.length&&P&7&&(o&&y.some(qn)&&(q=Eo(q,o)),p=dt(p,q))}return n.dirs&&(p=dt(p),p.dirs=p.dirs?p.dirs.concat(n.dirs):n.dirs),n.transition&&(p.transition=n.transition),H=p,Yt(Y),H}const xo=e=>{let t;for(const n in e)(n==="class"||n==="style"||Ot(n))&&((t||(t={}))[n]=e[n]);return t},Eo=(e,t)=>{const n={};for(const s in e)(!qn(s)||!(s.slice(9)in t))&&(n[s]=e[s]);return n};function So(e,t,n){const{props:s,children:r,component:i}=e,{props:o,children:l,patchFlag:c}=t,a=i.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&c>=0){if(c&1024)return!0;if(c&16)return s?Rs(s,o,a):!!o;if(c&8){const d=t.dynamicProps;for(let g=0;ge.__isSuspense;function $r(e,t){t&&t.pendingBranch?j(e)?t.effects.push(...e):t.effects.push(e):yo(e)}const Oo=Symbol.for("v-scx"),Po=()=>ft(Oo);function jr(e,t){return ls(e,null,t)}const Ut={};function Xe(e,t,n){return ls(e,t,n)}function ls(e,t,{immediate:n,deep:s,flush:r,once:i,onTrack:o,onTrigger:l}=ee){if(t&&i){const A=t;t=(...U)=>{A(...U),P()}}const c=ie,a=A=>s===!0?A:nt(A,s===!1?1:void 0);let d,g=!1,x=!1;if(ue(e)?(d=()=>e.value,g=Jt(e)):ot(e)?(d=()=>a(e),g=!0):j(e)?(x=!0,g=e.some(A=>ot(A)||Jt(A)),d=()=>e.map(A=>{if(ue(A))return A.value;if(ot(A))return a(A);if(V(A))return Ke(A,c,2)})):V(e)?t?d=()=>Ke(e,c,2):d=()=>(C&&C(),Se(e,c,3,[M])):d=we,t&&s){const A=d;d=()=>nt(A())}let C,M=A=>{C=p.onStop=()=>{Ke(A,c,4),C=p.onStop=void 0}},F;if(pn)if(M=we,t?n&&Se(t,c,3,[d(),x?[]:void 0,M]):d(),r==="sync"){const A=Po();F=A.__watcherHandles||(A.__watcherHandles=[])}else return we;let H=x?new Array(e.length).fill(Ut):Ut;const q=()=>{if(!(!p.active||!p.dirty))if(t){const A=p.run();(s||g||(x?A.some((U,D)=>We(U,H[D])):We(A,H)))&&(C&&C(),Se(t,c,3,[A,H===Ut?void 0:x&&H[0]===Ut?[]:H,M]),H=A)}else p.run()};q.allowRecurse=!!t;let Y;r==="sync"?Y=q:r==="post"?Y=()=>he(q,c&&c.suspense):(q.pre=!0,c&&(q.id=c.uid),Y=()=>os(q));const p=new Yn(d,we,Y),y=dr(),P=()=>{p.stop(),y&&Gn(y.effects,p)};return t?n?q():H=p.run():r==="post"?he(p.run.bind(p),c&&c.suspense):p.run(),F&&F.push(P),P}function Io(e,t,n){const s=this.proxy,r=ne(e)?e.includes(".")?Hr(s,e):()=>s[e]:e.bind(s,s);let i;V(t)?i=t:(i=t.handler,n=t);const o=It(this),l=ls(r,i.bind(s),n);return o(),l}function Hr(e,t){const n=t.split(".");return()=>{let s=e;for(let r=0;r0){if(n>=t)return e;n++}if(s=s||new Set,s.has(e))return e;if(s.add(e),ue(e))nt(e.value,t,n,s);else if(j(e))for(let r=0;r{nt(r,t,n,s)});else if(cr(e))for(const r in e)nt(e[r],t,n,s);return e}function Re(e,t,n,s){const r=e.dirs,i=t&&t.dirs;for(let o=0;o!!e.type.__asyncLoader,Vr=e=>e.type.__isKeepAlive;function Lo(e,t){Dr(e,"a",t)}function Mo(e,t){Dr(e,"da",t)}function Dr(e,t,n=ie){const s=e.__wdc||(e.__wdc=()=>{let r=n;for(;r;){if(r.isDeactivated)return;r=r.parent}return e()});if(dn(t,s,n),n){let r=n.parent;for(;r&&r.parent;)Vr(r.parent.vnode)&&Fo(s,t,n,r),r=r.parent}}function Fo(e,t,n,s){const r=dn(t,e,s,!0);cs(()=>{Gn(s[t],r)},n)}function dn(e,t,n=ie,s=!1){if(n){const r=n[e]||(n[e]=[]),i=t.__weh||(t.__weh=(...o)=>{if(n.isUnmounted)return;Qe();const l=It(n),c=Se(t,n,e,o);return l(),Ze(),c});return s?r.unshift(i):r.push(i),i}}const $e=e=>(t,n=ie)=>(!pn||e==="sp")&&dn(e,(...s)=>t(...s),n),No=$e("bm"),Pt=$e("m"),$o=$e("bu"),jo=$e("u"),Ho=$e("bum"),cs=$e("um"),Uo=$e("sp"),Vo=$e("rtg"),Do=$e("rtc");function Bo(e,t=ie){dn("ec",e,t)}function Gc(e,t,n,s){let r;const i=n&&n[s];if(j(e)||ne(e)){r=new Array(e.length);for(let o=0,l=e.length;ot(o,l,void 0,i&&i[l]));else{const o=Object.keys(e);r=new Array(o.length);for(let l=0,c=o.length;len(t)?!(t.type===Ne||t.type===_e&&!Br(t.children)):!0)?e:null}const Un=e=>e?oi(e)?ds(e)||e.proxy:Un(e.parent):null,vt=le(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>Un(e.parent),$root:e=>Un(e.root),$emit:e=>e.emit,$options:e=>fs(e),$forceUpdate:e=>e.f||(e.f=()=>{e.effect.dirty=!0,os(e.update)}),$nextTick:e=>e.n||(e.n=un.bind(e.proxy)),$watch:e=>Io.bind(e)}),En=(e,t)=>e!==ee&&!e.__isScriptSetup&&k(e,t),Ko={get({_:e},t){const{ctx:n,setupState:s,data:r,props:i,accessCache:o,type:l,appContext:c}=e;let a;if(t[0]!=="$"){const C=o[t];if(C!==void 0)switch(C){case 1:return s[t];case 2:return r[t];case 4:return n[t];case 3:return i[t]}else{if(En(s,t))return o[t]=1,s[t];if(r!==ee&&k(r,t))return o[t]=2,r[t];if((a=e.propsOptions[0])&&k(a,t))return o[t]=3,i[t];if(n!==ee&&k(n,t))return o[t]=4,n[t];Vn&&(o[t]=0)}}const d=vt[t];let g,x;if(d)return t==="$attrs"&&pe(e,"get",t),d(e);if((g=l.__cssModules)&&(g=g[t]))return g;if(n!==ee&&k(n,t))return o[t]=4,n[t];if(x=c.config.globalProperties,k(x,t))return x[t]},set({_:e},t,n){const{data:s,setupState:r,ctx:i}=e;return En(r,t)?(r[t]=n,!0):s!==ee&&k(s,t)?(s[t]=n,!0):k(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(i[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:s,appContext:r,propsOptions:i}},o){let l;return!!n[o]||e!==ee&&k(e,o)||En(t,o)||(l=i[0])&&k(l,o)||k(s,o)||k(vt,o)||k(r.config.globalProperties,o)},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:k(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};function Os(e){return j(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}let Vn=!0;function Wo(e){const t=fs(e),n=e.proxy,s=e.ctx;Vn=!1,t.beforeCreate&&Ps(t.beforeCreate,e,"bc");const{data:r,computed:i,methods:o,watch:l,provide:c,inject:a,created:d,beforeMount:g,mounted:x,beforeUpdate:C,updated:M,activated:F,deactivated:H,beforeDestroy:q,beforeUnmount:Y,destroyed:p,unmounted:y,render:P,renderTracked:A,renderTriggered:U,errorCaptured:D,serverPrefetch:z,expose:S,inheritAttrs:B,components:J,directives:te,filters:Pe}=t;if(a&&ko(a,s,null),o)for(const W in o){const I=o[W];V(I)&&(s[W]=I.bind(n))}if(r){const W=r.call(n,n);Q(W)&&(e.data=ln(W))}if(Vn=!0,i)for(const W in i){const I=i[W],Ie=V(I)?I.bind(n,n):V(I.get)?I.get.bind(n,n):we,Lt=!V(I)&&V(I.set)?I.set.bind(n):we,ke=re({get:Ie,set:Lt});Object.defineProperty(s,W,{enumerable:!0,configurable:!0,get:()=>ke.value,set:Ce=>ke.value=Ce})}if(l)for(const W in l)Kr(l[W],s,n,W);if(c){const W=V(c)?c.call(n):c;Reflect.ownKeys(W).forEach(I=>{Yo(I,W[I])})}d&&Ps(d,e,"c");function N(W,I){j(I)?I.forEach(Ie=>W(Ie.bind(n))):I&&W(I.bind(n))}if(N(No,g),N(Pt,x),N($o,C),N(jo,M),N(Lo,F),N(Mo,H),N(Bo,D),N(Do,A),N(Vo,U),N(Ho,Y),N(cs,y),N(Uo,z),j(S))if(S.length){const W=e.exposed||(e.exposed={});S.forEach(I=>{Object.defineProperty(W,I,{get:()=>n[I],set:Ie=>n[I]=Ie})})}else e.exposed||(e.exposed={});P&&e.render===we&&(e.render=P),B!=null&&(e.inheritAttrs=B),J&&(e.components=J),te&&(e.directives=te)}function ko(e,t,n=we){j(e)&&(e=Dn(e));for(const s in e){const r=e[s];let i;Q(r)?"default"in r?i=ft(r.from||s,r.default,!0):i=ft(r.from||s):i=ft(r),ue(i)?Object.defineProperty(t,s,{enumerable:!0,configurable:!0,get:()=>i.value,set:o=>i.value=o}):t[s]=i}}function Ps(e,t,n){Se(j(e)?e.map(s=>s.bind(t.proxy)):e.bind(t.proxy),t,n)}function Kr(e,t,n,s){const r=s.includes(".")?Hr(n,s):()=>n[s];if(ne(e)){const i=t[e];V(i)&&Xe(r,i)}else if(V(e))Xe(r,e.bind(n));else if(Q(e))if(j(e))e.forEach(i=>Kr(i,t,n,s));else{const i=V(e.handler)?e.handler.bind(n):t[e.handler];V(i)&&Xe(r,i,e)}}function fs(e){const t=e.type,{mixins:n,extends:s}=t,{mixins:r,optionsCache:i,config:{optionMergeStrategies:o}}=e.appContext,l=i.get(t);let c;return l?c=l:!r.length&&!n&&!s?c=t:(c={},r.length&&r.forEach(a=>Qt(c,a,o,!0)),Qt(c,t,o)),Q(t)&&i.set(t,c),c}function Qt(e,t,n,s=!1){const{mixins:r,extends:i}=t;i&&Qt(e,i,n,!0),r&&r.forEach(o=>Qt(e,o,n,!0));for(const o in t)if(!(s&&o==="expose")){const l=qo[o]||n&&n[o];e[o]=l?l(e[o],t[o]):t[o]}return e}const qo={data:Is,props:Ls,emits:Ls,methods:yt,computed:yt,beforeCreate:ae,created:ae,beforeMount:ae,mounted:ae,beforeUpdate:ae,updated:ae,beforeDestroy:ae,beforeUnmount:ae,destroyed:ae,unmounted:ae,activated:ae,deactivated:ae,errorCaptured:ae,serverPrefetch:ae,components:yt,directives:yt,watch:zo,provide:Is,inject:Go};function Is(e,t){return t?e?function(){return le(V(e)?e.call(this,this):e,V(t)?t.call(this,this):t)}:t:e}function Go(e,t){return yt(Dn(e),Dn(t))}function Dn(e){if(j(e)){const t={};for(let n=0;n1)return n&&V(t)?t.call(s&&s.proxy):t}}function Qo(e,t,n,s=!1){const r={},i={};Gt(i,hn,1),e.propsDefaults=Object.create(null),kr(e,t,r,i);for(const o in e.propsOptions[0])o in r||(r[o]=void 0);n?e.props=s?r:ro(r):e.type.props?e.props=r:e.props=i,e.attrs=i}function Zo(e,t,n,s){const{props:r,attrs:i,vnode:{patchFlag:o}}=e,l=G(r),[c]=e.propsOptions;let a=!1;if((s||o>0)&&!(o&16)){if(o&8){const d=e.vnode.dynamicProps;for(let g=0;g{c=!0;const[x,C]=qr(g,t,!0);le(o,x),C&&l.push(...C)};!n&&t.mixins.length&&t.mixins.forEach(d),e.extends&&d(e.extends),e.mixins&&e.mixins.forEach(d)}if(!i&&!c)return Q(e)&&s.set(e,st),st;if(j(i))for(let d=0;d-1,C[1]=F<0||M-1||k(C,"default"))&&l.push(g)}}}const a=[o,l];return Q(e)&&s.set(e,a),a}function Ms(e){return e[0]!=="$"&&!it(e)}function Fs(e){return e===null?"null":typeof e=="function"?e.name||"":typeof e=="object"&&e.constructor&&e.constructor.name||""}function Ns(e,t){return Fs(e)===Fs(t)}function $s(e,t){return j(t)?t.findIndex(n=>Ns(n,e)):V(t)&&Ns(t,e)?0:-1}const Gr=e=>e[0]==="_"||e==="$stable",us=e=>j(e)?e.map(xe):[xe(e)],el=(e,t,n)=>{if(t._n)return t;const s=vo((...r)=>us(t(...r)),n);return s._c=!1,s},zr=(e,t,n)=>{const s=e._ctx;for(const r in e){if(Gr(r))continue;const i=e[r];if(V(i))t[r]=el(r,i,s);else if(i!=null){const o=us(i);t[r]=()=>o}}},Jr=(e,t)=>{const n=us(t);e.slots.default=()=>n},tl=(e,t)=>{if(e.vnode.shapeFlag&32){const n=t._;n?(e.slots=G(t),Gt(t,"_",n)):zr(t,e.slots={})}else e.slots={},t&&Jr(e,t);Gt(e.slots,hn,1)},nl=(e,t,n)=>{const{vnode:s,slots:r}=e;let i=!0,o=ee;if(s.shapeFlag&32){const l=t._;l?n&&l===1?i=!1:(le(r,t),!n&&l===1&&delete r._):(i=!t.$stable,zr(t,r)),o=t}else t&&(Jr(e,t),o={default:1});if(i)for(const l in r)!Gr(l)&&o[l]==null&&delete r[l]};function Zt(e,t,n,s,r=!1){if(j(e)){e.forEach((x,C)=>Zt(x,t&&(j(t)?t[C]:t),n,s,r));return}if(ct(s)&&!r)return;const i=s.shapeFlag&4?ds(s.component)||s.component.proxy:s.el,o=r?null:i,{i:l,r:c}=e,a=t&&t.r,d=l.refs===ee?l.refs={}:l.refs,g=l.setupState;if(a!=null&&a!==c&&(ne(a)?(d[a]=null,k(g,a)&&(g[a]=null)):ue(a)&&(a.value=null)),V(c))Ke(c,l,12,[o,d]);else{const x=ne(c),C=ue(c);if(x||C){const M=()=>{if(e.f){const F=x?k(g,c)?g[c]:d[c]:c.value;r?j(F)&&Gn(F,i):j(F)?F.includes(i)||F.push(i):x?(d[c]=[i],k(g,c)&&(g[c]=d[c])):(c.value=[i],e.k&&(d[e.k]=c.value))}else x?(d[c]=o,k(g,c)&&(g[c]=o)):C&&(c.value=o,e.k&&(d[e.k]=o))};o?(M.id=-1,he(M,n)):M()}}}let He=!1;const sl=e=>e.namespaceURI.includes("svg")&&e.tagName!=="foreignObject",rl=e=>e.namespaceURI.includes("MathML"),Vt=e=>{if(sl(e))return"svg";if(rl(e))return"mathml"},Dt=e=>e.nodeType===8;function il(e){const{mt:t,p:n,o:{patchProp:s,createText:r,nextSibling:i,parentNode:o,remove:l,insert:c,createComment:a}}=e,d=(p,y)=>{if(!y.hasChildNodes()){n(null,p,y),Xt(),y._vnode=p;return}He=!1,g(y.firstChild,p,null,null,null),Xt(),y._vnode=p,He&&console.error("Hydration completed but contains mismatches.")},g=(p,y,P,A,U,D=!1)=>{const z=Dt(p)&&p.data==="[",S=()=>F(p,y,P,A,U,z),{type:B,ref:J,shapeFlag:te,patchFlag:Pe}=y;let de=p.nodeType;y.el=p,Pe===-2&&(D=!1,y.dynamicChildren=null);let N=null;switch(B){case at:de!==3?y.children===""?(c(y.el=r(""),o(p),p),N=p):N=S():(p.data!==y.children&&(He=!0,p.data=y.children),N=i(p));break;case Ne:Y(p)?(N=i(p),q(y.el=p.content.firstChild,p,P)):de!==8||z?N=S():N=i(p);break;case Et:if(z&&(p=i(p),de=p.nodeType),de===1||de===3){N=p;const W=!y.children.length;for(let I=0;I{D=D||!!y.dynamicChildren;const{type:z,props:S,patchFlag:B,shapeFlag:J,dirs:te,transition:Pe}=y,de=z==="input"||z==="option";if(de||B!==-1){te&&Re(y,null,P,"created");let N=!1;if(Y(p)){N=Xr(A,Pe)&&P&&P.vnode.props&&P.vnode.props.appear;const I=p.content.firstChild;N&&Pe.beforeEnter(I),q(I,p,P),y.el=p=I}if(J&16&&!(S&&(S.innerHTML||S.textContent))){let I=C(p.firstChild,y,p,P,A,U,D);for(;I;){He=!0;const Ie=I;I=I.nextSibling,l(Ie)}}else J&8&&p.textContent!==y.children&&(He=!0,p.textContent=y.children);if(S)if(de||!D||B&48)for(const I in S)(de&&(I.endsWith("value")||I==="indeterminate")||Ot(I)&&!it(I)||I[0]===".")&&s(p,I,null,S[I],void 0,void 0,P);else S.onClick&&s(p,"onClick",null,S.onClick,void 0,void 0,P);let W;(W=S&&S.onVnodeBeforeMount)&&ye(W,P,y),te&&Re(y,null,P,"beforeMount"),((W=S&&S.onVnodeMounted)||te||N)&&$r(()=>{W&&ye(W,P,y),N&&Pe.enter(p),te&&Re(y,null,P,"mounted")},A)}return p.nextSibling},C=(p,y,P,A,U,D,z)=>{z=z||!!y.dynamicChildren;const S=y.children,B=S.length;for(let J=0;J{const{slotScopeIds:z}=y;z&&(U=U?U.concat(z):z);const S=o(p),B=C(i(p),y,S,P,A,U,D);return B&&Dt(B)&&B.data==="]"?i(y.anchor=B):(He=!0,c(y.anchor=a("]"),S,B),B)},F=(p,y,P,A,U,D)=>{if(He=!0,y.el=null,D){const B=H(p);for(;;){const J=i(p);if(J&&J!==B)l(J);else break}}const z=i(p),S=o(p);return l(p),n(null,y,S,z,P,A,Vt(S),U),z},H=(p,y="[",P="]")=>{let A=0;for(;p;)if(p=i(p),p&&Dt(p)&&(p.data===y&&A++,p.data===P)){if(A===0)return i(p);A--}return p},q=(p,y,P)=>{const A=y.parentNode;A&&A.replaceChild(p,y);let U=P;for(;U;)U.vnode.el===y&&(U.vnode.el=U.subTree.el=p),U=U.parent},Y=p=>p.nodeType===1&&p.tagName.toLowerCase()==="template";return[d,g]}const he=$r;function ol(e){return ll(e,il)}function ll(e,t){const n=fr();n.__VUE__=!0;const{insert:s,remove:r,patchProp:i,createElement:o,createText:l,createComment:c,setText:a,setElementText:d,parentNode:g,nextSibling:x,setScopeId:C=we,insertStaticContent:M}=e,F=(f,u,h,m=null,_=null,v=null,T=void 0,w=null,E=!!u.dynamicChildren)=>{if(f===u)return;f&&!_t(f,u)&&(m=Mt(f),Ce(f,_,v,!0),f=null),u.patchFlag===-2&&(E=!1,u.dynamicChildren=null);const{type:b,ref:R,shapeFlag:L}=u;switch(b){case at:H(f,u,h,m);break;case Ne:q(f,u,h,m);break;case Et:f==null&&Y(u,h,m,T);break;case _e:J(f,u,h,m,_,v,T,w,E);break;default:L&1?P(f,u,h,m,_,v,T,w,E):L&6?te(f,u,h,m,_,v,T,w,E):(L&64||L&128)&&b.process(f,u,h,m,_,v,T,w,E,et)}R!=null&&_&&Zt(R,f&&f.ref,v,u||f,!u)},H=(f,u,h,m)=>{if(f==null)s(u.el=l(u.children),h,m);else{const _=u.el=f.el;u.children!==f.children&&a(_,u.children)}},q=(f,u,h,m)=>{f==null?s(u.el=c(u.children||""),h,m):u.el=f.el},Y=(f,u,h,m)=>{[f.el,f.anchor]=M(f.children,u,h,m,f.el,f.anchor)},p=({el:f,anchor:u},h,m)=>{let _;for(;f&&f!==u;)_=x(f),s(f,h,m),f=_;s(u,h,m)},y=({el:f,anchor:u})=>{let h;for(;f&&f!==u;)h=x(f),r(f),f=h;r(u)},P=(f,u,h,m,_,v,T,w,E)=>{u.type==="svg"?T="svg":u.type==="math"&&(T="mathml"),f==null?A(u,h,m,_,v,T,w,E):z(f,u,_,v,T,w,E)},A=(f,u,h,m,_,v,T,w)=>{let E,b;const{props:R,shapeFlag:L,transition:O,dirs:$}=f;if(E=f.el=o(f.type,v,R&&R.is,R),L&8?d(E,f.children):L&16&&D(f.children,E,null,m,_,Sn(f,v),T,w),$&&Re(f,null,m,"created"),U(E,f,f.scopeId,T,m),R){for(const X in R)X!=="value"&&!it(X)&&i(E,X,null,R[X],v,f.children,m,_,Le);"value"in R&&i(E,"value",null,R.value,v),(b=R.onVnodeBeforeMount)&&ye(b,m,f)}$&&Re(f,null,m,"beforeMount");const K=Xr(_,O);K&&O.beforeEnter(E),s(E,u,h),((b=R&&R.onVnodeMounted)||K||$)&&he(()=>{b&&ye(b,m,f),K&&O.enter(E),$&&Re(f,null,m,"mounted")},_)},U=(f,u,h,m,_)=>{if(h&&C(f,h),m)for(let v=0;v{for(let b=E;b{const w=u.el=f.el;let{patchFlag:E,dynamicChildren:b,dirs:R}=u;E|=f.patchFlag&16;const L=f.props||ee,O=u.props||ee;let $;if(h&&qe(h,!1),($=O.onVnodeBeforeUpdate)&&ye($,h,u,f),R&&Re(u,f,h,"beforeUpdate"),h&&qe(h,!0),b?S(f.dynamicChildren,b,w,h,m,Sn(u,_),v):T||I(f,u,w,null,h,m,Sn(u,_),v,!1),E>0){if(E&16)B(w,u,L,O,h,m,_);else if(E&2&&L.class!==O.class&&i(w,"class",null,O.class,_),E&4&&i(w,"style",L.style,O.style,_),E&8){const K=u.dynamicProps;for(let X=0;X{$&&ye($,h,u,f),R&&Re(u,f,h,"updated")},m)},S=(f,u,h,m,_,v,T)=>{for(let w=0;w{if(h!==m){if(h!==ee)for(const w in h)!it(w)&&!(w in m)&&i(f,w,h[w],null,T,u.children,_,v,Le);for(const w in m){if(it(w))continue;const E=m[w],b=h[w];E!==b&&w!=="value"&&i(f,w,b,E,T,u.children,_,v,Le)}"value"in m&&i(f,"value",h.value,m.value,T)}},J=(f,u,h,m,_,v,T,w,E)=>{const b=u.el=f?f.el:l(""),R=u.anchor=f?f.anchor:l("");let{patchFlag:L,dynamicChildren:O,slotScopeIds:$}=u;$&&(w=w?w.concat($):$),f==null?(s(b,h,m),s(R,h,m),D(u.children||[],h,R,_,v,T,w,E)):L>0&&L&64&&O&&f.dynamicChildren?(S(f.dynamicChildren,O,h,_,v,T,w),(u.key!=null||_&&u===_.subTree)&&Yr(f,u,!0)):I(f,u,h,R,_,v,T,w,E)},te=(f,u,h,m,_,v,T,w,E)=>{u.slotScopeIds=w,f==null?u.shapeFlag&512?_.ctx.activate(u,h,m,T,E):Pe(u,h,m,_,v,T,E):de(f,u,E)},Pe=(f,u,h,m,_,v,T)=>{const w=f.component=ml(f,m,_);if(Vr(f)&&(w.ctx.renderer=et),_l(w),w.asyncDep){if(_&&_.registerDep(w,N),!f.el){const E=w.subTree=oe(Ne);q(null,E,u,h)}}else N(w,f,u,h,_,v,T)},de=(f,u,h)=>{const m=u.component=f.component;if(So(f,u,h))if(m.asyncDep&&!m.asyncResolved){W(m,u,h);return}else m.next=u,_o(m.update),m.effect.dirty=!0,m.update();else u.el=f.el,m.vnode=u},N=(f,u,h,m,_,v,T)=>{const w=()=>{if(f.isMounted){let{next:R,bu:L,u:O,parent:$,vnode:K}=f;{const tt=Qr(f);if(tt){R&&(R.el=K.el,W(f,R,T)),tt.asyncDep.then(()=>{f.isUnmounted||w()});return}}let X=R,Z;qe(f,!1),R?(R.el=K.el,W(f,R,T)):R=K,L&&wn(L),(Z=R.props&&R.props.onVnodeBeforeUpdate)&&ye(Z,$,R,K),qe(f,!0);const se=xn(f),ve=f.subTree;f.subTree=se,F(ve,se,g(ve.el),Mt(ve),f,_,v),R.el=se.el,X===null&&Co(f,se.el),O&&he(O,_),(Z=R.props&&R.props.onVnodeUpdated)&&he(()=>ye(Z,$,R,K),_)}else{let R;const{el:L,props:O}=u,{bm:$,m:K,parent:X}=f,Z=ct(u);if(qe(f,!1),$&&wn($),!Z&&(R=O&&O.onVnodeBeforeMount)&&ye(R,X,u),qe(f,!0),L&&yn){const se=()=>{f.subTree=xn(f),yn(L,f.subTree,f,_,null)};Z?u.type.__asyncLoader().then(()=>!f.isUnmounted&&se()):se()}else{const se=f.subTree=xn(f);F(null,se,h,m,f,_,v),u.el=se.el}if(K&&he(K,_),!Z&&(R=O&&O.onVnodeMounted)){const se=u;he(()=>ye(R,X,se),_)}(u.shapeFlag&256||X&&ct(X.vnode)&&X.vnode.shapeFlag&256)&&f.a&&he(f.a,_),f.isMounted=!0,u=h=m=null}},E=f.effect=new Yn(w,we,()=>os(b),f.scope),b=f.update=()=>{E.dirty&&E.run()};b.id=f.uid,qe(f,!0),b()},W=(f,u,h)=>{u.component=f;const m=f.vnode.props;f.vnode=u,f.next=null,Zo(f,u.props,m,h),nl(f,u.children,h),Qe(),Ts(f),Ze()},I=(f,u,h,m,_,v,T,w,E=!1)=>{const b=f&&f.children,R=f?f.shapeFlag:0,L=u.children,{patchFlag:O,shapeFlag:$}=u;if(O>0){if(O&128){Lt(b,L,h,m,_,v,T,w,E);return}else if(O&256){Ie(b,L,h,m,_,v,T,w,E);return}}$&8?(R&16&&Le(b,_,v),L!==b&&d(h,L)):R&16?$&16?Lt(b,L,h,m,_,v,T,w,E):Le(b,_,v,!0):(R&8&&d(h,""),$&16&&D(L,h,m,_,v,T,w,E))},Ie=(f,u,h,m,_,v,T,w,E)=>{f=f||st,u=u||st;const b=f.length,R=u.length,L=Math.min(b,R);let O;for(O=0;OR?Le(f,_,v,!0,!1,L):D(u,h,m,_,v,T,w,E,L)},Lt=(f,u,h,m,_,v,T,w,E)=>{let b=0;const R=u.length;let L=f.length-1,O=R-1;for(;b<=L&&b<=O;){const $=f[b],K=u[b]=E?Ve(u[b]):xe(u[b]);if(_t($,K))F($,K,h,null,_,v,T,w,E);else break;b++}for(;b<=L&&b<=O;){const $=f[L],K=u[O]=E?Ve(u[O]):xe(u[O]);if(_t($,K))F($,K,h,null,_,v,T,w,E);else break;L--,O--}if(b>L){if(b<=O){const $=O+1,K=$O)for(;b<=L;)Ce(f[b],_,v,!0),b++;else{const $=b,K=b,X=new Map;for(b=K;b<=O;b++){const ge=u[b]=E?Ve(u[b]):xe(u[b]);ge.key!=null&&X.set(ge.key,b)}let Z,se=0;const ve=O-K+1;let tt=!1,gs=0;const mt=new Array(ve);for(b=0;b=ve){Ce(ge,_,v,!0);continue}let Te;if(ge.key!=null)Te=X.get(ge.key);else for(Z=K;Z<=O;Z++)if(mt[Z-K]===0&&_t(ge,u[Z])){Te=Z;break}Te===void 0?Ce(ge,_,v,!0):(mt[Te-K]=b+1,Te>=gs?gs=Te:tt=!0,F(ge,u[Te],h,null,_,v,T,w,E),se++)}const ms=tt?cl(mt):st;for(Z=ms.length-1,b=ve-1;b>=0;b--){const ge=K+b,Te=u[ge],_s=ge+1{const{el:v,type:T,transition:w,children:E,shapeFlag:b}=f;if(b&6){ke(f.component.subTree,u,h,m);return}if(b&128){f.suspense.move(u,h,m);return}if(b&64){T.move(f,u,h,et);return}if(T===_e){s(v,u,h);for(let L=0;Lw.enter(v),_);else{const{leave:L,delayLeave:O,afterLeave:$}=w,K=()=>s(v,u,h),X=()=>{L(v,()=>{K(),$&&$()})};O?O(v,K,X):X()}else s(v,u,h)},Ce=(f,u,h,m=!1,_=!1)=>{const{type:v,props:T,ref:w,children:E,dynamicChildren:b,shapeFlag:R,patchFlag:L,dirs:O}=f;if(w!=null&&Zt(w,null,h,f,!0),R&256){u.ctx.deactivate(f);return}const $=R&1&&O,K=!ct(f);let X;if(K&&(X=T&&T.onVnodeBeforeUnmount)&&ye(X,u,f),R&6)xi(f.component,h,m);else{if(R&128){f.suspense.unmount(h,m);return}$&&Re(f,null,u,"beforeUnmount"),R&64?f.type.remove(f,u,h,_,et,m):b&&(v!==_e||L>0&&L&64)?Le(b,u,h,!1,!0):(v===_e&&L&384||!_&&R&16)&&Le(E,u,h),m&&hs(f)}(K&&(X=T&&T.onVnodeUnmounted)||$)&&he(()=>{X&&ye(X,u,f),$&&Re(f,null,u,"unmounted")},h)},hs=f=>{const{type:u,el:h,anchor:m,transition:_}=f;if(u===_e){vi(h,m);return}if(u===Et){y(f);return}const v=()=>{r(h),_&&!_.persisted&&_.afterLeave&&_.afterLeave()};if(f.shapeFlag&1&&_&&!_.persisted){const{leave:T,delayLeave:w}=_,E=()=>T(h,v);w?w(f.el,v,E):E()}else v()},vi=(f,u)=>{let h;for(;f!==u;)h=x(f),r(f),f=h;r(u)},xi=(f,u,h)=>{const{bum:m,scope:_,update:v,subTree:T,um:w}=f;m&&wn(m),_.stop(),v&&(v.active=!1,Ce(T,f,u,h)),w&&he(w,u),he(()=>{f.isUnmounted=!0},u),u&&u.pendingBranch&&!u.isUnmounted&&f.asyncDep&&!f.asyncResolved&&f.suspenseId===u.pendingId&&(u.deps--,u.deps===0&&u.resolve())},Le=(f,u,h,m=!1,_=!1,v=0)=>{for(let T=v;Tf.shapeFlag&6?Mt(f.component.subTree):f.shapeFlag&128?f.suspense.next():x(f.anchor||f.el);let mn=!1;const ps=(f,u,h)=>{f==null?u._vnode&&Ce(u._vnode,null,null,!0):F(u._vnode||null,f,u,null,null,null,h),mn||(mn=!0,Ts(),Xt(),mn=!1),u._vnode=f},et={p:F,um:Ce,m:ke,r:hs,mt:Pe,mc:D,pc:I,pbc:S,n:Mt,o:e};let _n,yn;return t&&([_n,yn]=t(et)),{render:ps,hydrate:_n,createApp:Xo(ps,_n)}}function Sn({type:e,props:t},n){return n==="svg"&&e==="foreignObject"||n==="mathml"&&e==="annotation-xml"&&t&&t.encoding&&t.encoding.includes("html")?void 0:n}function qe({effect:e,update:t},n){e.allowRecurse=t.allowRecurse=n}function Xr(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function Yr(e,t,n=!1){const s=e.children,r=t.children;if(j(s)&&j(r))for(let i=0;i>1,e[n[l]]0&&(t[s]=n[i-1]),n[i]=s)}}for(i=n.length,o=n[i-1];i-- >0;)n[i]=o,o=t[o];return n}function Qr(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:Qr(t)}const fl=e=>e.__isTeleport,_e=Symbol.for("v-fgt"),at=Symbol.for("v-txt"),Ne=Symbol.for("v-cmt"),Et=Symbol.for("v-stc"),St=[];let Ee=null;function Zr(e=!1){St.push(Ee=e?null:[])}function ul(){St.pop(),Ee=St[St.length-1]||null}let At=1;function js(e){At+=e}function ei(e){return e.dynamicChildren=At>0?Ee||st:null,ul(),At>0&&Ee&&Ee.push(e),e}function Jc(e,t,n,s,r,i){return ei(si(e,t,n,s,r,i,!0))}function ti(e,t,n,s,r){return ei(oe(e,t,n,s,r,!0))}function en(e){return e?e.__v_isVNode===!0:!1}function _t(e,t){return e.type===t.type&&e.key===t.key}const hn="__vInternal",ni=({key:e})=>e??null,kt=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?ne(e)||ue(e)||V(e)?{i:fe,r:e,k:t,f:!!n}:e:null);function si(e,t=null,n=null,s=0,r=null,i=e===_e?0:1,o=!1,l=!1){const c={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&ni(t),ref:t&&kt(t),scopeId:Fr,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetAnchor:null,staticCount:0,shapeFlag:i,patchFlag:s,dynamicProps:r,dynamicChildren:null,appContext:null,ctx:fe};return l?(as(c,n),i&128&&e.normalize(c)):n&&(c.shapeFlag|=ne(n)?8:16),At>0&&!o&&Ee&&(c.patchFlag>0||i&6)&&c.patchFlag!==32&&Ee.push(c),c}const oe=al;function al(e,t=null,n=null,s=0,r=null,i=!1){if((!e||e===To)&&(e=Ne),en(e)){const l=dt(e,t,!0);return n&&as(l,n),At>0&&!i&&Ee&&(l.shapeFlag&6?Ee[Ee.indexOf(e)]=l:Ee.push(l)),l.patchFlag|=-2,l}if(xl(e)&&(e=e.__vccOpts),t){t=dl(t);let{class:l,style:c}=t;l&&!ne(l)&&(t.class=Xn(l)),Q(c)&&(Sr(c)&&!j(c)&&(c=le({},c)),t.style=Jn(c))}const o=ne(e)?1:Ao(e)?128:fl(e)?64:Q(e)?4:V(e)?2:0;return si(e,t,n,s,r,o,i,!0)}function dl(e){return e?Sr(e)||hn in e?le({},e):e:null}function dt(e,t,n=!1){const{props:s,ref:r,patchFlag:i,children:o}=e,l=t?hl(s||{},t):s;return{__v_isVNode:!0,__v_skip:!0,type:e.type,props:l,key:l&&ni(l),ref:t&&t.ref?n&&r?j(r)?r.concat(kt(t)):[r,kt(t)]:kt(t):r,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:o,target:e.target,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==_e?i===-1?16:i|16:i,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:e.transition,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&dt(e.ssContent),ssFallback:e.ssFallback&&dt(e.ssFallback),el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce}}function ri(e=" ",t=0){return oe(at,null,e,t)}function Xc(e,t){const n=oe(Et,null,e);return n.staticCount=t,n}function Yc(e="",t=!1){return t?(Zr(),ti(Ne,null,e)):oe(Ne,null,e)}function xe(e){return e==null||typeof e=="boolean"?oe(Ne):j(e)?oe(_e,null,e.slice()):typeof e=="object"?Ve(e):oe(at,null,String(e))}function Ve(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:dt(e)}function as(e,t){let n=0;const{shapeFlag:s}=e;if(t==null)t=null;else if(j(t))n=16;else if(typeof t=="object")if(s&65){const r=t.default;r&&(r._c&&(r._d=!1),as(e,r()),r._c&&(r._d=!0));return}else{n=32;const r=t._;!r&&!(hn in t)?t._ctx=fe:r===3&&fe&&(fe.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else V(t)?(t={default:t,_ctx:fe},n=32):(t=String(t),s&64?(n=16,t=[ri(t)]):n=8);e.children=t,e.shapeFlag|=n}function hl(...e){const t={};for(let n=0;nie||fe;let tn,Kn;{const e=fr(),t=(n,s)=>{let r;return(r=e[n])||(r=e[n]=[]),r.push(s),i=>{r.length>1?r.forEach(o=>o(i)):r[0](i)}};tn=t("__VUE_INSTANCE_SETTERS__",n=>ie=n),Kn=t("__VUE_SSR_SETTERS__",n=>pn=n)}const It=e=>{const t=ie;return tn(e),e.scope.on(),()=>{e.scope.off(),tn(t)}},Hs=()=>{ie&&ie.scope.off(),tn(null)};function oi(e){return e.vnode.shapeFlag&4}let pn=!1;function _l(e,t=!1){t&&Kn(t);const{props:n,children:s}=e.vnode,r=oi(e);Qo(e,n,r,t),tl(e,s);const i=r?yl(e,t):void 0;return t&&Kn(!1),i}function yl(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=bt(new Proxy(e.ctx,Ko));const{setup:s}=n;if(s){const r=e.setupContext=s.length>1?wl(e):null,i=It(e);Qe();const o=Ke(s,e,0,[e.props,r]);if(Ze(),i(),or(o)){if(o.then(Hs,Hs),t)return o.then(l=>{Us(e,l,t)}).catch(l=>{fn(l,e,0)});e.asyncDep=o}else Us(e,o,t)}else li(e,t)}function Us(e,t,n){V(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:Q(t)&&(e.setupState=Or(t)),li(e,n)}let Vs;function li(e,t,n){const s=e.type;if(!e.render){if(!t&&Vs&&!s.render){const r=s.template||fs(e).template;if(r){const{isCustomElement:i,compilerOptions:o}=e.appContext.config,{delimiters:l,compilerOptions:c}=s,a=le(le({isCustomElement:i,delimiters:l},o),c);s.render=Vs(r,a)}}e.render=s.render||we}{const r=It(e);Qe();try{Wo(e)}finally{Ze(),r()}}}function bl(e){return e.attrsProxy||(e.attrsProxy=new Proxy(e.attrs,{get(t,n){return pe(e,"get","$attrs"),t[n]}}))}function wl(e){const t=n=>{e.exposed=n||{}};return{get attrs(){return bl(e)},slots:e.slots,emit:e.emit,expose:t}}function ds(e){if(e.exposed)return e.exposeProxy||(e.exposeProxy=new Proxy(Or(bt(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in vt)return vt[n](e)},has(t,n){return n in t||n in vt}}))}function vl(e,t=!0){return V(e)?e.displayName||e.name:e.name||t&&e.__name}function xl(e){return V(e)&&"__vccOpts"in e}const re=(e,t)=>io(e,t,pn);function Ds(e,t,n){const s=arguments.length;return s===2?Q(t)&&!j(t)?en(t)?oe(e,null,[t]):oe(e,t):oe(e,null,t):(s>3?n=Array.prototype.slice.call(arguments,2):s===3&&en(n)&&(n=[n]),oe(e,t,n))}const El="3.4.21";/** +* @vue/runtime-dom v3.4.21 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/const Sl="http://www.w3.org/2000/svg",Cl="http://www.w3.org/1998/Math/MathML",De=typeof document<"u"?document:null,Bs=De&&De.createElement("template"),Tl={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,s)=>{const r=t==="svg"?De.createElementNS(Sl,e):t==="mathml"?De.createElementNS(Cl,e):De.createElement(e,n?{is:n}:void 0);return e==="select"&&s&&s.multiple!=null&&r.setAttribute("multiple",s.multiple),r},createText:e=>De.createTextNode(e),createComment:e=>De.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>De.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,s,r,i){const o=n?n.previousSibling:t.lastChild;if(r&&(r===i||r.nextSibling))for(;t.insertBefore(r.cloneNode(!0),n),!(r===i||!(r=r.nextSibling)););else{Bs.innerHTML=s==="svg"?`${e}`:s==="mathml"?`${e}`:e;const l=Bs.content;if(s==="svg"||s==="mathml"){const c=l.firstChild;for(;c.firstChild;)l.appendChild(c.firstChild);l.removeChild(c)}t.insertBefore(l,n)}return[o?o.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},Rl=Symbol("_vtc");function Al(e,t,n){const s=e[Rl];s&&(t=(t?[t,...s]:[...s]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const Ks=Symbol("_vod"),Ol=Symbol("_vsh"),Pl=Symbol(""),Il=/(^|;)\s*display\s*:/;function Ll(e,t,n){const s=e.style,r=ne(n);let i=!1;if(n&&!r){if(t)if(ne(t))for(const o of t.split(";")){const l=o.slice(0,o.indexOf(":")).trim();n[l]==null&&qt(s,l,"")}else for(const o in t)n[o]==null&&qt(s,o,"");for(const o in n)o==="display"&&(i=!0),qt(s,o,n[o])}else if(r){if(t!==n){const o=s[Pl];o&&(n+=";"+o),s.cssText=n,i=Il.test(n)}}else t&&e.removeAttribute("style");Ks in e&&(e[Ks]=i?s.display:"",e[Ol]&&(s.display="none"))}const Ws=/\s*!important$/;function qt(e,t,n){if(j(n))n.forEach(s=>qt(e,t,s));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const s=Ml(e,t);Ws.test(n)?e.setProperty(gt(s),n.replace(Ws,""),"important"):e[s]=n}}const ks=["Webkit","Moz","ms"],Cn={};function Ml(e,t){const n=Cn[t];if(n)return n;let s=Oe(t);if(s!=="filter"&&s in e)return Cn[t]=s;s=rn(s);for(let r=0;rTn||(Vl.then(()=>Tn=0),Tn=Date.now());function Bl(e,t){const n=s=>{if(!s._vts)s._vts=Date.now();else if(s._vts<=n.attached)return;Se(Kl(s,n.value),t,5,[s])};return n.value=e,n.attached=Dl(),n}function Kl(e,t){if(j(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(s=>r=>!r._stopped&&s&&s(r))}else return t}const Js=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,Wl=(e,t,n,s,r,i,o,l,c)=>{const a=r==="svg";t==="class"?Al(e,s,a):t==="style"?Ll(e,n,s):Ot(t)?qn(t)||Hl(e,t,n,s,o):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):kl(e,t,s,a))?Nl(e,t,s,i,o,l,c):(t==="true-value"?e._trueValue=s:t==="false-value"&&(e._falseValue=s),Fl(e,t,s,a))};function kl(e,t,n,s){if(s)return!!(t==="innerHTML"||t==="textContent"||t in e&&Js(t)&&V(n));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const r=e.tagName;if(r==="IMG"||r==="VIDEO"||r==="CANVAS"||r==="SOURCE")return!1}return Js(t)&&ne(n)?!1:t in e}const ql=le({patchProp:Wl},Tl);let Rn,Xs=!1;function Gl(){return Rn=Xs?Rn:ol(ql),Xs=!0,Rn}const Qc=(...e)=>{const t=Gl().createApp(...e),{mount:n}=t;return t.mount=s=>{const r=Jl(s);if(r)return n(r,!0,zl(r))},t};function zl(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function Jl(e){return ne(e)?document.querySelector(e):e}const Zc=(e,t)=>{const n=e.__vccOpts||e;for(const[s,r]of t)n[s]=r;return n},Xl="modulepreload",Yl=function(e){return"/"+e},Ys={},ef=function(t,n,s){let r=Promise.resolve();if(n&&n.length>0){const i=document.getElementsByTagName("link"),o=document.querySelector("meta[property=csp-nonce]"),l=(o==null?void 0:o.nonce)||(o==null?void 0:o.getAttribute("nonce"));r=Promise.all(n.map(c=>{if(c=Yl(c),c in Ys)return;Ys[c]=!0;const a=c.endsWith(".css"),d=a?'[rel="stylesheet"]':"";if(!!s)for(let C=i.length-1;C>=0;C--){const M=i[C];if(M.href===c&&(!a||M.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${c}"]${d}`))return;const x=document.createElement("link");if(x.rel=a?"stylesheet":Xl,a||(x.as="script",x.crossOrigin=""),x.href=c,l&&x.setAttribute("nonce",l),document.head.appendChild(x),a)return new Promise((C,M)=>{x.addEventListener("load",C),x.addEventListener("error",()=>M(new Error(`Unable to preload CSS for ${c}`)))})}))}return r.then(()=>t()).catch(i=>{const o=new Event("vite:preloadError",{cancelable:!0});if(o.payload=i,window.dispatchEvent(o),!o.defaultPrevented)throw i})},tf="/logo.png",Ql=window.__VP_SITE_DATA__;function ci(e){return dr()?(ji(e),!0):!1}function gn(e){return typeof e=="function"?e():Ar(e)}const Zl=typeof window<"u"&&typeof document<"u";typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope;const ec=Object.prototype.toString,tc=e=>ec.call(e)==="[object Object]",fi=()=>{};function nc(e,t){function n(...s){return new Promise((r,i)=>{Promise.resolve(e(()=>t.apply(this,s),{fn:t,thisArg:this,args:s})).then(r).catch(i)})}return n}const ui=e=>e();function sc(e=ui){const t=Fe(!0);function n(){t.value=!1}function s(){t.value=!0}const r=(...i)=>{t.value&&e(...i)};return{isActive:cn(t),pause:n,resume:s,eventFilter:r}}function rc(e){return e||ii()}function ic(...e){if(e.length!==1)return ho(...e);const t=e[0];return typeof t=="function"?cn(fo(()=>({get:t,set:fi}))):Fe(t)}function oc(e,t,n={}){const{eventFilter:s=ui,...r}=n;return Xe(e,nc(s,t),r)}function lc(e,t,n={}){const{eventFilter:s,...r}=n,{eventFilter:i,pause:o,resume:l,isActive:c}=sc(s);return{stop:oc(e,t,{...r,eventFilter:i}),pause:o,resume:l,isActive:c}}function ai(e,t=!0,n){rc()?Pt(e,n):t?e():un(e)}function di(e){var t;const n=gn(e);return(t=n==null?void 0:n.$el)!=null?t:n}const ht=Zl?window:void 0;function Qs(...e){let t,n,s,r;if(typeof e[0]=="string"||Array.isArray(e[0])?([n,s,r]=e,t=ht):[t,n,s,r]=e,!t)return fi;Array.isArray(n)||(n=[n]),Array.isArray(s)||(s=[s]);const i=[],o=()=>{i.forEach(d=>d()),i.length=0},l=(d,g,x,C)=>(d.addEventListener(g,x,C),()=>d.removeEventListener(g,x,C)),c=Xe(()=>[di(t),gn(r)],([d,g])=>{if(o(),!d)return;const x=tc(g)?{...g}:g;i.push(...n.flatMap(C=>s.map(M=>l(d,C,M,x))))},{immediate:!0,flush:"post"}),a=()=>{c(),o()};return ci(a),a}function cc(){const e=Fe(!1),t=ii();return t&&Pt(()=>{e.value=!0},t),e}function fc(e){const t=cc();return re(()=>(t.value,!!e()))}function uc(e,t={}){const{window:n=ht}=t,s=fc(()=>n&&"matchMedia"in n&&typeof n.matchMedia=="function");let r;const i=Fe(!1),o=a=>{i.value=a.matches},l=()=>{r&&("removeEventListener"in r?r.removeEventListener("change",o):r.removeListener(o))},c=jr(()=>{s.value&&(l(),r=n.matchMedia(gn(e)),"addEventListener"in r?r.addEventListener("change",o):r.addListener(o),i.value=r.matches)});return ci(()=>{c(),l(),r=void 0}),i}const Bt=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},Kt="__vueuse_ssr_handlers__",ac=dc();function dc(){return Kt in Bt||(Bt[Kt]=Bt[Kt]||{}),Bt[Kt]}function hi(e,t){return ac[e]||t}function hc(e){return e==null?"any":e instanceof Set?"set":e instanceof Map?"map":e instanceof Date?"date":typeof e=="boolean"?"boolean":typeof e=="string"?"string":typeof e=="object"?"object":Number.isNaN(e)?"any":"number"}const pc={boolean:{read:e=>e==="true",write:e=>String(e)},object:{read:e=>JSON.parse(e),write:e=>JSON.stringify(e)},number:{read:e=>Number.parseFloat(e),write:e=>String(e)},any:{read:e=>e,write:e=>String(e)},string:{read:e=>e,write:e=>String(e)},map:{read:e=>new Map(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e.entries()))},set:{read:e=>new Set(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e))},date:{read:e=>new Date(e),write:e=>e.toISOString()}},Zs="vueuse-storage";function gc(e,t,n,s={}){var r;const{flush:i="pre",deep:o=!0,listenToStorageChanges:l=!0,writeDefaults:c=!0,mergeDefaults:a=!1,shallow:d,window:g=ht,eventFilter:x,onError:C=S=>{console.error(S)},initOnMounted:M}=s,F=(d?Tr:Fe)(typeof t=="function"?t():t);if(!n)try{n=hi("getDefaultStorage",()=>{var S;return(S=ht)==null?void 0:S.localStorage})()}catch(S){C(S)}if(!n)return F;const H=gn(t),q=hc(H),Y=(r=s.serializer)!=null?r:pc[q],{pause:p,resume:y}=lc(F,()=>A(F.value),{flush:i,deep:o,eventFilter:x});g&&l&&ai(()=>{Qs(g,"storage",D),Qs(g,Zs,z),M&&D()}),M||D();function P(S,B){g&&g.dispatchEvent(new CustomEvent(Zs,{detail:{key:e,oldValue:S,newValue:B,storageArea:n}}))}function A(S){try{const B=n.getItem(e);if(S==null)P(B,null),n.removeItem(e);else{const J=Y.write(S);B!==J&&(n.setItem(e,J),P(B,J))}}catch(B){C(B)}}function U(S){const B=S?S.newValue:n.getItem(e);if(B==null)return c&&H!=null&&n.setItem(e,Y.write(H)),H;if(!S&&a){const J=Y.read(B);return typeof a=="function"?a(J,H):q==="object"&&!Array.isArray(J)?{...H,...J}:J}else return typeof B!="string"?B:Y.read(B)}function D(S){if(!(S&&S.storageArea!==n)){if(S&&S.key==null){F.value=H;return}if(!(S&&S.key!==e)){p();try{(S==null?void 0:S.newValue)!==Y.write(F.value)&&(F.value=U(S))}catch(B){C(B)}finally{S?un(y):y()}}}}function z(S){D(S.detail)}return F}function pi(e){return uc("(prefers-color-scheme: dark)",e)}function mc(e={}){const{selector:t="html",attribute:n="class",initialValue:s="auto",window:r=ht,storage:i,storageKey:o="vueuse-color-scheme",listenToStorageChanges:l=!0,storageRef:c,emitAuto:a,disableTransition:d=!0}=e,g={auto:"",light:"light",dark:"dark",...e.modes||{}},x=pi({window:r}),C=re(()=>x.value?"dark":"light"),M=c||(o==null?ic(s):gc(o,s,i,{window:r,listenToStorageChanges:l})),F=re(()=>M.value==="auto"?C.value:M.value),H=hi("updateHTMLAttrs",(y,P,A)=>{const U=typeof y=="string"?r==null?void 0:r.document.querySelector(y):di(y);if(!U)return;let D;if(d&&(D=r.document.createElement("style"),D.appendChild(document.createTextNode("*,*::before,*::after{-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important;-ms-transition:none!important;transition:none!important}")),r.document.head.appendChild(D)),P==="class"){const z=A.split(/\s/g);Object.values(g).flatMap(S=>(S||"").split(/\s/g)).filter(Boolean).forEach(S=>{z.includes(S)?U.classList.add(S):U.classList.remove(S)})}else U.setAttribute(P,A);d&&(r.getComputedStyle(D).opacity,document.head.removeChild(D))});function q(y){var P;H(t,n,(P=g[y])!=null?P:y)}function Y(y){e.onChanged?e.onChanged(y,q):q(y)}Xe(F,Y,{flush:"post",immediate:!0}),ai(()=>Y(F.value));const p=re({get(){return a?M.value:F.value},set(y){M.value=y}});try{return Object.assign(p,{store:M,system:C,state:F})}catch{return p}}function _c(e={}){const{valueDark:t="dark",valueLight:n="",window:s=ht}=e,r=mc({...e,onChanged:(l,c)=>{var a;e.onChanged?(a=e.onChanged)==null||a.call(e,l==="dark",c,l):c(l)},modes:{dark:t,light:n}}),i=re(()=>r.system?r.system.value:pi({window:s}).value?"dark":"light");return re({get(){return r.value==="dark"},set(l){const c=l?"dark":"light";i.value===c?r.value="auto":r.value=c}})}var An={BASE_URL:"/",MODE:"production",DEV:!1,PROD:!0,SSR:!1},On={};const gi=/^(?:[a-z]+:|\/\/)/i,yc="vitepress-theme-appearance",bc=/#.*$/,wc=/[?#].*$/,vc=/(?:(^|\/)index)?\.(?:md|html)$/,be=typeof document<"u",mi={relativePath:"",filePath:"",title:"404",description:"Not Found",headers:[],frontmatter:{sidebar:!1,layout:"page"},lastUpdated:0,isNotFound:!0};function xc(e,t,n=!1){if(t===void 0)return!1;if(e=er(`/${e}`),n)return new RegExp(t).test(e);if(er(t)!==e)return!1;const s=t.match(bc);return s?(be?location.hash:"")===s[0]:!0}function er(e){return decodeURI(e).replace(wc,"").replace(vc,"$1")}function Ec(e){return gi.test(e)}function Sc(e,t){var s,r,i,o,l,c,a;const n=Object.keys(e.locales).find(d=>d!=="root"&&!Ec(d)&&xc(t,`/${d}/`,!0))||"root";return Object.assign({},e,{localeIndex:n,lang:((s=e.locales[n])==null?void 0:s.lang)??e.lang,dir:((r=e.locales[n])==null?void 0:r.dir)??e.dir,title:((i=e.locales[n])==null?void 0:i.title)??e.title,titleTemplate:((o=e.locales[n])==null?void 0:o.titleTemplate)??e.titleTemplate,description:((l=e.locales[n])==null?void 0:l.description)??e.description,head:yi(e.head,((c=e.locales[n])==null?void 0:c.head)??[]),themeConfig:{...e.themeConfig,...(a=e.locales[n])==null?void 0:a.themeConfig}})}function _i(e,t){const n=t.title||e.title,s=t.titleTemplate??e.titleTemplate;if(typeof s=="string"&&s.includes(":title"))return s.replace(/:title/g,n);const r=Cc(e.title,s);return n===r.slice(3)?n:`${n}${r}`}function Cc(e,t){return t===!1?"":t===!0||t===void 0?` | ${e}`:e===t?"":` | ${t}`}function Tc(e,t){const[n,s]=t;if(n!=="meta")return!1;const r=Object.entries(s)[0];return r==null?!1:e.some(([i,o])=>i===n&&o[r[0]]===r[1])}function yi(e,t){return[...e.filter(n=>!Tc(t,n)),...t]}const Rc=/[\u0000-\u001F"#$&*+,:;<=>?[\]^`{|}\u007F]/g,Ac=/^[a-z]:/i;function tr(e){const t=Ac.exec(e),n=t?t[0]:"";return n+e.slice(n.length).replace(Rc,"_").replace(/(^|\/)_+(?=[^/]*$)/,"$1")}const Pn=new Set;function Oc(e){if(Pn.size===0){const n=typeof process=="object"&&(On==null?void 0:On.VITE_EXTRA_EXTENSIONS)||(An==null?void 0:An.VITE_EXTRA_EXTENSIONS)||"";("3g2,3gp,aac,ai,apng,au,avif,bin,bmp,cer,class,conf,crl,css,csv,dll,doc,eps,epub,exe,gif,gz,ics,ief,jar,jpe,jpeg,jpg,js,json,jsonld,m4a,man,mid,midi,mjs,mov,mp2,mp3,mp4,mpe,mpeg,mpg,mpp,oga,ogg,ogv,ogx,opus,otf,p10,p7c,p7m,p7s,pdf,png,ps,qt,roff,rtf,rtx,ser,svg,t,tif,tiff,tr,ts,tsv,ttf,txt,vtt,wav,weba,webm,webp,woff,woff2,xhtml,xml,yaml,yml,zip"+(n&&typeof n=="string"?","+n:"")).split(",").forEach(s=>Pn.add(s))}const t=e.split(".").pop();return t==null||!Pn.has(t.toLowerCase())}const Pc=Symbol(),Ye=Tr(Ql);function nf(e){const t=re(()=>Sc(Ye.value,e.data.relativePath)),n=t.value.appearance,s=n==="force-dark"?Fe(!0):n?_c({storageKey:yc,initialValue:()=>typeof n=="string"?n:"auto",...typeof n=="object"?n:{}}):Fe(!1);return{site:t,theme:re(()=>t.value.themeConfig),page:re(()=>e.data),frontmatter:re(()=>e.data.frontmatter),params:re(()=>e.data.params),lang:re(()=>t.value.lang),dir:re(()=>e.data.frontmatter.dir||t.value.dir),localeIndex:re(()=>t.value.localeIndex||"root"),title:re(()=>_i(t.value,e.data)),description:re(()=>e.data.description||t.value.description),isDark:s}}function Ic(){const e=ft(Pc);if(!e)throw new Error("vitepress data not properly injected in app");return e}function Lc(e,t){return`${e}${t}`.replace(/\/+/g,"/")}function nr(e){return gi.test(e)||!e.startsWith("/")?e:Lc(Ye.value.base,e)}function Mc(e){let t=e.replace(/\.html$/,"");if(t=decodeURIComponent(t),t=t.replace(/\/$/,"/index"),be){const n="/";t=tr(t.slice(n.length).replace(/\//g,"_")||"index")+".md";let s=__VP_HASH_MAP__[t.toLowerCase()];if(s||(t=t.endsWith("_index.md")?t.slice(0,-9)+".md":t.slice(0,-3)+"_index.md",s=__VP_HASH_MAP__[t.toLowerCase()]),!s)return null;t=`${n}assets/${t}.${s}.js`}else t=`./${tr(t.slice(1).replace(/\//g,"_"))}.md.js`;return t}let Fc=[];function Nc(){let e=Ye.value.scrollOffset,t=0,n=24;if(typeof e=="object"&&"padding"in e&&(n=e.padding,e=e.selector),typeof e=="number")t=e;else if(typeof e=="string")t=sr(e,n);else if(Array.isArray(e))for(const s of e){const r=sr(s,n);if(r){t=r;break}}return t}function sr(e,t){const n=document.querySelector(e);if(!n)return 0;const s=n.getBoundingClientRect().bottom;return s<0?0:s+t}const $c=Symbol(),Wn="http://a.com",jc=()=>({path:"/",component:null,data:mi});function sf(e,t){const n=ln(jc()),s={route:n,go:r};async function r(l=be?location.href:"/"){var c,a;if(l=In(l),await((c=s.onBeforeRouteChange)==null?void 0:c.call(s,l))!==!1){if(be){const d=new URL(location.href);l!==In(d.href)&&(history.replaceState({scrollPosition:window.scrollY},document.title),history.pushState(null,"",l),new URL(l,Wn).hash!==d.hash&&window.dispatchEvent(new Event("hashchange")))}await o(l),await((a=s.onAfterRouteChanged)==null?void 0:a.call(s,l))}}let i=null;async function o(l,c=0,a=!1){var x;if(await((x=s.onBeforePageLoad)==null?void 0:x.call(s,l))===!1)return;const d=new URL(l,Wn),g=i=d.pathname;try{let C=await e(g);if(!C)throw new Error(`Page not found: ${g}`);if(i===g){i=null;const{default:M,__pageData:F}=C;if(!M)throw new Error(`Invalid route component: ${M}`);n.path=be?g:nr(g),n.component=bt(M),n.data=bt(F),be&&un(()=>{let H=Ye.value.base+F.relativePath.replace(/(?:(^|\/)index)?\.md$/,"$1");if(!Ye.value.cleanUrls&&!H.endsWith("/")&&(H+=".html"),H!==d.pathname&&(d.pathname=H,l=H+d.search+d.hash,history.replaceState(null,"",l)),d.hash&&!c){let q=null;try{q=document.getElementById(decodeURIComponent(d.hash).slice(1))}catch(Y){console.warn(Y)}if(q){rr(q,d.hash);return}}window.scrollTo(0,c)})}}catch(C){if(!/fetch|Page not found/.test(C.message)&&!/^\/404(\.html|\/)?$/.test(l)&&console.error(C),!a)try{const M=await fetch(Ye.value.base+"hashmap.json");window.__VP_HASH_MAP__=await M.json(),await o(l,c,!0);return}catch{}i===g&&(i=null,n.path=be?g:nr(g),n.component=t?bt(t):null,n.data=mi)}}return be&&(window.addEventListener("click",l=>{if(l.target.closest("button"))return;const a=l.target.closest("a");if(a&&!a.closest(".vp-raw")&&(a instanceof SVGElement||!a.download)){const{target:d}=a,{href:g,origin:x,pathname:C,hash:M,search:F}=new URL(a.href instanceof SVGAnimatedString?a.href.animVal:a.href,a.baseURI),H=new URL(location.href);!l.ctrlKey&&!l.shiftKey&&!l.altKey&&!l.metaKey&&!d&&x===H.origin&&Oc(C)&&(l.preventDefault(),C===H.pathname&&F===H.search?(M!==H.hash&&(history.pushState(null,"",g),window.dispatchEvent(new Event("hashchange"))),M?rr(a,M,a.classList.contains("header-anchor")):window.scrollTo(0,0)):r(g))}},{capture:!0}),window.addEventListener("popstate",async l=>{var c;await o(In(location.href),l.state&&l.state.scrollPosition||0),(c=s.onAfterRouteChanged)==null||c.call(s,location.href)}),window.addEventListener("hashchange",l=>{l.preventDefault()})),s}function Hc(){const e=ft($c);if(!e)throw new Error("useRouter() is called without provider.");return e}function bi(){return Hc().route}function rr(e,t,n=!1){let s=null;try{s=e.classList.contains("header-anchor")?e:document.getElementById(decodeURIComponent(t).slice(1))}catch(r){console.warn(r)}if(s){let r=function(){!n||Math.abs(o-window.scrollY)>window.innerHeight?window.scrollTo(0,o):window.scrollTo({left:0,top:o,behavior:"smooth"})};const i=parseInt(window.getComputedStyle(s).paddingTop,10),o=window.scrollY+s.getBoundingClientRect().top-Nc()+i;requestAnimationFrame(r)}}function In(e){const t=new URL(e,Wn);return t.pathname=t.pathname.replace(/(^|\/)index(\.html)?$/,"$1"),Ye.value.cleanUrls?t.pathname=t.pathname.replace(/\.html$/,""):!t.pathname.endsWith("/")&&!t.pathname.endsWith(".html")&&(t.pathname+=".html"),t.pathname+t.search+t.hash}const Ln=()=>Fc.forEach(e=>e()),rf=Ur({name:"VitePressContent",props:{as:{type:[Object,String],default:"div"}},setup(e){const t=bi(),{site:n}=Ic();return()=>Ds(e.as,n.value.contentProps??{style:{position:"relative"}},[t.component?Ds(t.component,{onVnodeMounted:Ln,onVnodeUpdated:Ln,onVnodeUnmounted:Ln}):"404 Page Not Found"])}}),of=Ur({setup(e,{slots:t}){const n=Fe(!1);return Pt(()=>{n.value=!0}),()=>n.value&&t.default?t.default():null}});function lf(){be&&window.addEventListener("click",e=>{var n;const t=e.target;if(t.matches(".vp-code-group input")){const s=(n=t.parentElement)==null?void 0:n.parentElement;if(!s)return;const r=Array.from(s.querySelectorAll("input")).indexOf(t);if(r<0)return;const i=s.querySelector(".blocks");if(!i)return;const o=Array.from(i.children).find(a=>a.classList.contains("active"));if(!o)return;const l=i.children[r];if(!l||o===l)return;o.classList.remove("active"),l.classList.add("active");const c=s==null?void 0:s.querySelector(`label[for="${t.id}"]`);c==null||c.scrollIntoView({block:"nearest"})}})}function cf(){if(be){const e=new WeakMap;window.addEventListener("click",t=>{var s;const n=t.target;if(n.matches('div[class*="language-"] > button.copy')){const r=n.parentElement,i=(s=n.nextElementSibling)==null?void 0:s.nextElementSibling;if(!r||!i)return;const o=/language-(shellscript|shell|bash|sh|zsh)/.test(r.className),l=[".vp-copy-ignore",".diff.remove"],c=i.cloneNode(!0);c.querySelectorAll(l.join(",")).forEach(d=>d.remove());let a=c.textContent||"";o&&(a=a.replace(/^ *(\$|>) /gm,"").trim()),Uc(a).then(()=>{n.classList.add("copied"),clearTimeout(e.get(n));const d=setTimeout(()=>{n.classList.remove("copied"),n.blur(),e.delete(n)},2e3);e.set(n,d)})}})}}async function Uc(e){try{return navigator.clipboard.writeText(e)}catch{const t=document.createElement("textarea"),n=document.activeElement;t.value=e,t.setAttribute("readonly",""),t.style.contain="strict",t.style.position="absolute",t.style.left="-9999px",t.style.fontSize="12pt";const s=document.getSelection(),r=s?s.rangeCount>0&&s.getRangeAt(0):null;document.body.appendChild(t),t.select(),t.selectionStart=0,t.selectionEnd=e.length,document.execCommand("copy"),document.body.removeChild(t),r&&(s.removeAllRanges(),s.addRange(r)),n&&n.focus()}}function ff(e,t){let n=!0,s=[];const r=i=>{if(n){n=!1,i.forEach(l=>{const c=Mn(l);for(const a of document.head.children)if(a.isEqualNode(c)){s.push(a);return}});return}const o=i.map(Mn);s.forEach((l,c)=>{const a=o.findIndex(d=>d==null?void 0:d.isEqualNode(l??null));a!==-1?delete o[a]:(l==null||l.remove(),delete s[c])}),o.forEach(l=>l&&document.head.appendChild(l)),s=[...s,...o].filter(Boolean)};jr(()=>{const i=e.data,o=t.value,l=i&&i.description,c=i&&i.frontmatter.head||[],a=_i(o,i);a!==document.title&&(document.title=a);const d=l||o.description;let g=document.querySelector("meta[name=description]");g?g.getAttribute("content")!==d&&g.setAttribute("content",d):Mn(["meta",{name:"description",content:d}]),r(yi(o.head,Dc(c)))})}function Mn([e,t,n]){const s=document.createElement(e);for(const r in t)s.setAttribute(r,t[r]);return n&&(s.innerHTML=n),e==="script"&&!t.async&&(s.async=!1),s}function Vc(e){return e[0]==="meta"&&e[1]&&e[1].name==="description"}function Dc(e){return e.filter(t=>!Vc(t))}const Fn=new Set,wi=()=>document.createElement("link"),Bc=e=>{const t=wi();t.rel="prefetch",t.href=e,document.head.appendChild(t)},Kc=e=>{const t=new XMLHttpRequest;t.open("GET",e,t.withCredentials=!0),t.send()};let Wt;const Wc=be&&(Wt=wi())&&Wt.relList&&Wt.relList.supports&&Wt.relList.supports("prefetch")?Bc:Kc;function uf(){if(!be||!window.IntersectionObserver)return;let e;if((e=navigator.connection)&&(e.saveData||/2g/.test(e.effectiveType)))return;const t=window.requestIdleCallback||setTimeout;let n=null;const s=()=>{n&&n.disconnect(),n=new IntersectionObserver(i=>{i.forEach(o=>{if(o.isIntersecting){const l=o.target;n.unobserve(l);const{pathname:c}=l;if(!Fn.has(c)){Fn.add(c);const a=Mc(c);a&&Wc(a)}}})}),t(()=>{document.querySelectorAll("#app a").forEach(i=>{const{hostname:o,pathname:l}=new URL(i.href instanceof SVGAnimatedString?i.href.animVal:i.href,i.baseURI),c=l.match(/\.\w+$/);c&&c[0]!==".html"||i.target!=="_blank"&&o===location.hostname&&(l!==location.pathname?n.observe(i):Fn.add(l))})})};Pt(s);const r=bi();Xe(()=>r.path,s),cs(()=>{n&&n.disconnect()})}export{ff as A,nf as B,Pc as C,rf as D,of as E,_e as F,Ye as G,Qc as H,sf as I,Mc as J,Pt as K,jr as L,uf as M,cf as N,lf as O,$c as R,Zc as _,si as a,bi as b,Jc as c,Ur as d,Ic as e,re as f,ti as g,Yc as h,oe as i,qc as j,tf as k,Xc as l,Fe as m,Xn as n,Zr as o,No as p,ef as q,Gc as r,Ds as s,kc as t,Ar as u,vo as v,nr as w,ri as x,zc as y,be as z}; diff --git a/assets/chunks/theme.C9Uh9Mc2.js b/assets/chunks/theme.C9Uh9Mc2.js new file mode 100644 index 0000000..0c4f4c8 --- /dev/null +++ b/assets/chunks/theme.C9Uh9Mc2.js @@ -0,0 +1,7 @@ +function __vite__mapDeps(indexes) { + if (!__vite__mapDeps.viteFileDeps) { + __vite__mapDeps.viteFileDeps = ["assets/chunks/virtual_pwa-register.C_aq7dbN.js","assets/chunks/framework.CEb3mtFd.js"] + } + return indexes.map((i) => __vite__mapDeps.viteFileDeps[i]) +} +import{d as _,o as t,c as n,a as e,t as d,F as b,r as $,n as F,u as l,w as H,b as R,e as y,f as h,g as x,h as p,i as f,j as N,_ as L,k as j,l as D,m as B,p as E,q as M,s as C}from"./framework.CEb3mtFd.js";const T=JSON.parse('{"posts":[{"title":"飞桨开源社区成为国内 Top,我们做对了什么?","url":"/posts/2023-os-report","excerpt":"

什么是开源项目和开源社区?国内活跃度 Top 的开源社区,都有哪些有趣的人和事?开源社区之于开源项目有何重要意义?

\\n","date":{"time":1701518400000,"string":"2023年12月2日"},"pinned":true},{"title":"终于等到你!PaddleOCR 新版本发布!","url":"/posts/paddleocr-release","excerpt":"

在开源社区的热烈期待与共同努力下,PaddleOCR 迎来了里程碑式的版本更新——v2.8.0!本次更新不仅引入了前沿的 OCR 技术成果,还对项目结构进行了深度优化解决了若干历史疑难问题,旨在为广大开发者提供更加高效、便捷的 OCR 解决方案。让我们一同探索 PaddleOCR v2.8.0 带来的全新体验与无限可能!

\\n","date":{"time":1720440000000,"string":"2024年7月8日"},"pinned":false},{"title":"【开源江湖闲聊录】从代码到键盘外的世界,走进 NKNaN 的日常","url":"/posts/nknan-story","excerpt":"

大家好!这次我们有幸采访到社区中的一位特别的朋友——NKNaN。她不仅是飞桨社区中的佼佼者,对于开发中的难题总能迎刃而解,也是一位才华横溢且性格随和的女性开发者。通过这次的对话,我们将一起走进李睿文的日常生活,了解她在社区背后充满转折和惊喜的个人故事~

\\n","date":{"time":1714132800000,"string":"2024年4月26日"},"pinned":false},{"title":"PaddleOCR 算法模型挑战赛圆满落幕 & 杭州开发者线下 Meetup","url":"/posts/suzhou-kaifangyuanzi","excerpt":"

2024 年 4 月 12 日,开放原子开源大赛 PaddleOCR 算法模型挑战赛 决赛路演在苏州工业园区人工智能产业园 G1 栋 3 楼会议中心顺利举行,并取得圆满成功!🎉价值 15 万元的大奖花落谁家?选手们的技术方案有多硬核?快来看看吧~

\\n

BTW,在 4 月 14 日 我们飞桨开源社区的工作人员也顺路来到杭州,在西子湖畔的一家餐厅里举办了杭州开发者线下 Meetup,和众多熟悉又陌生的“网友”成功面基 😊。

\\n","date":{"time":1713355200000,"string":"2024年4月17日"},"pinned":false},{"title":"第三十六次 PFCC 会议|Ivy 与 PaConvert 分享","url":"/posts/pfcc-36th","excerpt":"

在第 36 次 PFCC 会议上,我们有幸邀请了 Ivy 社区的英国小哥 Daniel(@djl11)和 Paddle 社区开发者莱师傅(@RedContritio)分别分享了代码转换工具 Ivy、PaConvert。

\\n","date":{"time":1711713600000,"string":"2024年3月29日"},"pinned":false},{"title":"【开源江湖闲聊录】Paddle 六边形战士?揭开汪师傅的神秘面纱~","url":"/posts/wangxin-story","excerpt":"

无论是工作还是生活,他都认真对待!无论是开源世界还是家庭亲情他都怀抱深沉热爱!从一开始提修改文档 PR 的边缘者到如今横扫各大开源任务的 Paddle 扫地僧!汪师傅一直在开源界默默努力💪深耕~今天,就让我们一起揭开这位神秘大佬的面纱,探寻他的故事吧!✨✨✨

\\n","date":{"time":1710763200000,"string":"2024年3月18日"},"pinned":false},{"title":"【睁眼看世界 🌍】|PyTorch Conference 2023 - State of PyTorch","url":"/posts/pytorch-conference-01","excerpt":"

本文是对 PyTorch Conference 2023 中的《State of PyTorch》部分进行了精准的中文翻译和详细的文字总结,旨在向读者介绍 PyTorch 社区的 2023 年动态。同时也特别参考了散步大佬的《PyTorch Conference 2023 翻译系列文章》,在此基础上,进行了细致的校对和优化,确保翻译准确无误。对散步大佬之前的辛勤翻译和对开源社区的贡献,表示衷心的感谢和敬意。

\\n","date":{"time":1709467200000,"string":"2024年3月3日"},"pinned":false},{"title":"新征程 ⛵️ |飞桨「启航计划」集训营圆满落幕","url":"/posts/starter-camp","excerpt":"

在 2023 年的 11 月 14 日,飞桨开源社区开启了一个新项目(新坑)—— 启航计划集训营。经过为期两个月紧张而充实的集训后,启航计划集训营于 1 月 30 日 正式圆满完成所有集训计划。在集训期间,大家出色地完成了三项热身打卡任务,并且有 19 位营员合入了超过 110 个 PR。衷心感谢各位营员的积极参与和卓越贡献!在这里,也向开源社区的各位 “汇报” 一下活动情况~

\\n","date":{"time":1708257600000,"string":"2024年2月18日"},"pinned":false},{"title":"【开源江湖闲聊录】飞桨的见证者:涛姐的风风雨雨传奇之旅","url":"/posts/tao-story","excerpt":"

嘿,你知道飞桨社区里的 DDL 战士是谁么?嘿,你知道大家心中的 Paddle 社区妈妈是谁么?那你又知道谁是(仓库管理员)飞桨仓库的实际控制人?谁是飞桨仓库的守护者?谁是飞桨从闭源到开源的见证者?是的,本期要采访的就是我们 Paddle 的资深研发女神——涛姐!

\\n","date":{"time":1707220800000,"string":"2024年2月6日"},"pinned":false},{"title":"【开源江湖闲聊录】社区最强水群人——张师傅的酸甜苦辣生活说","url":"/posts/zhangyiqiao-story","excerpt":"

格子衬衫 👕,黑框眼镜 👓,他就是上天钦定的程序员!他狂卷技术,热爱开源;他喜欢摸鱼 🐟,疯狂水群;他“厨艺精湛”,堪称当代厨神。严寒冬日,别人有女朋友温暖手心,而他把 🥤 优乐美捧在手心!凌晨就寝,别人躺平酝酿睡意,他靠咖啡 ☕️ 进入梦境!工作一年半,至今单身汉!他就是来自安徽的吃辣小趴菜——张一乔 😆!

\\n","date":{"time":1706184000000,"string":"2024年1月25日"},"pinned":false},{"title":"【开源江湖闲聊录】物理 ➡️ 经济 ➡️ 开源,看散步师傅的曲折求学史~","url":"/posts/sanbu-story","excerpt":"

“负暄檐宇下,散步池塘曲”,本期我们邀请到了热情好学的散步 🚶‍♀️ 师傅!你想知道他的人生理想么?你想了解他的学习历程么?你想知道他的日常生活么?你想得到他的真挚祝福么?点击此篇博客,让我们一起走进小散的浪漫人生~

\\n","date":{"time":1705233600000,"string":"2024年1月14日"},"pinned":false},{"title":"项目收官|将 xdoctest 引入到飞桨框架工作流中","url":"/posts/xdoctest-project","excerpt":"

【将 xdoctest 引入飞桨工作流】的项目总结。

\\n","date":{"time":1703678400000,"string":"2023年12月27日"},"pinned":false},{"title":"飞桨开源社区参加开放原子开源大赛 & 开发者大会","url":"/posts/wuxi-kaifangyuanzi","excerpt":"

2023 年 12 月 15 日顺利完成「第一届开放原子开源大赛 - 飞桨 PaddlePaddle 开源贡献挑战赛」决赛路演,产生 2 支一等奖队伍,16 日参加开放原子开源基金会举办的「2023 开放原子开发者大会」,与各开源组织与机构同行沟通交流,收获满满~

\\n","date":{"time":1703592000000,"string":"2023年12月26日"},"pinned":false},{"title":"PaddlePaddle Hackathon Episode 03 | 创新碰撞,技术狂欢,飞桨黑客马拉松第五期活动圆满收官!","url":"/posts/hackathon-5th-episode03","excerpt":"

让我们看看哪些最强“Hacker”脱颖而出!

\\n","date":{"time":1703505600000,"string":"2023年12月25日"},"pinned":false},{"title":"【开源江湖闲聊录】产品经理?程序员?郑师傅教你如何双双拿下❗","url":"/posts/zheng-story","excerpt":"

​集百家之阴阳,合一家之糟粕。好消息!好消息!自称 Paddle 社区“最想当 PM 的程序员” 、“Paddle 首席阴阳家”—— Zheng-bicheng,闪亮登场 🥳🎉🎉🎉。你想掌握最前沿的阴阳技巧么?你想成为和他一样优秀的开发者吗?你想和他一样眼神 👀 中透露着睿智的光芒,小脑袋瓜里装满各种各样的知识么?那就快来看看这篇博客吧!🌹

\\n","date":{"time":1703332800000,"string":"2023年12月23日"},"pinned":false},{"title":"如何在开源社区摸 🐟?","url":"/posts/loaf-sharing","excerpt":"

本篇博客文章的内容,来源于作者在「第八届中国开源年会」上分享的一次主题为 「如何在开源社区摸 🐟」 的闪电演讲,以下的部分为演讲的具体内容。

\\n","date":{"time":1702900800000,"string":"2023年12月18日"},"pinned":false},{"title":"【开源江湖闲聊录】初中生也能当开发者❓少年黄瓜的开源奇遇记","url":"/posts/huanggua-story","excerpt":"

他来了,他来了,他带着满满的故事,迈着自信的步伐向我们走来了!虽然刚满 15 岁,但小小黄瓜的开源史却已有好几年!学校趣事?开源经历?迷人帅照?成山作业?你都能在本篇博客看到!

\\n","date":{"time":1702382400000,"string":"2023年12月12日"},"pinned":false},{"title":"【开源江湖闲聊录】躺平健身搞开源:敏师傅的三十而立","url":"/posts/limin-story","excerpt":"

从对 Git 一窍不通到如今能够丝滑完成黑客松赛题,从曾经历鬼门关的生死挣扎到现在能够轻松跑几公里不喘气,从毕业于武大国软学的有志青年到佛系养生的新时代躺平中年,敏师傅 的人生经历就像是那瓶经年陈酿的老酒,醇厚细腻、回味无穷。

\\n","date":{"time":1701950400000,"string":"2023年12月7日"},"pinned":false},{"title":"【开源江湖闲聊录】从入门到入职(入土):黄师傅的校招 offer 指南!","url":"/posts/huangjiyi-story","excerpt":"

从积极参与社区开源任务,到加入飞桨成为 (练习生) 实习生,到最终正式成为飞桨研发团队的一员。以兴趣为起点, 黄济懿师傅 将我们展示了一条通往职业的道路,希望他的故事能够激励所有对开源充满热情的开发者们。接下来,原神启动 🚀!

\\n","date":{"time":1701777600000,"string":"2023年12月5日"},"pinned":false},{"title":"PaddlePaddle Hackathon Episode 02 | 第五期活动上线 8 周,框架赛道提交率近 90%","url":"/posts/hackathon-5th-episode02","excerpt":"

向大家快速介绍飞桨黑客松第五期开展以来的进展(11.4-12.1)

\\n","date":{"time":1701432000000,"string":"2023年12月1日"},"pinned":false},{"title":"【开源江湖闲聊录】英雄不问出处:川师傅的逆袭之路","url":"/posts/chuan-story","excerpt":"

“桨声川水悠悠过,长路漫漫风光留”,这次我们要采访的是小伙伴们都熟悉的励志富哥儿——川川师傅

\\n","date":{"time":1701172800000,"string":"2023年11月28日"},"pinned":false},{"title":"飞桨开源社区走进北京大学课堂","url":"/posts/pku-course","excerpt":"","date":{"time":1700568000000,"string":"2023年11月21日"},"pinned":false},{"title":"【开源江湖闲聊录】社区掌舵人:顺师傅的 Paddle 之旅","url":"/posts/shun-story","excerpt":"

【开源江湖闲聊录】 是一项专门为 Paddle 社区的开发者打造的特色访谈栏目📚。在这里,我们邀请到每一位别具一格且富有热情的开发者,通过文字或语音的方式进行深入采访 🎙️,探索并展现他们背后独一无二的故事,将他们的经历、见解和创意整理成精彩内容,呈现给整个社区。

\\n","date":{"time":1700568000000,"string":"2023年11月21日"},"pinned":false},{"title":"PaddlePaddle Hackathon Episode 01 | 第五期活动上线 4 周,直播圆满收官,三大赛道进展顺利","url":"/posts/hackathon-5th-episode01","excerpt":"

向大家快速介绍飞桨黑客松第五期活动上线以来的进展(9.25-11.3)

\\n","date":{"time":1699012800000,"string":"2023年11月3日"},"pinned":false},{"title":"飞桨社区成都行:开源社活动与开发者线下 Meetup","url":"/posts/chengdu-kaiyuanshe","excerpt":"

2023 年 10 月 28 日、29 日参加开源社举办的「第八届中国开源年会」的精彩瞬间,以及与咱 Paddle 社区成都开发者们的线下见面~

\\n","date":{"time":1698926400000,"string":"2023年11月2日"},"pinned":false},{"title":"飞桨开源社区参加中国开源软件创新大赛剪影","url":"/posts/xian-event","excerpt":"","date":{"time":1698235200000,"string":"2023年10月25日"},"pinned":false},{"title":"在这里,记录有趣的飞桨开源社区故事!","url":"/posts/first-post","excerpt":"","date":{"time":1698148800000,"string":"2023年10月24日"},"pinned":false}],"postsPerPage":10,"numPages":3}'),z=e("dt",{class:"sr-only"},"Published on",-1),V={class:"text-base leading-6 font-medium text-gray-500 dark:text-gray-300"},W=["datetime"],I=_({__name:"Date",props:{date:{}},setup(c){const s=c;function r(){return new Date(s.date.time).toISOString()}return(a,i)=>(t(),n("dl",null,[z,e("dd",V,[e("time",{datetime:r()},d(a.date.string),9,W)])]))}}),G={class:"flex justify-center space-x-2 py-4"},q=["href"],K=_({__name:"Pagination",props:{numPages:{},pageIndex:{}},setup(c){return(s,r)=>(t(),n("div",G,[(t(!0),n(b,null,$(s.numPages,a=>(t(),n("a",{class:F(["px-3 py-2 rounded-md font-bold hover:outline outline-green-700",{"bg-green-200 dark:bg-green-700":s.pageIndex===a,"text-green-700 dark:text-green-300":s.pageIndex!==a}]),key:a,href:l(H)(a===1?"/index.html":`/pages/${a}.html`)},d(a),11,q))),128))]))}}),U={class:"divide-y divide-gray-200 dark:divide-slate-200/5"},J={class:"pt-6 pb-8 space-y-2 md:space-y-5"},Z={class:"text-3xl leading-9 font-extrabold text-gray-900 dark:text-white tracking-tight sm:text-4xl sm:leading-10 md:text-6xl md:leading-14"},Q={class:"text-lg leading-7 text-gray-500 dark:text-white"},X={class:"divide-y divide-gray-200 dark:divide-slate-200/5"},Y={class:"py-12"},ee={class:"space-y-2 xl:grid xl:grid-cols-4 xl:space-y-0 xl:items-baseline"},te={class:"space-y-5 xl:col-span-3"},se={class:"space-y-6"},ae={class:"text-2xl leading-8 font-bold tracking-tight"},ne={key:0,class:"text-red-600"},re=["href"],oe=["innerHTML"],ie={class:"text-base leading-6 font-medium"},le=["href"],de=_({__name:"Home",setup(c){const s=R(),{posts:r,postsPerPage:a,numPages:i}=T,{frontmatter:o,site:u}=y(),g=h(()=>s.path==="/"?1:Number(s.path.split("/")[2])),m=h(()=>{const v=(g.value-1)*a,k=v+a;return r.slice(v,k)});return(v,k)=>(t(),n("div",U,[e("div",J,[e("h1",Z,d(l(o).title||l(u).title),1),e("p",Q,d(l(o).subtext||l(u).description),1)]),e("ul",X,[(t(!0),n(b,null,$(m.value,({title:S,url:P,date:A,excerpt:w,pinned:O})=>(t(),n("li",Y,[e("article",ee,[f(I,{date:A},null,8,["date"]),e("div",te,[e("div",se,[e("h2",ae,[O?(t(),n("span",ne,"[置顶]")):p("",!0),e("a",{class:"text-gray-900 dark:text-white",href:P},d(S),9,re)]),w?(t(),n("div",{key:0,class:"prose dark:prose-invert max-w-none text-gray-500 dark:text-gray-300",innerHTML:w},null,8,oe)):p("",!0)]),e("div",ie,[e("a",{class:"link","aria-label":"read more",href:P},"Read more →",8,le)])])])]))),256))]),m.value.length!==l(r).length?(t(),x(K,{key:0,"num-pages":l(i),"page-index":g.value},null,8,["num-pages","page-index"])):p("",!0)]))}}),ce={class:"flex items-center space-x-2"},pe=["src"],ue={class:"text-sm font-medium leading-5 whitespace-nowrap"},_e=e("dt",{class:"sr-only"},"Name",-1),he={class:"text-gray-900 dark:text-white"},ge={key:0,class:"sr-only"},xe={key:1},me=["href"],fe=_({__name:"Author",props:{name:{},github:{},avatar:{}},setup(c){const{name:s,github:r,avatar:a}=c,i=h(()=>a??(r?`https://github.com/${r}.png`:void 0)),o=h(()=>r?`https://github.com/${r}`:void 0);return(u,g)=>(t(),n("li",ce,[i.value?(t(),n("img",{key:0,src:i.value,alt:"author image",class:"w-10 h-10 rounded-full"},null,8,pe)):p("",!0),e("dl",ue,[_e,e("dd",he,d(u.name),1),o.value?(t(),n("dt",ge,"GitHub")):p("",!0),o.value?(t(),n("dd",xe,[e("a",{href:o.value,target:"_blank",rel:"noopnener noreferrer",class:"link"},"@"+d(u.github),9,me)])):p("",!0)])]))}}),ye={class:"pt-6 pb-10 xl:pt-11 xl:border-b xl:border-gray-200 dark:xl:border-slate-200/5"},ve=e("dt",{class:"sr-only"},"Authors",-1),ke={class:"flex flex-col pl-10 space-y-5 md:justify-center md:flex-row md:space-y-0 md:space-x-12 md:pl-0 xl:block xl:space-x-0 xl:space-y-8"},be=_({__name:"Authors",setup(c){const{frontmatter:s}=y(),r=h(()=>{const a=s.value.co_authors??[];return[s.value.author,...a]});return(a,i)=>(t(),n("dl",ye,[ve,e("dd",null,[e("ul",ke,[(t(!0),n(b,null,$(r.value,o=>(t(),x(fe,{key:o.name,name:o.name,github:o.github,avatar:o.avatar},null,8,["name","github","avatar"]))),128))])])]))}}),$e={class:"xl:divide-y xl:divide-gray-200 dark:xl:divide-slate-200/5"},Pe={class:"pt-6 xl:pb-10 space-y-1 text-center"},we={class:"text-3xl leading-9 font-extrabold text-gray-900 dark:text-white tracking-tight sm:text-4xl sm:leading-10 md:text-5xl md:leading-14"},Ce={class:"divide-y xl:divide-y-0 divide-gray-200 dark:divide-slate-200/5 xl:grid xl:grid-cols-4 xl:gap-x-10 pb-16 xl:pb-20",style:{"grid-template-rows":"auto 1fr"}},Re={class:"divide-y divide-gray-200 dark:divide-slate-200/5 xl:pb-0 xl:col-span-3 xl:row-span-2"},Ne={class:"text-sm font-medium leading-5 divide-y divide-gray-200 dark:divide-slate-200/5 xl:col-start-1 xl:row-start-2"},Te={key:0,class:"py-8"},Ie=e("h2",{class:"text-xs tracking-wide uppercase text-gray-500 dark:text-white"}," Next Article ",-1),Se={class:"link"},Ae=["href"],Oe={key:1,class:"py-8"},Fe=e("h2",{class:"text-xs tracking-wide uppercase text-gray-500 dark:text-white"}," Previous Article ",-1),He={class:"link"},Le=["href"],je=e("div",{class:"pt-8"},[e("a",{class:"link",href:"/"},"← Back to the blog")],-1),De=_({__name:"Article",setup(c){const{posts:s}=T,{frontmatter:r}=y(),a=R();function i(){return s.findIndex(m=>m.url===a.path)}const o=h(()=>s[i()].date),u=h(()=>s[i()-1]),g=h(()=>s[i()+1]);return(m,v)=>{const k=N("Content");return t(),n("article",$e,[e("header",Pe,[f(I,{date:o.value},null,8,["date"]),e("h1",we,d(l(r).title),1)]),e("div",Ce,[f(be),e("div",Re,[f(k,{class:"prose dark:prose-invert max-w-none pt-10 pb-8"})]),e("footer",Ne,[u.value?(t(),n("div",Te,[Ie,e("div",Se,[e("a",{href:u.value.url},d(u.value.title),9,Ae)])])):p("",!0),g.value?(t(),n("div",Oe,[Fe,e("div",He,[e("a",{href:g.value.url},d(g.value.title),9,Le)])])):p("",!0),je])])])}}}),Be={},Ee={class:"text-3xl font-bold dark:text-white"};function Me(c,s){return t(),n("h1",Ee,"404 Page Not Found")}const ze=L(Be,[["render",Me]]),Ve={class:"xl:divide-y xl:divide-gray-200 dark:xl:divide-slate-200/5"},We={class:"pt-6 xl:pb-10 space-y-1 text-center"},Ge={class:"text-3xl leading-9 font-extrabold text-gray-900 dark:text-white tracking-tight sm:text-4xl sm:leading-10 md:text-5xl md:leading-14"},qe=e("footer",{class:"text-sm font-medium leading-5 divide-y divide-gray-200 dark:divide-slate-200/5 xl:col-start-1 xl:row-start-2"},null,-1),Ke=_({__name:"About",setup(c){const{frontmatter:s}=y();return(r,a)=>{const i=N("Content");return t(),n("article",Ve,[e("header",We,[e("h1",Ge,d(l(s).title),1)]),f(i,{class:"prose dark:prose-invert max-w-none pt-10 pb-8"}),qe])}}}),Ue={class:"antialiased dark:bg-neutral-900 min-h-screen"},Je={class:"max-w-3xl mx-auto px-4 sm:px-6 xl:max-w-5xl xl:px-0"},Ze={class:"flex justify-between items-center py-10 font-bold"},Qe=["aria-label"],Xe=e("img",{class:"inline-block mr-2",style:{width:"120px"},alt:"logo",src:j},null,-1),Ye={key:0,class:"hidden md:inline dark:text-white"},et=D('',1),tt={class:"max-w-3xl mx-auto px-4 sm:px-6 xl:max-w-5xl xl:px-0"},st=_({__name:"Layout",setup(c){const{page:s,frontmatter:r,site:a}=y();return(i,o)=>(t(),n("div",Ue,[e("div",Je,[e("nav",Ze,[e("a",{class:"text-xl",href:"/","aria-label":l(a).title},[Xe,l(r).index?p("",!0):(t(),n("span",Ye,d(l(a).title),1))],8,Qe),et])]),e("main",tt,[l(r).layout==="home"?(t(),x(de,{key:0})):l(r).layout==="about"?(t(),x(Ke,{key:1})):l(s).isNotFound?(t(),x(ze,{key:2})):(t(),x(De,{key:3}))])]))}}),at={key:0,class:"pwa-toast",role:"alertdialog","aria-labelledby":"pwa-message"},nt=e("div",{id:"pwa-message",class:"mb-3"},"App ready to work offline",-1),rt=_({__name:"RegisterSW",setup(c){const s=B(!1),r=()=>{s.value=!0},a=async()=>{s.value=!1};return E(async()=>{const{registerSW:i}=await M(()=>import("./virtual_pwa-register.C_aq7dbN.js"),__vite__mapDeps([0,1]));i({immediate:!0,onOfflineReady:r,onRegistered(){console.info("Service Worker registered")},onRegisterError(o){console.error("Service Worker registration error!",o)}})}),(i,o)=>s.value?(t(),n("div",at,[nt,e("button",{type:"button",class:"pwa-cancel",onClick:a},"Close")])):p("",!0)}}),it={Layout(){return C(st,null,{"layout-bottom":()=>C(rt)})}};export{it as R}; diff --git a/assets/chunks/virtual_pwa-register.C_aq7dbN.js b/assets/chunks/virtual_pwa-register.C_aq7dbN.js new file mode 100644 index 0000000..c35073c --- /dev/null +++ b/assets/chunks/virtual_pwa-register.C_aq7dbN.js @@ -0,0 +1,7 @@ +function __vite__mapDeps(indexes) { + if (!__vite__mapDeps.viteFileDeps) { + __vite__mapDeps.viteFileDeps = [] + } + return indexes.map((i) => __vite__mapDeps.viteFileDeps[i]) +} +import{q as u}from"./framework.CEb3mtFd.js";function v(c={}){const{immediate:d=!1,onNeedRefresh:f,onOfflineReady:a,onRegistered:r,onRegisteredSW:s,onRegisterError:t}=c;let i,n;const o=async(e=!0)=>{await n};async function l(){if("serviceWorker"in navigator){if(i=await u(()=>import("./workbox-window.prod.es5.DFjpnwFp.js"),__vite__mapDeps([])).then(({Workbox:e})=>new e("/sw.js",{scope:"/",type:"classic"})).catch(e=>{t==null||t(e)}),!i)return;i.addEventListener("activated",e=>{(e.isUpdate||e.isExternal)&&window.location.reload()}),i.addEventListener("installed",e=>{e.isUpdate||a==null||a()}),i.register({immediate:d}).then(e=>{s?s("/sw.js",e):r==null||r(e)}).catch(e=>{t==null||t(e)})}}return n=l(),o}export{v as registerSW}; diff --git a/assets/chunks/workbox-window.prod.es5.DFjpnwFp.js b/assets/chunks/workbox-window.prod.es5.DFjpnwFp.js new file mode 100644 index 0000000..6822d18 --- /dev/null +++ b/assets/chunks/workbox-window.prod.es5.DFjpnwFp.js @@ -0,0 +1,2 @@ +try{self["workbox:window:7.0.0"]&&_()}catch{}function S(t,r){return new Promise(function(e){var i=new MessageChannel;i.port1.onmessage=function(f){e(f.data)},t.postMessage(r,[i.port2])})}function W(t,r){for(var e=0;et.length)&&(r=t.length);for(var e=0,i=new Array(r);e"u"||t[Symbol.iterator]==null){if(Array.isArray(t)||(e=function(f,d){if(f){if(typeof f=="string")return E(f,d);var h=Object.prototype.toString.call(f).slice(8,-1);return h==="Object"&&f.constructor&&(h=f.constructor.name),h==="Map"||h==="Set"?Array.from(f):h==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(h)?E(f,d):void 0}}(t))||r&&t&&typeof t.length=="number"){e&&(t=e);var i=0;return function(){return i>=t.length?{done:!0}:{done:!1,value:t[i++]}}}throw new TypeError(`Invalid attempt to iterate non-iterable instance. +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}return(e=t[Symbol.iterator]()).next.bind(e)}try{self["workbox:core:7.0.0"]&&_()}catch{}var y=function(){var t=this;this.promise=new Promise(function(r,e){t.resolve=r,t.reject=e})};function b(t,r){var e=location.href;return new URL(t,e).href===new URL(r,e).href}var g=function(t,r){this.type=t,Object.assign(this,r)};function p(t,r,e){return e?r?r(t):t:(t&&t.then||(t=Promise.resolve(t)),r?t.then(r):t)}function L(){}var j={type:"SKIP_WAITING"};function P(t,r){if(!r)return t&&t.then?t.then(L):Promise.resolve()}var x=function(t){var r,e;function i(v,c){var n,o;return c===void 0&&(c={}),(n=t.call(this)||this).nn={},n.tn=0,n.rn=new y,n.en=new y,n.on=new y,n.un=0,n.an=new Set,n.cn=function(){var s=n.fn,a=s.installing;n.tn>0||!b(a.scriptURL,n.sn.toString())||performance.now()>n.un+6e4?(n.vn=a,s.removeEventListener("updatefound",n.cn)):(n.hn=a,n.an.add(a),n.rn.resolve(a)),++n.tn,a.addEventListener("statechange",n.ln)},n.ln=function(s){var a=n.fn,u=s.target,l=u.state,m=u===n.vn,w={sw:u,isExternal:m,originalEvent:s};!m&&n.mn&&(w.isUpdate=!0),n.dispatchEvent(new g(l,w)),l==="installed"?n.wn=self.setTimeout(function(){l==="installed"&&a.waiting===u&&n.dispatchEvent(new g("waiting",w))},200):l==="activating"&&(clearTimeout(n.wn),m||n.en.resolve(u))},n.dn=function(s){var a=n.hn,u=a!==navigator.serviceWorker.controller;n.dispatchEvent(new g("controlling",{isExternal:u,originalEvent:s,sw:a,isUpdate:n.mn})),u||n.on.resolve(a)},n.gn=(o=function(s){var a=s.data,u=s.ports,l=s.source;return p(n.getSW(),function(){n.an.has(l)&&n.dispatchEvent(new g("message",{data:a,originalEvent:s,ports:u,sw:l}))})},function(){for(var s=[],a=0;a什么是开源项目和开源社区?国内活跃度 Top 的开源社区,都有哪些有趣的人和事?开源社区之于开源项目有何重要意义?

开源项目(Open Source Project),顾名思义是指开放源代码的可以被公众使用的软件项目,在开源合规的基础上,其他开发者可以对软件进行使用、修改和发行。基于「共建共治共享」的开源理念,许多开源项目汇聚了一批拥有共同兴趣爱好的开发者,形成了一个个独特的开源社区(Open Source Community)。据第三方数据显示,飞桨开源社区已成为国内 Top 的开源社区,作为社区维护者,我们做对了什么?

1. 飞桨开源数据一览

2. 整体飞桨平台的情况

来一段官方介绍:

飞桨(PaddlePaddle)以百度多年的深度学习技术研究和业务应用为基础,集核心框架、基础模型库、端到端开发套件、丰富的工具组件、星河社区于一体,是中国首个自主研发、功能丰富、开源开放的产业级深度学习平台。飞桨在业内率先实现了动静统一的框架设计,兼顾科研和产业需求,在开发便捷的深度学习框架、大规模分布式训练、高性能推理引擎、产业级模型库等技术上处于国际领先水平。

飞桨端到端自适应混合并行训练技术以及压缩、推理、服务部署的协同优化,高效支撑以文心一言为代表的文心大模型的生产与应用。

IDC 发布的 2022 年中国深度学习框架和平台市场份额报告显示,百度稳居中国深度学习平台市场综合份额第一。中国信息通信研究院《深度学习平台发展报告(2022)》指出,飞桨已经成为中国深度学习市场应用规模第一的深度学习框架和赋能平台。

当前飞桨已凝聚 800 万开发者,基于飞桨创建 80 万个模型,服务 22 万家企事业单位,广泛服务于金融、能源、制造、交通等领域。

截至 2023 年 8 月,飞桨开源社区累计提交 Commits 超过 93 万次,以 PR 或 ISSUE 提交形式的开源贡献者超过 18000 人。

3. 谁开发了飞桨

BAIDU Contributors:专职的研发部门(深度学习技术平台部),及非专职的其他部门的工程师。

尽管并没有一种特定的方法来识别某位 contributor 是否是百度的雇员,但你依然可以从 github profile 或者 author email 中来找到大量活跃的百度工程师的身影。

Corporate Contributors:NVIDIA、INTEL、昆仑芯、寒武纪,等等多家硬件公司的专职工程师。

翻看AUTHORS.md文件,或者查看飞桨的代码仓库的 commits log,你总能看到来自于这些硬件公司的优秀的工程师的贡献。(小彩蛋:你甚至能找到 intel 工程师们的一张合照)

Individual Contributors:来自高校的学生及来自企业的工程师在业余时间的贡献。

individual-contributors

我们今天对开源社区及开发者的讨论,会聚焦到 Individual Contributors 群体。当前,个人贡献者群体已经成为飞桨开源社区必不可少的研发力量,在提升开源项目影响力、社区活跃度、扩大开源声量方面,更是有着十分重要的意义。

4. 社区开源贡献为飞桨带来了什么

这是一些 2023 年至今社区开发者为飞桨核心框架做出的代码贡献合辑,可以看到从工程效能优化、文档体验提升,到飞桨内核十分重要的 PHI 算子库独立编译,社区开发者都做出了非常重要的贡献。值得一提的是,飞桨 2.4 版本中发布的 API 有三分之一是由社区开发者完成的,到飞桨 2.5 版本,新增的 API 贡献几乎都来自社区开发者。

projects

除此之外,在飞桨的端到端开发套件 PaddleOCR、PaddleClas、PaddleDetection、PaddleSeg,以及大模型套件 PaddleNLP、PaddleMIX 中,社区开发者贡献了许多 SOTA 的算法模型、训推一体 pipeline、tutorials&demo,与飞桨团队共同打磨易用的深度学习框架与工具组件。

这里可以查看更多进行中和已结项的项目:https://github.com/orgs/PaddlePaddle/projects/7

5. 参与飞桨社区的开源贡献会获得什么

技术实力与开源影响力提升

  • 飞桨社区开源项目覆盖深度学习框架、模型、应用全领域,你想提升的技术,这里全都有;
  • 与飞桨产研团队紧密沟通协作,和飞桨共同成长;
  • 开源贡献行为全部公开可查,飞桨社区丰富的开源贡献活动助你树立个人开源影响力;
  • 鼓励社区孵化项目,你可以在这里找到志同道合的小伙伴,把想法变成现实。

荣誉证书、现金激励与工作机会

  • 颁发开源贡献证书、社区曝光度、奖状徽章等,致敬每一位贡献者;
  • 举办丰富社区赛事,提供奖金/奖品激励与权威机构认证;
  • 开源社区贡献者在招聘中会被优先考虑。

硬件支持

  • 提供线上 V100 开发环境,随时可以开发与编译。

honours

6. 飞桨快乐开源:Grow Together, and Have Fun

先来讲一个故事。

大概在 2022 年 12 月份的时候,通过代码扫描工具发现了飞桨框架的 100 多个小 bug 🐛。说是 bug,但是问题真的很小,诸如堆栈溢出(stack overflow)、UFA 非法地址访问(UFA illegal address access)、Python IndexError、空指针(Null pointer)、除 0 错误(divide by 0),大部分 bug 可以被很少的一行或几行代码 fix。

issues

bug 发现了不能不修,怎么修呢?我们把目光放到了开源社区。这是一批极易上手的开发任务,开发者可以在不熟悉框架的情况下完成 bug 修复任务,获得满满成就感;时间上来看,刚好赶上高校学生们放寒假,有大量的空闲时间参与开源活动;研发人力方面,我们协调到 1 个完整人力来支持 code review,保障 bug 修复质量。天时地利人和,我们把这一批 bug 修复任务包装成了一个社区活动 —— 飞桨快乐开源:提 PR 领取新年礼物 🎁。

这个活动一经推出,立马受到了社区开发者的广泛关注和参与,出乎我们意料的是,看到了很多老朋友和新面孔的 PR 提交,有些人(点名 DrRyanHuang)嘴上说着「年后再说」,表情包做了不少,背地里 PR 也提了不少。

nianhouzaishuo

更为经典的是一名社区开发者 RedContritio 在除夕夜连着提了 18 个 PR,因为那个时间点大家都在欢度春节,没有人和他抢,导致他的 PR 编号都是连号的,由于 PR 质量过高,最后也顺利的全部完成了合入 ✅,给了我们一点小小的开源震撼

pullrequests

后来,快乐开源活动就顺理成章的成为了飞桨开源社区长期有效的日常活动,旨在通过简单易上手的开发任务,帮助开发者渐进的了解飞桨、参与开源。我们会按季度更新礼品清单、统计参与活动的开发者信息,并完成礼品邮寄。随着开发者参与热情越来越高,礼品也从游戏键盘、无线耳机升级到了 PS5、iPad、Apple Watch 等。

在 2023 年 Q4,快乐开源活动完成了一次全新升级 🔥,任务范围从 Paddle 框架扩展到科学计算 PaddleScience、大模型套件(PaddleMIX、PaddleNLP)、端到端开发套件(PaddleOCR、PaddleSeg、PaddleClas、PaddleDetection)、动转静孵化项目 PaddleSOT 等更多飞桨生态开源项目,上线「✨ 热身任务」、「🎯 命题任务」与「💡 开放任务」,使用「HappyOpenSource」 标签追踪相关的 issue 与 pr,我们确立了「 Grow Together, and Have Fun!」为口号,快乐开源活动逐渐做大做强~

更多信息可访问活动 issue 了解:https://github.com/PaddlePaddle/Paddle/issues/56689

7. 社区主导项目:Community over Code

Community over Code 是 Apache 软件基金会的项目中最广为人知的理念。尽管在社区的沟通方式上,跟 ASF 所鼓励的用邮件组来沟通不一样,飞桨社区的绝大部分沟通方式是在大家熟悉的微信群里,但从解决 「Good First Issue」 加入进来的社区开发者们, 在熟悉了社区之后,同样可以迸发更大的能量。

再来讲一个故事。

作为源自百度的开源项目,飞桨的运营团队通常可以接触到一些第三方办赛的邀请,这次找到我们的是第六届『中国软件开源创新大赛』,这是一个由中国计算机学会(CCF)主办,西北工业大学、绿色计算产业联盟、CCF 开源发展委员会联合承办的大型赛事,联合百度、清华大学等企业单位以及多所高校共同设置赛题,飞桨参与了『开源任务挑战赛』赛道,发布了 16 道具有一定难度的、需要参赛选手自行拆解与项目管理的开源任务。我们称其为 「HappyOpenSource Pro」 ,快乐开源进阶版。任务详情:飞桨框架任务挑战赛(上)飞桨框架任务挑战赛(下)

让我们惊喜的是,这些即使是内部研发团队都觉得棘手的开发任务,被一批高水平的开发者完美的解决了。以飞桨赛道一等奖项目:赛题五:将 xdoctest 引入到飞桨框架工作流中 为例,项目涉及修改 1400+ API,数十万行代码,24 位开发者近 3 个月协同工作,队长 megemini 成长为 Reviewer,800 万飞桨用户从中受益。

xdoctest-project

更多顺师傅的专访可以查看往期 blog:https://pfcc.blog/posts/shun-story

这件事情让我们愈发相信开源的力量,即使是如此历史包袱重、项目管理难、工程量巨大的开源任务,在找到合适的 owner,提供足够资源支持的情况下,都是有可能被社区开发者们联合解决的。

正在进行中的第五期飞桨黑客马拉松 PaddlePaddle Hackathon 5th,是飞桨开源社区一年两度的大型编程活动。

第五期活动发布三大赛道:开源贡献个人挑战赛、大模型应用与创意赛、飞桨护航计划集训营,上线当天即获得了开发者的广泛报名和参与,目前总体任务认领率 100%,核心框架任务提交率接近 90%,许多开发者直呼「卷出新高度」。

paddlepaddle-hackathon

由社区开发者 Tomoko-hjf 开发黑客松小助手,自动更新任务榜单与看板,极大提升了社区活动的自动管理水平。在护航计划集训营中,学员 MarioLulab 兼任助教,搭建开源项目用于管理开发进度与周报提交,欢迎大家前往围观 ➡️ PFCCLab/Camp

与此同时,配套直播课程经过多期打磨,已形成完整的飞桨开源贡献视频资料,并发布在星河社区课程专区 深度学习开发指南——黑客松 5.0 - 飞桨 AI Studio 星河社区-人工智能学习与实训社区,跟着飞桨导师,从这里开始你的黑客松之旅吧 💕

更多黑客松活动情况,可查看 blog:PaddlePaddle Hackathon Episode01PaddlePaddle Hackathon Episode02

8. 飞桨开源社区有哪些玩法

如果你正在寻找一个开源项目做贡献,或有意向加入一个开源组织 or 社区,我们非常欢迎你来飞桨开源社区玩,与我们一起执桨破浪,让深度学习技术的创新与应用更简单

你可以 follow 这样的路径:

社区活动

入门:快乐开源、启航计划

「快乐开源活动」 旨在鼓励更多的开发者参与到飞桨社区的开源建设中,帮助社区修复 bug 或贡献 feature,加入开源、共建飞桨。如果你是刚接触飞桨 or 开源社区的小白,我们十分推荐你从打卡任务开始:

  • 任务一:修改飞桨文档,完成你的第一个 PR,练习 git 操作,熟悉 GitHub 开源协作方式
  • 任务二:拉取 Paddle 代码,完成本地编译,让你对 Paddle 代码有更深入的理解,便于参与后续的框架开发任务
  • 任务三:在 PaddleMIX 中跑通 Stable-Diffusion 训练推理,你会快速掌握飞桨开发套件的使用,便于参与后续的套件开发任务

详情可查看 issue:https://github.com/PaddlePaddle/Paddle/issues/56689

「启航计划」飞桨社区 发起的远程项目,也是「护航计划」的前置活动(不了解护航计划请看这里 ➡️ 护航计划说明)。我们以集训营的形式,鼓励开发者积极参与快乐开源活动,以此提升自己的代码实践能力。你可以把它当做【HACKATHON 预备营】,在这里找到志同道合的小伙伴,一起开发,一起成长。

详情可查看 issue:https://github.com/PaddlePaddle/Paddle/issues/58497

进阶:黑客松、护航计划

「PaddlePaddle Hackathon 飞桨黑客马拉松」 是飞桨社区的大型编程活动,鼓励社区开发者了解与参与飞桨深度学习开源项目与文心大模型开发实践,为飞桨框架、套件、大模型、合作伙伴等生态进行开源贡献。适合具备一定开源贡献基础和代码基础的朋友前来挑战自我~~

第五期黑客松活动火热进行中,详情可查看 issue:

社区组织

技术交流组织:飞桨核心框架贡献者俱乐部 PFCC

PFCC,全称 Paddle Framework Contributor Club,飞桨核心框架贡献者俱乐部,是一个有兴趣、正在、或者已经为飞桨开源框架做开源贡献的贡献者成立的虚拟组织,在这里,飞桨开源框架的贡献者进行讨论、交流和分享,并为飞桨框架做出持续的贡献。

目前,PFCC 已汇聚 100+ Contributor,6 名贡献者成长为 Committer,维持双周一次技术分享会,累计召开 30+ 次,产生上百个议题(详见会议纪要),与飞桨产研团队探讨飞桨框架硬核技术难题,发起联合开发项目。

更多信息可前往社区查看:https://github.com/PaddlePaddle/community/tree/master/pfcc

社区治理组织:飞桨社区开源发展工作组 PPOSDWG

PPOSDWG,全称 PaddlePaddle OpenSource Development Working Group,飞桨社区开源发展工作组,为加强飞桨开源社区的透明治理,提升社区成员的参与感和社区认同,决策飞桨社区的关键事项与治理策略而成立。

2023 年 11 月 16 日,飞桨开源社区举行线上投票选举与成立仪式,39 名合格投票人完成投票,选举产生第一届工作组成员。

更多信息可前往社区查看:https://github.com/PaddlePaddle/community/tree/master/pposdwg

9. 写在最后

我们始终相信,开源社区因为人的汇聚而变得有意义。在这一年中,我们参与和见证了许许多多社区故事,为每一个精彩的 PR 鼓掌喝彩,为每一次「我们 paddle 如何如何」的句式感动,向每一位热爱开源的开发者和研发工程师致敬。

在飞桨开源社区,我们结识了许多有趣可爱的人,程序员不再是一个标签化 🏷 的群体。他们中,有「摸资本主义的鱼,建设社会主义框架」的 Intel 工程师 jinyouzhi,有社区 Committer 手搓框架入职百度的全栈 001 喵喵喵 SigureMo,有「水遍」所有开发任务群强势进入贡献者排行榜的 002 张师傅 Liyulingyue,有获得硬件伙伴高度称赞的 3w+ 部署代码贡献达人 Zheng-Bicheng,...,甚至还有五年级的小朋友 zhiheng-liu 刷新飞桨 Contributor 最小年龄记录。

因此我们萌生了创建这个 blog 网站的想法,由全栈工程师 001 搭建,代码开源在 GitHub,记录飞桨开源社区的故事,欢迎各位开发者投稿呀~~ https://pfcc.blog/

funny-memes

👆一些流传度很广的开发者自制表情包👆

「Shaping PaddlePaddle Future with You,与你一起定义飞桨的未来!」 从来不只是一句口号,就是在这日复一日的平凡生活中,在一行行代码的设计与运行里,在一次次前沿技术的交流与碰撞下,一些改变正在悄然发生。期待飞桨与你共同成长,让我们一起打造易用的深度学习框架与工具组件,在开源的世界走得更远!

',88),P=[c];function b(m,f,_,k,C,q){return r(),a("div",null,P)}const w=e(u,[["render",b]]);export{y as __pageData,w as default}; diff --git a/assets/posts_2023-os-report.md.CA_G4PCe.lean.js b/assets/posts_2023-os-report.md.CA_G4PCe.lean.js new file mode 100644 index 0000000..617553c --- /dev/null +++ b/assets/posts_2023-os-report.md.CA_G4PCe.lean.js @@ -0,0 +1 @@ +import{_ as e,c as a,o as r,l as t}from"./chunks/framework.CEb3mtFd.js";const o="/assets/3-3-individual-contributors.aY9Y6Qby.jpg",l="/assets/4-1-projects.CgY3HNnv.jpg",s="/assets/5-1-honours.DJKT6dKl.jpg",d="/assets/6-1-issues.BbL5Qc0u.jpg",n="/assets/6-2-nianhouzaishuo.qZiVLkTz.jpg",i="/assets/6-3-pullrequests.UoAleJ38.jpg",p="/assets/7-1-xdoctest-project.oqw0ghKZ.jpg",h="/assets/7-2-paddlepaddle-hackathon.CoasP8de.jpg",g="/assets/9-1-funny-memes.Cm8SrYal.jpg",y=JSON.parse('{"title":"飞桨开源社区成为国内 Top,我们做对了什么?","description":"","frontmatter":{"title":"飞桨开源社区成为国内 Top,我们做对了什么?","date":"2023-12-02T00:00:00.000Z","author":{"name":"梦师傅","github":"Ligoml"},"pinned":true},"headers":[],"relativePath":"posts/2023-os-report.md","filePath":"posts/2023-os-report.md"}'),u={name:"posts/2023-os-report.md"},c=t("",88),P=[c];function b(m,f,_,k,C,q){return r(),a("div",null,P)}const w=e(u,[["render",b]]);export{y as __pageData,w as default}; diff --git a/assets/posts_chengdu-kaiyuanshe.md.DFP35aMk.js b/assets/posts_chengdu-kaiyuanshe.md.DFP35aMk.js new file mode 100644 index 0000000..d196cf8 --- /dev/null +++ b/assets/posts_chengdu-kaiyuanshe.md.DFP35aMk.js @@ -0,0 +1 @@ +import{_ as e,c as t,o as a,l as r}from"./chunks/framework.CEb3mtFd.js";const s="/assets/chengdu-kaiyuanshe-01.D_gtc2JY.jpg",n="/assets/chengdu-kaiyuanshe-02.TIbUct4S.jpg",o="/assets/chengdu-kaiyuanshe-03.D9ILJX09.jpg",p="/assets/chengdu-kaiyuanshe-04.Buo76V4B.jpg",h="/assets/chengdu-kaiyuanshe-05.DdgzhQlp.jpg",i="/assets/chengdu-egg.BDf4-r8r.jpg",j=JSON.parse('{"title":"飞桨社区成都行:开源社活动与开发者线下 Meetup","description":"","frontmatter":{"title":"飞桨社区成都行:开源社活动与开发者线下 Meetup","date":"2023-11-02T00:00:00.000Z","author":{"name":"孙师傅","github":"sunzhongkai588"}},"headers":[],"relativePath":"posts/chengdu-kaiyuanshe.md","filePath":"posts/chengdu-kaiyuanshe.md"}'),c={name:"posts/chengdu-kaiyuanshe.md"},g=r('

2023 年 10 月 28 日、29 日参加开源社举办的「第八届中国开源年会」的精彩瞬间,以及与咱 Paddle 社区成都开发者们的线下见面~

第八届中国开源年会

飞桨开源社区受邀参加第八届中国开源年会,梦师傅和我(孙师傅)都贡献了两场精彩的演讲 🎉。

28 日的活动中,梦师傅在青少年开源与开源教育分论坛上,分享了主题为「走进开源社区」的演讲,向祖国的仙人掌们 🌵 宣传咱们充满趣味和活力的飞桨开源社区。

图片1

图片2

梦师傅还鼓励了很多青年开发者加入飞桨开源社区,其中甚至有一名刚年满 15 岁的初中学生,在活动后提交了 PR 并成功合入,成为了 Paddle 的 contributor @BernieHuang2008

29 日的主论坛上,孙师傅进行了闪电演讲,分享了「如何在开源社区摸 🐟」,介绍了孙师傅工作 0.5kun 年🐔 里总结的摸鱼心得。

图片3

演讲的详细内容将在后续的博客中分享,敬请期待~

飞桨社区成都开发者 Meetup

在 29 日,我们还相约飞桨社区成都的开发者们线下面基,以下是痛失真名的成都开发者(网友):

图片4

梦师傅还很贴心的给每位开发者赠送了 PaddlePaddle contributor 专属徽章 🥳。

图片5

期待未来与成都的伙伴们再次见面!

彩蛋 🎊

最后,我们还一起跟随军哥 @jzhang533 观看了一场外国小姐姐的 livehouse,很精彩哟!

图片6

',20),u=[g];function l(d,_,m,f,b,k){return a(),t("div",null,u)}const y=e(c,[["render",l]]);export{j as __pageData,y as default}; diff --git a/assets/posts_chengdu-kaiyuanshe.md.DFP35aMk.lean.js b/assets/posts_chengdu-kaiyuanshe.md.DFP35aMk.lean.js new file mode 100644 index 0000000..7d51d8e --- /dev/null +++ b/assets/posts_chengdu-kaiyuanshe.md.DFP35aMk.lean.js @@ -0,0 +1 @@ +import{_ as e,c as t,o as a,l as r}from"./chunks/framework.CEb3mtFd.js";const s="/assets/chengdu-kaiyuanshe-01.D_gtc2JY.jpg",n="/assets/chengdu-kaiyuanshe-02.TIbUct4S.jpg",o="/assets/chengdu-kaiyuanshe-03.D9ILJX09.jpg",p="/assets/chengdu-kaiyuanshe-04.Buo76V4B.jpg",h="/assets/chengdu-kaiyuanshe-05.DdgzhQlp.jpg",i="/assets/chengdu-egg.BDf4-r8r.jpg",j=JSON.parse('{"title":"飞桨社区成都行:开源社活动与开发者线下 Meetup","description":"","frontmatter":{"title":"飞桨社区成都行:开源社活动与开发者线下 Meetup","date":"2023-11-02T00:00:00.000Z","author":{"name":"孙师傅","github":"sunzhongkai588"}},"headers":[],"relativePath":"posts/chengdu-kaiyuanshe.md","filePath":"posts/chengdu-kaiyuanshe.md"}'),c={name:"posts/chengdu-kaiyuanshe.md"},g=r("",20),u=[g];function l(d,_,m,f,b,k){return a(),t("div",null,u)}const y=e(c,[["render",l]]);export{j as __pageData,y as default}; diff --git a/assets/posts_chuan-story.md.CznaerLd.js b/assets/posts_chuan-story.md.CznaerLd.js new file mode 100644 index 0000000..bf6d50e --- /dev/null +++ b/assets/posts_chuan-story.md.CznaerLd.js @@ -0,0 +1 @@ +import{M as r,_ as o}from"./chunks/MessageBox.BjkmF0_f.js";import{c as i,i as a,v as e,l as n,a as t,x as s,o as l}from"./chunks/framework.CEb3mtFd.js";const p="/assets/chuan-01.G-cxJRwy.jpg",g="/assets/chuan-02.qE5JSX5Y.jpg",h="/assets/chuan-03.NXP-Ww_V.jpg",u="/assets/chuan-04.prZsqaDd.jpg",c="/assets/chuan-05.CTY1_QPh.jpg",d="/assets/chuan-06.Scj6rPAw.jpg",_="/assets/chuan-07.DoP7Tkq4.jpg",f="/assets/chuan-08.0g__Lgih.jpg",m="/assets/chuan-09.o4wJxXln.jpg",b="/assets/chuan-10.CQs76eIH.jpg",P="/assets/chuan-11.B0MWhn9d.jpg",y="/assets/chuan-12.uS2sz8Vz.jpg",k="/assets/chuan-13.BzlKW8CG.jpg",S="/assets/chuan-14.B1YsXHnP.jpg",j="/assets/chuan-15.Dxfq_RNd.jpg",x="/assets/chuan-16.IkFqI2uB.jpg",q="/assets/chuan-17.BT7EnFZw.jpg",w=n('

“桨声川水悠悠过,长路漫漫风光留”,这次我们要采访的是小伙伴们都熟悉的励志富哥儿——川川师傅

一、前言

按川川要求,以下均以 🍢🍢 代称川川。

川川目前是一名平平无奇的大学生🧑‍🎓,也是 Paddle 社区里的一名资深开发者。他精通(🍢🍢: 我没有,不是,别瞎说🐶)Java、Python、C++ 等多门编程语言,还掌握 Flutter、Android、Vue 等工具,可谓多才多艺!

川川加入 Paddle 社区后,从最简单的文档修改任务开始,到参与快乐开源、熟悉 paddle 框架,到参与充满难度和挑战的护航计划,到最终自己能够独立的拆解问题、发起社区项目(ruff 升级),我们亲眼见证了他一步步的成长 (怎么有种养成系的感觉)

chuan-01

在提升自我外,川师傅也多次热心地帮助新伙伴们解决 bug、回答问题。(所以大家如果有问题,可以随时在群里骚扰他哦

chuan-02

然而当抛开“Paddle 社区开发者”“学生”等形象标签后,单独地看川师傅自身的人生经历,可谓是非常的励志。你敢相信,川师傅是从中专、大专一路读上来的吗?川师傅的经历像是一本精彩绝伦的探险故事集。接下来让我们来读读他的探险之旅吧!

chuan-03

!!!注意!!!上图为川川师傅の帅照,小伙伴们可以截图保存哦!😝😝😝😝

二、采访内容

  1. 介绍一下自己吧,川川师傅 o(_ ̄3 ̄)o !

    🍢🍢: 我的 AI Studio 账号是 gouzi,GitHub 的账号是 gouzil!o( ̄ε ̄_)o

  2. 作为一个 21 岁青春男大,平时有什么兴趣爱好?听说你喜欢出去玩,你在福建有什么推荐给大家打卡的景点么?哈哈~

    🍢🍢: 爱好当然是出去走走玩玩,感受一下人间烟火气。打卡的话当然是福建的省会厦门啦🐶,在十里长堤跟着男女朋友看看夕阳,鼓浪屿的小巷子。平潭岛也挺不错的(🍢🍢没去过但是朋友圈已经发爆了,图中为蓝眼泪时期,需要特定的季节,且肉眼看不出来这种效果,需要相机长曝光,大家别跑空咯)。

    厦门杏林大桥(来源: 川川相册)
    厦门杏林大桥(来源: 川川相册)
    十里长堤(来源: 川川相册)
    十里长堤(来源: 川川相册)
    鼓浪屿(来源:厦门文旅公众号)
    鼓浪屿(来源:厦门文旅公众号)
    平潭(来源: 新华社 2023/04/29 )
    平潭(来源: 新华社 2023/04/29 )
  3. 据我了解,你在初中时就用易语言写了个安卓 APP 给奶奶使用,你能详细讲讲这个 APP 的设计目的和功能么?你当时学习了些什么技术才把这个 APP 做成?那又是通过哪种方式(看书?上网学习?视频?)学习的呢?

    🍢🍢: 1️⃣ 其实设计这个 APP 是因为奶奶不识字,但是又需要使用手机(而正常手机打电话都是看人的名字进行拨打)。这个 APP 可以理解为一个默认桌面,手机解锁后 APP 就打开,打开后是像下图一样的手机联系人的照片,其实就是把联系人名字变成对应的他们的图片,这样尽管奶奶不识字,也可以看照片进行操作了!🐶 2️⃣ 当时学了啥技术: 其实也没具体的学,因为易语言是中文,有一定的思维逻辑就能实现啦。3️⃣ 通过哪种方式: 翻翻编译器自带的易语言说明(那时候 bilibili 还没有那么火,也没有啥书,只有一台能跑安卓模拟器的电脑)。

    chuan-08
  4. 在 16 岁左右,你就陆陆续续自学了 Python、Java、C,后来又自学了 Go、Android 等等,在这个自学过程中你遇到了那些困难,又有想过放弃么?

    🍢🍢: 遇到困难当然是有的,很难想象 C 我看了半年视频才学会的(有部分原因是我比较拖, 学习一门新的语言时长最好不要超过两周, 因为后续的项目会慢慢的补上来的)。每次接触一门新的语言都会对计算机有更深的理解,理解不同语言为什么要这么做,这么做的优缺点,这也是不断学习的动力吧。想过放弃么: 没有,我还挺感兴趣的,兴趣是最好的老师。

  5. 能简单聊聊你的这几年的学习经历么?

    🍢🍢: 下图最右侧那一列就是学习的顺序啦(学那么多真没啥用,学好一个精通它就行)。也没啥经验,顺其自然就好啦,等学完技术应该也更新了。最快的方式就是跟着项目走,不断的优化它 (最后就会发现:我写的什么玩意,要不要重构🐶) 。不过倒是有几个提升比较大的时间段,一个是去参加了云计算比赛,让我会了 linux 和 docker 这些。一个是实习的那一年,让我整明白了网站这一套(B/S,C/S)。

    chuan-09

  6. 现在社区开发者都认为你的编程能力很强,和学历形成了很大反差,能透露一下当时是为什么会上中专呢?是因为偏科吗?

    🍢🍢: 不是偏科啦,我差的很平均🐶。顺带说一下厦门的初升高录取率为 45%,现在好些了 50%,卷不动卷不动,当然更多是因为我比较菜。

  7. 事实上在目前的舆论环境里,“专科生”是一个很遭受非议的标签😮‍💨,而作为一个亲历者,你内心的是怎么面对的呢?你当时又做了哪些方面的努力?

    🍢🍢: 关于这个标签的话,我只想说:你说的对。没啥必要在乎别人的看法,做自己热爱的事情就好啦。

  8. 作为目前考上本科的计算机应用技术专业的学生,你对未来的职业发展有怎样的规划和期望✊✊✊?

    🍢🍢: 我更喜欢做一些底层的工作,不太喜欢做应用层。规划:入职百度,重构 paddle

  9. 作为厦门领航团的一员,你当时是什么契机接触 Paddle 社区的?在 Paddle 社区做的第一个开源项目是什么?

    🍢🍢: 说到这个契机啊,非常简单,你的上司是厦门领航团团长就行。第一个开源项目当然是我们孙师傅(@sunzhongkai588)的 docs 啦,当然非常感谢佳维姐姐(@dingjiaweiww)和梦师傅(@Ligoml)的鼓励和协助我完成了在 paddle 的第一个 pr。

  10. 在社区里如何和其他开发者进行互动的?有没有什么特别有意思的经历或故事?

    🍢🍢: 我一般有碰上问题就出来回答啦,或者一些技术讨论。特别的故事:五年级的小朋友叫我叔叔算嘛

    chuan-10

  11. 对于 Paddle 框架护航计划,可以分享一下你的面试经历和感受吗?你觉得到达什么水平可以通过护航计划的面试?

    🍢🍢: 经历的话,放心研发大哥不会难为你的,真诚就行。感受 emmm,大家一定要提前准备啊,刷刷算法什么的。什么水平 emmm,我也不太清楚,但是最好是熟悉 padlle,或者你的能力超级无敌强。

    编者注✍️:「护航计划」可以简单理解为飞桨的远程实习项目,可参考 护航计划集训营说明

  12. 参与护航计划时,有什么不一样的感受吗?实际开发过程有没有遇到困难,是怎么解决的?

    🍢🍢: 最大的感受就是,终于从应用层转向了框架层。困难是肯定有的,也有非常多不会的,但是这没关系,问研发大哥就行。就像昆昆(@2742195759)说的: 你尽管问,我就是你的文档。

  13. 在 Paddle 社区中,你参与的哪个项目(或活动)你印象最深刻,能简单描述一下这个项目么?这个项目让你收获了什么?

    🍢🍢: 印象最深的项目是下一个项目,下一个项目可以把之前项目的经验集结起来,也可以学到一些新的知识。当然 PaddleSOT 印象也挺深的,这也是我护航计划的项目。收获更多的是技术的进步吧。有时候看看喵喵(@SigureMo)的修改会发现,噢原来还能这么写。

    chuan-11

  14. 对于深度学习领域,你有哪些想法和研究方向?目前有没有感兴趣的方向?

    🍢🍢: 我其实更多的还是喜欢框架层,怎样才能让整个框架跑的更快,占用更低,更加的易用化。

  15. 发挥一下想象力,如果将深度学习比作一种食物,你觉得它会是什么?为什么?

    🍢🍢: 可能是米饭吧,喂的越多越有力气,跑的越快,力大砖飞。

  16. 听说你使用飞桨解决过很多企业实际问题时,你遇到过最有趣的案例是什么?那么你是如何应用深度学习技术解决这个问题的?

    🍢🍢: 我实习这个企业吧,他刚尝试深度学习,所以一般调调 API 就行了,更多的是怎样去分配资源,做到效率最大化 (我司全是 1050 的卡,我能咋办,我也很绝望啊)

  17. 除了深度学习,你还对其他领域感兴趣吗?有没有想过将深度学习与其他领域结合,创造出一些令人惊喜的应用?

    🍢🍢: 其他领域其实有的,比如摄影和游戏,结合的话有想过,但是还没新建文件夹就不说了🐶

  18. 如果你有机会和 Paddle 社区 or 深度学习领域 or 计算机领域 的一位顶级专家进行合作,你希望和他/她一起研究什么问题?为什么?

    🍢🍢: 这可就太多了,比如:不同语言的通信,怎么做到程序的相对安全,怎样去减少硬件之间的瓶颈。为什么 emmm,可能是因为自己对这方面感兴趣吧。

  19. 如果让你形容一下你和 Paddle 社区的关系,你会怎么说?

    🍢🍢: 相互促进,互相成就(更多还是 paddle 社区的大佬单方面带着我)

  20. 最后,作为一个热情、励志的年轻人,你想对 Paddle 社区里的开源者们说些什么呢?

    🍢🍢: 放开那道题,让我来🐶

三、“鲁迅之我确实说过这话”专区

同样我们也邀请了一些和川川很熟悉的、有过合作经历的朋友们,贡献一下和川师傅相关的故事,或者他们对川师傅的评价~以下均为真心话,请放心看!

chuan-12

by 散步(sanbuphy

',17),T=t("h3",{id:"by-卢师傅-andsonder",tabindex:"-1"},[s("by 卢师傅("),t("a",{href:"https://github.com/AndSonder",target:"_blank",rel:"noreferrer"},"AndSonder"),s(") "),t("a",{class:"header-anchor",href:"#by-卢师傅-andsonder","aria-label":'Permalink to "by 卢师傅([AndSonder](https://github.com/AndSonder))"'},"​")],-1),A=t("blockquote",null,[t("p",null,"编者注✍️:迪迪小组是上海 meetup 期间,相约去迪士尼玩的小分队")],-1),v=t("h3",{id:"by-一师傅-siguremo",tabindex:"-1"},[s("by 一师傅("),t("a",{href:"https://github.com/SigureMo",target:"_blank",rel:"noreferrer"},"SigureMo"),s(") "),t("a",{class:"header-anchor",href:"#by-一师傅-siguremo","aria-label":'Permalink to "by 一师傅([SigureMo](https://github.com/SigureMo))"'},"​")],-1),C=t("br",null,null,-1),V=t("br",null,null,-1),z=t("h3",{id:"by-花花-tulip-hua",tabindex:"-1"},[s("by 花花("),t("a",{href:"https://github.com/Tulip-hua",target:"_blank",rel:"noreferrer"},"Tulip-hua"),s(") "),t("a",{class:"header-anchor",href:"#by-花花-tulip-hua","aria-label":'Permalink to "by 花花([Tulip-hua](https://github.com/Tulip-hua))"'},"​")],-1),B=t("h2",{id:"四、特别栏目——爱在何方之川川相亲帖",tabindex:"-1"},[s("四、特别栏目——爱在何方之川川相亲帖 "),t("a",{class:"header-anchor",href:"#四、特别栏目——爱在何方之川川相亲帖","aria-label":'Permalink to "四、特别栏目——爱在何方之川川相亲帖"'},"​")],-1),M=t("p",null,"接下来,有请男嘉宾——小富哥儿川川来进行一段自我介绍✨。",-1),I=n('

有意者,请扫码加入快乐开源群,联系川川师傅(找头像即可)。

chuan-13

彩蛋 🥚

最后让我们欣赏一下川大摄影师的大作吧 📷

北京 798 艺术区
北京 798 艺术区
福州三江口大桥
福州三江口大桥
福州烟台山
福州烟台山
厦门中医院附近
厦门中医院附近

写在最后 💡

【开源江湖闲聊录】 是一项专门为 Paddle 社区的开发者打造的特色访谈栏目📚。在这里,我们邀请到每一位别具一格且富有热情的开发者,通过文字或语音的方式进行深入采访 🎙️,探索并展现他们背后独一无二的故事,将他们的经历、见解和创意整理成精彩内容,呈现给整个社区。


',11),G=JSON.parse('{"title":"【开源江湖闲聊录】英雄不问出处:川师傅的逆袭之路","description":"","frontmatter":{"title":"【开源江湖闲聊录】英雄不问出处:川师傅的逆袭之路","date":"2023-11-28T00:00:00.000Z","author":{"name":"孙钟恺","github":"sunzhongkai588"},"co_authors":[{"name":"文潇","github":"wenxiaohahaha"},{"name":"田川(川川)","github":"gouzil"}]},"headers":[],"relativePath":"posts/chuan-story.md","filePath":"posts/chuan-story.md"}'),N={name:"posts/chuan-story.md"},X=Object.assign(N,{setup(R){return(D,J)=>(l(),i("div",null,[w,a(r,null,{default:e(()=>[a(o,{name:"散佬",github:"sanbuphy"},{default:e(()=>[s(" 和川川交流还算比较多,川川基本上有空都会帮你解决任何疑问,甚至是看代码。虽然是年轻的富哥,但很努力上进,甚至比孙师傅还努力🐶;总体来说算很善良的小哥,教过我很多东西。希望能和他一起学习成长,向他多学习请教一些代码之道,早日都一起为中国开源社区多做一些更有价值的事情。 在我无数个老师中,他肯定是我印象深刻的老师之一。 ")]),_:1})]),_:1}),T,a(r,null,{default:e(()=>[a(o,{name:"卢畅",github:"AndSonder"},{default:e(()=>[s(" 有幸在今年暑期上海 meetup 上认识了川师傅,很低调的技术大佬。在川师傅身上能看到对开源活动的热情,各大活动上都能看到川师傅的身影。希望以后还有机会和川师傅线下面基,迪迪小组再次出发! ")]),_:1})]),_:1}),A,v,a(r,null,{default:e(()=>[a(o,{name:"喵喵",github:"SigureMo"},{default:e(()=>[s(" 自川子参与第一期护航计划开始已经马上就要 6 个月了,我和川子也算是深度交流了 6 个月。从护航计划来看,川子始终保持十足的热情,在 PaddleSOT 那时候还是以开源任务的形式发放,但每次有任务川子都会第一时间认领。之后到现在动转静单测推全,我的 review 速度都赶不上川子提 PR 的速度了……此外川子涉猎甚广,在交流的过程中我也学到了很多东西,川子也会参加各种开源任务,你基本上可以在任何「角落」里看到川子的身影~ "),C,s(" 川子这 6 个月也是成长了很多,从早期每个任务都需要细致沟通到现在发完任务基本就心照不宣了,也能独立完成很多任务了。比如 Ruff 的升级优化,目前川子对 Ruff 的了解程度已经仅次于我了,再比如 OpResult 方法的 patch 补全,以及动转静单测机制,基本都是川子独立完成的。对于大多数任务,现在我已经能放心地说:「川子,这个就交给你了」 "),V,s(" 另外,「提前」说一下,川子贼有钱~ ")]),_:1})]),_:1}),z,a(r,null,{default:e(()=>[a(o,{name:"花花",github:"Tulip-hua"},{default:e(()=>[s(" 我愿称川川为飞桨开源社区小天使 ")]),_:1})]),_:1}),B,M,a(r,null,{default:e(()=>[a(o,{name:"🍢🍢",github:"gouzil"},{default:e(()=>[s(" 报菜名环节,身高179cm,体重65kg(±5kg),来自福建厦门,2002年出生,目前在福州读书,不抽烟,不喝酒。性格有点太温柔了,不太凶得起来。对陌生人有点社恐,熟悉了之后就好很多。有一点点宅,但不会非常宅,还是会出去走走(不然咋拍照片🐶)。有一点点强迫症,比如下面这张798的照片好像有点歪了。喔对了川川不会做饭。期望伴侣,可以稍微e一点,拉着我出去玩🐶。(🍢🍢: 咱就是说还有几个月才到22,也不至于这么着急吧🐶) ")]),_:1})]),_:1}),I]))}});export{G as __pageData,X as default}; diff --git a/assets/posts_chuan-story.md.CznaerLd.lean.js b/assets/posts_chuan-story.md.CznaerLd.lean.js new file mode 100644 index 0000000..4edce47 --- /dev/null +++ b/assets/posts_chuan-story.md.CznaerLd.lean.js @@ -0,0 +1 @@ +import{M as r,_ as o}from"./chunks/MessageBox.BjkmF0_f.js";import{c as i,i as a,v as e,l as n,a as t,x as s,o as l}from"./chunks/framework.CEb3mtFd.js";const p="/assets/chuan-01.G-cxJRwy.jpg",g="/assets/chuan-02.qE5JSX5Y.jpg",h="/assets/chuan-03.NXP-Ww_V.jpg",u="/assets/chuan-04.prZsqaDd.jpg",c="/assets/chuan-05.CTY1_QPh.jpg",d="/assets/chuan-06.Scj6rPAw.jpg",_="/assets/chuan-07.DoP7Tkq4.jpg",f="/assets/chuan-08.0g__Lgih.jpg",m="/assets/chuan-09.o4wJxXln.jpg",b="/assets/chuan-10.CQs76eIH.jpg",P="/assets/chuan-11.B0MWhn9d.jpg",y="/assets/chuan-12.uS2sz8Vz.jpg",k="/assets/chuan-13.BzlKW8CG.jpg",S="/assets/chuan-14.B1YsXHnP.jpg",j="/assets/chuan-15.Dxfq_RNd.jpg",x="/assets/chuan-16.IkFqI2uB.jpg",q="/assets/chuan-17.BT7EnFZw.jpg",w=n("",17),T=t("h3",{id:"by-卢师傅-andsonder",tabindex:"-1"},[s("by 卢师傅("),t("a",{href:"https://github.com/AndSonder",target:"_blank",rel:"noreferrer"},"AndSonder"),s(") "),t("a",{class:"header-anchor",href:"#by-卢师傅-andsonder","aria-label":'Permalink to "by 卢师傅([AndSonder](https://github.com/AndSonder))"'},"​")],-1),A=t("blockquote",null,[t("p",null,"编者注✍️:迪迪小组是上海 meetup 期间,相约去迪士尼玩的小分队")],-1),v=t("h3",{id:"by-一师傅-siguremo",tabindex:"-1"},[s("by 一师傅("),t("a",{href:"https://github.com/SigureMo",target:"_blank",rel:"noreferrer"},"SigureMo"),s(") "),t("a",{class:"header-anchor",href:"#by-一师傅-siguremo","aria-label":'Permalink to "by 一师傅([SigureMo](https://github.com/SigureMo))"'},"​")],-1),C=t("br",null,null,-1),V=t("br",null,null,-1),z=t("h3",{id:"by-花花-tulip-hua",tabindex:"-1"},[s("by 花花("),t("a",{href:"https://github.com/Tulip-hua",target:"_blank",rel:"noreferrer"},"Tulip-hua"),s(") "),t("a",{class:"header-anchor",href:"#by-花花-tulip-hua","aria-label":'Permalink to "by 花花([Tulip-hua](https://github.com/Tulip-hua))"'},"​")],-1),B=t("h2",{id:"四、特别栏目——爱在何方之川川相亲帖",tabindex:"-1"},[s("四、特别栏目——爱在何方之川川相亲帖 "),t("a",{class:"header-anchor",href:"#四、特别栏目——爱在何方之川川相亲帖","aria-label":'Permalink to "四、特别栏目——爱在何方之川川相亲帖"'},"​")],-1),M=t("p",null,"接下来,有请男嘉宾——小富哥儿川川来进行一段自我介绍✨。",-1),I=n("",11),G=JSON.parse('{"title":"【开源江湖闲聊录】英雄不问出处:川师傅的逆袭之路","description":"","frontmatter":{"title":"【开源江湖闲聊录】英雄不问出处:川师傅的逆袭之路","date":"2023-11-28T00:00:00.000Z","author":{"name":"孙钟恺","github":"sunzhongkai588"},"co_authors":[{"name":"文潇","github":"wenxiaohahaha"},{"name":"田川(川川)","github":"gouzil"}]},"headers":[],"relativePath":"posts/chuan-story.md","filePath":"posts/chuan-story.md"}'),N={name:"posts/chuan-story.md"},X=Object.assign(N,{setup(R){return(D,J)=>(l(),i("div",null,[w,a(r,null,{default:e(()=>[a(o,{name:"散佬",github:"sanbuphy"},{default:e(()=>[s(" 和川川交流还算比较多,川川基本上有空都会帮你解决任何疑问,甚至是看代码。虽然是年轻的富哥,但很努力上进,甚至比孙师傅还努力🐶;总体来说算很善良的小哥,教过我很多东西。希望能和他一起学习成长,向他多学习请教一些代码之道,早日都一起为中国开源社区多做一些更有价值的事情。 在我无数个老师中,他肯定是我印象深刻的老师之一。 ")]),_:1})]),_:1}),T,a(r,null,{default:e(()=>[a(o,{name:"卢畅",github:"AndSonder"},{default:e(()=>[s(" 有幸在今年暑期上海 meetup 上认识了川师傅,很低调的技术大佬。在川师傅身上能看到对开源活动的热情,各大活动上都能看到川师傅的身影。希望以后还有机会和川师傅线下面基,迪迪小组再次出发! ")]),_:1})]),_:1}),A,v,a(r,null,{default:e(()=>[a(o,{name:"喵喵",github:"SigureMo"},{default:e(()=>[s(" 自川子参与第一期护航计划开始已经马上就要 6 个月了,我和川子也算是深度交流了 6 个月。从护航计划来看,川子始终保持十足的热情,在 PaddleSOT 那时候还是以开源任务的形式发放,但每次有任务川子都会第一时间认领。之后到现在动转静单测推全,我的 review 速度都赶不上川子提 PR 的速度了……此外川子涉猎甚广,在交流的过程中我也学到了很多东西,川子也会参加各种开源任务,你基本上可以在任何「角落」里看到川子的身影~ "),C,s(" 川子这 6 个月也是成长了很多,从早期每个任务都需要细致沟通到现在发完任务基本就心照不宣了,也能独立完成很多任务了。比如 Ruff 的升级优化,目前川子对 Ruff 的了解程度已经仅次于我了,再比如 OpResult 方法的 patch 补全,以及动转静单测机制,基本都是川子独立完成的。对于大多数任务,现在我已经能放心地说:「川子,这个就交给你了」 "),V,s(" 另外,「提前」说一下,川子贼有钱~ ")]),_:1})]),_:1}),z,a(r,null,{default:e(()=>[a(o,{name:"花花",github:"Tulip-hua"},{default:e(()=>[s(" 我愿称川川为飞桨开源社区小天使 ")]),_:1})]),_:1}),B,M,a(r,null,{default:e(()=>[a(o,{name:"🍢🍢",github:"gouzil"},{default:e(()=>[s(" 报菜名环节,身高179cm,体重65kg(±5kg),来自福建厦门,2002年出生,目前在福州读书,不抽烟,不喝酒。性格有点太温柔了,不太凶得起来。对陌生人有点社恐,熟悉了之后就好很多。有一点点宅,但不会非常宅,还是会出去走走(不然咋拍照片🐶)。有一点点强迫症,比如下面这张798的照片好像有点歪了。喔对了川川不会做饭。期望伴侣,可以稍微e一点,拉着我出去玩🐶。(🍢🍢: 咱就是说还有几个月才到22,也不至于这么着急吧🐶) ")]),_:1})]),_:1}),I]))}});export{G as __pageData,X as default}; diff --git a/assets/posts_first-post.md.BETAI2jl.js b/assets/posts_first-post.md.BETAI2jl.js new file mode 100644 index 0000000..ce77562 --- /dev/null +++ b/assets/posts_first-post.md.BETAI2jl.js @@ -0,0 +1 @@ +import{_ as s}from"./chunks/first-post.CGto_Bts.js";import{_ as o,c as r,o as a,a as t,x as e}from"./chunks/framework.CEb3mtFd.js";const P=JSON.parse('{"title":"在这里,记录有趣的飞桨开源社区故事!","description":"","frontmatter":{"title":"在这里,记录有趣的飞桨开源社区故事!","date":"2023-10-24T00:00:00.000Z","author":{"name":"Nyakku Shigure","github":"SigureMo"}},"headers":[],"relativePath":"posts/first-post.md","filePath":"posts/first-post.md"}'),i={name:"posts/first-post.md"},l=t("p",null,[e("这是一个半官方的飞桨开源社区博客,由社区成员自发维护,记录社区的有趣的故事,欢迎大家投稿。投稿方式:在 "),t("a",{href:"https://github.com/PFCCLab/blog",target:"_blank",rel:"noreferrer"},"blog"),e(" 代码仓库里提交 PullRequest 即可,Pull Request 会自动触发 CI,CI 通过后,你的文章就会被自动发布到这里。")],-1),n=t("p",null,[e("感谢 001 "),t("a",{href:"https://github.com/SigureMo",target:"_blank",rel:"noreferrer"},"@SigureMo"),e(" 帮忙搭建了这个博客。")],-1),c=t("p",null,[t("img",{src:s,alt:"first-blog"})],-1),p=[l,n,c];function _(u,f,d,h,m,g){return a(),r("div",null,p)}const x=o(i,[["render",_]]);export{P as __pageData,x as default}; diff --git a/assets/posts_first-post.md.BETAI2jl.lean.js b/assets/posts_first-post.md.BETAI2jl.lean.js new file mode 100644 index 0000000..ce77562 --- /dev/null +++ b/assets/posts_first-post.md.BETAI2jl.lean.js @@ -0,0 +1 @@ +import{_ as s}from"./chunks/first-post.CGto_Bts.js";import{_ as o,c as r,o as a,a as t,x as e}from"./chunks/framework.CEb3mtFd.js";const P=JSON.parse('{"title":"在这里,记录有趣的飞桨开源社区故事!","description":"","frontmatter":{"title":"在这里,记录有趣的飞桨开源社区故事!","date":"2023-10-24T00:00:00.000Z","author":{"name":"Nyakku Shigure","github":"SigureMo"}},"headers":[],"relativePath":"posts/first-post.md","filePath":"posts/first-post.md"}'),i={name:"posts/first-post.md"},l=t("p",null,[e("这是一个半官方的飞桨开源社区博客,由社区成员自发维护,记录社区的有趣的故事,欢迎大家投稿。投稿方式:在 "),t("a",{href:"https://github.com/PFCCLab/blog",target:"_blank",rel:"noreferrer"},"blog"),e(" 代码仓库里提交 PullRequest 即可,Pull Request 会自动触发 CI,CI 通过后,你的文章就会被自动发布到这里。")],-1),n=t("p",null,[e("感谢 001 "),t("a",{href:"https://github.com/SigureMo",target:"_blank",rel:"noreferrer"},"@SigureMo"),e(" 帮忙搭建了这个博客。")],-1),c=t("p",null,[t("img",{src:s,alt:"first-blog"})],-1),p=[l,n,c];function _(u,f,d,h,m,g){return a(),r("div",null,p)}const x=o(i,[["render",_]]);export{P as __pageData,x as default}; diff --git a/assets/posts_hackathon-5th-episode01.md.CxQNsjlT.js b/assets/posts_hackathon-5th-episode01.md.CxQNsjlT.js new file mode 100644 index 0000000..a7cdf27 --- /dev/null +++ b/assets/posts_hackathon-5th-episode01.md.CxQNsjlT.js @@ -0,0 +1 @@ +import{_ as t,c as e,o as d,l as a}from"./chunks/framework.CEb3mtFd.js";const g=JSON.parse('{"title":"PaddlePaddle Hackathon Episode 01 | 第五期活动上线 4 周,直播圆满收官,三大赛道进展顺利","description":"","frontmatter":{"title":"PaddlePaddle Hackathon Episode 01 | 第五期活动上线 4 周,直播圆满收官,三大赛道进展顺利","date":"2023-11-03T00:00:00.000Z","author":{"name":"梦师傅","github":"Ligoml"},"co_authors":[{"name":"花花","github":"Tulip-hua"}]},"headers":[],"relativePath":"posts/hackathon-5th-episode01.md","filePath":"posts/hackathon-5th-episode01.md"}'),E={name:"posts/hackathon-5th-episode01.md"},r=a('

向大家快速介绍飞桨黑客松第五期活动上线以来的进展(9.25-11.3)

为了吸引社区开发者了解与参与飞桨深度学习开源项目与文心大模型开发实践,为飞桨框架、套件、大模型、合作伙伴等生态进行开源贡献,进一步扩大飞桨开源生态与文心大模型应用生态,我们组织了 PaddlePaddle Hackathon 飞桨黑客松第五期活动。活动开展 4 周的进展速览如下:

  • 开源贡献个人挑战赛:发布 111 个开源贡献任务,包括框架、科学计算、套件和合作伙伴方向,与 OpenVINO™、海光、Arm、高通、Zilliz、开放麒麟社区、9#AISoft 等合作项目共同出品,109 个任务完成认领,60 个任务提交作品,13 个任务已经完成,感谢各位开发者的积极参与,感谢各位导师的及时 review。
  • 大模型应用与创意赛:作为飞桨星河社区五周年预热活动,目标挖掘优质文心一言应用,共发布趣味创意与生产力工具 2 个方向的任务,已有 12 名开发者产出基于 EB SDK 的应用 18 个,均已部署至飞桨星河社区
  • 飞桨护航计划集训营:发布 18 个框架与套件开发项目,1 对 1 带教形式,已完成 18 名学员招募,并提交第一期周报,是飞桨开源社区首次 Code Camp 形式的开源活动,由开发者担任助教

赛道一:开源贡献个人挑战赛

进度看板

任务方向任务数量提交作品 / 任务认领提交率完成完成率
热身赛117 / 1163.64%218.18%
框架 API 开发任务3122 / 3170.97%13.23%
框架其他开发任务1614 / 1687.5%637.5%
科学计算模型复现117 / 1163.64%19.09%
套件开发任务245 / 2320.83%28.33%
合作伙伴任务185 / 1727.78%15.56%

赛道亮点

  • 社区开发者参与热情高,活动发布 1 周认领率接近 100%,提交率 50%+;
  • Tomoko-hjf 开发黑客松小助手,自动更新任务榜单与看板,提升社区活动自动化水平;
  • 直播活动圆满收官,已形成完整的飞桨开源贡献视频资料,详见 issues#58125
  • 本次活动英特尔作为赞助方,并与 OpenVINO™、海光、Arm、高通、Zilliz、开放麒麟社区、9#AISoft 等合作项目共同出品。

参与提示

  • 在上面的看板中能看出来,套件开发任务和合作伙伴开发任务,提交率相对较低,欢迎社区的开发者选择这些任务来挑战~~

更多详情请查看 issue:https://github.com/PaddlePaddle/Paddle/issues/57262

赛道二: 大模型应用与创意赛

我们收到了 127 人报名,提交了 18 个应用,加精项目 10 个。

赛道亮点

  • 全新赛道,作为飞桨星河社区五周年预热活动,推广重点产品星河社区 ERNIE Bot SDK;
  • 完成情况符合预期,上线 4 周即提交 18 个 EB SDK 应用,作品种类多样,涵盖游戏娱乐、办公助手、知识科普等多领域,符合赛道初衷;
  • 社群气氛活跃,新老选手积极交流,且建立了沟通产研的 EB SDK 反馈文档。

参与提示

  • 欢迎大家继续发挥创意,提交更多有趣的应用。

更多详情请查看 issue:https://github.com/PaddlePaddle/Paddle/issues/57585

赛道三:飞桨护航计划集训营

18 个任务已全部完成招募,名单公示如下:

项目编号开源贡献 repo项目标题&介绍(点击链接跳转)导师学员
1Paddle算子规范和 ProgramTranslator 功能优化@kangguangli@xingmingyyj
2Paddle新 IR Pass 建设和依赖的核心组件完善@zyfncg@zhangyuqin1998
3Paddle新 IR API + 自动微分推全和核心组件完善@Aurelius84@MarioLulab
4Paddle组合机制前反向架构统一@cyber-pioneer@kevincheng2
5Paddle算子支持复数计算专项@GGBond8488@zyt1024
6Paddle量化算子集成@RichardWooSJTU@Wanglongzhi2001
7Paddle开源模型加速复现@xiaoxiaohehe001@DanGuge
8PaddleCPU 融合算子 / GPU 算子融合 pass@yuanlehome@Xinyu302
9Paddle动态图半自动并行架构研发@LiYuRio@HermitSun
10Paddle静态图半自动并行执行架构升级@From00@AndSonder
11Paddle分布式能力矩阵建设@zhangting2020@SecretXV
12Paddle全自动并行架构升级@Caozhou1995@Corle-hyz
13PaddleScience科学计算领域拓展专项@HydrogenSulfate@xusuyong
14PaddleClasClas 套件全流程建设@cuicheng01@psky1111
15Paddle3D3D 方向模型全流程建设@juncaipeng@kongdebug
16PaddleOCRNougat 复现及优化@tink2123@Frida-a
17PaddleNLPNLP 大模型复现@w5688414@rampage0303
18PaddleSlim套件压缩能力建设@shiyutang@ranchongzhi

集训营亮点

  • 飞桨社区首次以 Code Camp 的形式招募远程开发者,吸引到很多新人,2 周时间迅速完成学员招募与开营仪式;
  • 学员 MarioLulab 兼任助教,搭建开源项目 PFCCLab/Camp 管理开发进度与周报提交,已完成第一期,周报详见 [WeeklyReports] 2023.10.10~2023.10.24
  • 搭建技术分享平台:每周一次源码解读,顺利完成第一期,分享人 DrRyanHuang

参与提示

  • 欢迎大家到代码仓库: Camp 里围观集训营的同学们的工作。

更多详情请查看 issue:https://github.com/PaddlePaddle/Paddle/issues/57264

活动运营与推广

联合宣传

与开源中国、启智、OpenVINO、思否、开源社、示说、InfoQ、白玉兰开源、开源之夏等合作伙伴以及海光、Arm、高通、Zilliz、开放麒麟社区、9#AISoft 等合作项目联合宣传。

直播

多平台同步直播,10 场直播共计约 1.4 万人次观看,直播信息与学习资料已发布在开源社区,并整理成 AI Studio 专题课程: 深度学习开发指南——黑客松 5.0 - 飞桨 AI Studio 星河社区-人工智能学习与实训社区

日期主题观看总人次
10.16(周一)第五期飞桨黑客松来啦!1956
10.17(周二)新 IR Python API 适配升级967
10.18(周三)模型复现和贡献指南975
10.19(周四)OpenVINO 开源生态建设与贡献任务解析884
10.20(周五)动转静全套件适配任务989
10.23(周一)Arm 虚拟硬件助力边缘人工智能软件开发1887
10.27(周五)跨平台推理框架 InfiniTensor2049
10.30(周一)拓展 LLM 边界:使用向量数据库构建知识库2193
10.31(周二)Paddle 框架在昇腾平台上的推理优化分享1097
11.1(周三)飞桨硬件生态伙伴任务介绍420
',32),l=[r];function A(h,n,o,i,s,B){return d(),e("div",null,l)}const m=t(E,[["render",A]]);export{g as __pageData,m as default}; diff --git a/assets/posts_hackathon-5th-episode01.md.CxQNsjlT.lean.js b/assets/posts_hackathon-5th-episode01.md.CxQNsjlT.lean.js new file mode 100644 index 0000000..ef488af --- /dev/null +++ b/assets/posts_hackathon-5th-episode01.md.CxQNsjlT.lean.js @@ -0,0 +1 @@ +import{_ as t,c as e,o as d,l as a}from"./chunks/framework.CEb3mtFd.js";const g=JSON.parse('{"title":"PaddlePaddle Hackathon Episode 01 | 第五期活动上线 4 周,直播圆满收官,三大赛道进展顺利","description":"","frontmatter":{"title":"PaddlePaddle Hackathon Episode 01 | 第五期活动上线 4 周,直播圆满收官,三大赛道进展顺利","date":"2023-11-03T00:00:00.000Z","author":{"name":"梦师傅","github":"Ligoml"},"co_authors":[{"name":"花花","github":"Tulip-hua"}]},"headers":[],"relativePath":"posts/hackathon-5th-episode01.md","filePath":"posts/hackathon-5th-episode01.md"}'),E={name:"posts/hackathon-5th-episode01.md"},r=a("",32),l=[r];function A(h,n,o,i,s,B){return d(),e("div",null,l)}const m=t(E,[["render",A]]);export{g as __pageData,m as default}; diff --git a/assets/posts_hackathon-5th-episode02.md.BhLuUEr6.js b/assets/posts_hackathon-5th-episode02.md.BhLuUEr6.js new file mode 100644 index 0000000..08a2611 --- /dev/null +++ b/assets/posts_hackathon-5th-episode02.md.BhLuUEr6.js @@ -0,0 +1 @@ +import{_ as t,c as e,o as a,l as r}from"./chunks/framework.CEb3mtFd.js";const l="/assets/pp-coffee.B6ybez7E.jpeg",m=JSON.parse('{"title":"PaddlePaddle Hackathon Episode 02 | 第五期活动上线 8 周,框架赛道提交率近 90%","description":"","frontmatter":{"title":"PaddlePaddle Hackathon Episode 02 | 第五期活动上线 8 周,框架赛道提交率近 90%","date":"2023-12-01T00:00:00.000Z","author":{"name":"梦师傅","github":"Ligoml"},"co_authors":[{"name":"花花","github":"Tulip-hua"}]},"headers":[],"relativePath":"posts/hackathon-5th-episode02.md","filePath":"posts/hackathon-5th-episode02.md"}'),n={name:"posts/hackathon-5th-episode02.md"},d=r('

向大家快速介绍飞桨黑客松第五期开展以来的进展(11.4-12.1)

为了吸引社区开发者了解与参与飞桨深度学习开源项目与文心大模型开发实践,为飞桨框架、套件、大模型、合作伙伴等生态进行开源贡献,进一步扩大飞桨开源生态与文心大模型应用生态,我们组织了 PaddlePaddle Hackathon 飞桨黑客松第五期活动。活动开展 8 周的进展速览如下:

  • 开源贡献个人挑战赛:发布 110 个开源贡献任务,包括框架、科学计算、套件和合作伙伴方向,与 OpenVINO™、海光、Arm、高通、Zilliz、开放麒麟社区、9#AISoft 等合作项目共同出品,全部任务完成认领,72 个任务提交作品,32 个任务已经完成,框架方向提交率近 90%,科学计算方向提交率 70%+,进展超出预期,感谢各位开发者的积极参与,感谢各位导师的及时 review。
  • 大模型应用与创意赛:作为飞桨星河社区五周年预热活动,目标挖掘优质文心一言应用,共发布趣味创意与生产力工具 2 个方向的任务,已有 22 名开发者产出基于 EB SDK 的应用 34 个,均已部署至应用中心
  • 飞桨护航计划集训营:共有 22 名社区开源开发者在社区导师的指导下,进行飞桨开源项目开发。 按期完成了两期双周报提交,完成了 3 期技术分享,成果全部沉淀到开源社区

赛道一:开源贡献个人挑战赛

进度看板

任务方向任务数量提交作品 / 任务认领提交率完成完成率
热身赛1110 / 1190.91%436.36%
框架 API 开发任务3128 / 3190.32%619.35%
框架其他开发任务1615 / 1693.75%1381.25%
科学计算模型复现118 / 1172.73%436.36%
套件开发任务246 / 2425.0%312.5%
合作伙伴任务175 / 1729.41%211.76%

赛道亮点

  • 尽管本期黑客松整体难度较往期提升,但社区开发者表现出了极大的专业能力和热情,任务已经 100% 被大家认领;
  • 框架方向提交率近 90%,科学计算方向提交率 70%+,均高于往期黑客松。

参与提示

  • 在上面的看板中能看出来,套件开发任务和合作伙伴开发任务,提交率依然较低,欢迎社区的开发者选择这些任务来挑战。

更多详情请查看 issue:https://github.com/PaddlePaddle/Paddle/issues/57262

赛道二: 大模型应用与创意赛

部分应用展示

我们收到了 270 人报名,提交了 34 个应用,在这里节选部分有趣的应用,欢迎大家在线体验。

赛道亮点

  • 社区开发者们基于文心大模型的 SDK: ERNIE Bot SDK,提交了种类多样,涵盖多领域作品,充分探索了使用文心大模型能做到的创意和创新。

参与提示

  • 欢迎大家继续发挥创意,提交更多有趣的应用。

更多详情请查看 issue:https://github.com/PaddlePaddle/Paddle/issues/57585

赛道三:飞桨护航计划集训营

活动进展

集训营的同学已经完成了两次开源开发的双周报: WeeklyReports 2023.10.25~2023.11.07WeeklyReports 2023.11.08~2023.11.21 和三次技术分享

集训营亮点

  • 集训营将整个过程以开源的方式公开和协作,学员和导师在线研讨和互相促进。
  • 社区开发者展现了极高的专业性和热情,详见导师点评:@Aurelius84@From00@RichardWooSJTU@Caozhou1995

参与提示

  • 欢迎大家到代码仓库: Camp 里围观集训营的同学们的工作。

更多详情请查看 issue:https://github.com/PaddlePaddle/Paddle/issues/57264

彩蛋 🎊: 欢迎大家线下来见面

本周六(12 月 2 日)14:00 - 17:00 在 北京 798 举行飞桨开源社区 meetup,报名问卷:https://paddle.wjx.cn/vm/m1OLk4E.aspx# ,欢迎大家来聊天,飞桨定制咖啡等你打卡,梦师傅和花花在咖啡厅等着大家~

hackathon-5th-pp-coffee

',31),i=[d];function s(o,h,c,g,p,u){return a(),e("div",null,i)}const x=t(n,[["render",s]]);export{m as __pageData,x as default}; diff --git a/assets/posts_hackathon-5th-episode02.md.BhLuUEr6.lean.js b/assets/posts_hackathon-5th-episode02.md.BhLuUEr6.lean.js new file mode 100644 index 0000000..a2f6fcd --- /dev/null +++ b/assets/posts_hackathon-5th-episode02.md.BhLuUEr6.lean.js @@ -0,0 +1 @@ +import{_ as t,c as e,o as a,l as r}from"./chunks/framework.CEb3mtFd.js";const l="/assets/pp-coffee.B6ybez7E.jpeg",m=JSON.parse('{"title":"PaddlePaddle Hackathon Episode 02 | 第五期活动上线 8 周,框架赛道提交率近 90%","description":"","frontmatter":{"title":"PaddlePaddle Hackathon Episode 02 | 第五期活动上线 8 周,框架赛道提交率近 90%","date":"2023-12-01T00:00:00.000Z","author":{"name":"梦师傅","github":"Ligoml"},"co_authors":[{"name":"花花","github":"Tulip-hua"}]},"headers":[],"relativePath":"posts/hackathon-5th-episode02.md","filePath":"posts/hackathon-5th-episode02.md"}'),n={name:"posts/hackathon-5th-episode02.md"},d=r("",31),i=[d];function s(o,h,c,g,p,u){return a(),e("div",null,i)}const x=t(n,[["render",s]]);export{m as __pageData,x as default}; diff --git a/assets/posts_hackathon-5th-episode03.md.25C8UpHA.js b/assets/posts_hackathon-5th-episode03.md.25C8UpHA.js new file mode 100644 index 0000000..0460ec3 --- /dev/null +++ b/assets/posts_hackathon-5th-episode03.md.25C8UpHA.js @@ -0,0 +1 @@ +import{_ as a,c as e,o as t,l as r}from"./chunks/framework.CEb3mtFd.js";const o="/assets/track-1.92wc2X0b.jpg",s="/assets/track-2.CNxDMruG.jpg",p="/assets/track-3.B0IR02Ux.jpg",k=JSON.parse('{"title":"PaddlePaddle Hackathon Episode 03 | 创新碰撞,技术狂欢,飞桨黑客马拉松第五期活动圆满收官!","description":"","frontmatter":{"title":"PaddlePaddle Hackathon Episode 03 | 创新碰撞,技术狂欢,飞桨黑客马拉松第五期活动圆满收官!","date":"2023-12-25T00:00:00.000Z","author":{"name":"花花","github":"Tulip-hua"},"co_authors":[{"name":"梦师傅","github":"Ligoml"}]},"headers":[],"relativePath":"posts/hackathon-5th-episode03.md","filePath":"posts/hackathon-5th-episode03.md"}'),d={name:"posts/hackathon-5th-episode03.md"},l=r('

让我们看看哪些最强“Hacker”脱颖而出!

这是一次好奇心的远航,也是一场创作激情与团队协作的较量。

你懂技术,有想法,在这里可以尽情发挥!

我们希望你,不只埋头创造,一起享受不确定的乐趣,才能涌现意想不到的灵感和收获。

在这里,不止精益求精的竞技,去结识志同道合的小伙伴,去和研发导师 1V1 深度交流。

在飞桨黑客松的舞台上,创造力释放,“码”上见真章!

经过激烈的角逐,让我们看看哪些最强“Hacker”脱颖而出!

01 - 高手云集的飞桨黑客松活动

PaddlePaddle Hackathon 飞桨黑客马拉松(以下简称为“飞桨黑客松”)第五期活动自 2023 年 9 月中旬发布后,开发者热情响应,比赛历经三个月完美收官!

本次活动任务难度持续升级,飞桨联合 OpenVINO™ 等生态伙伴发布 100+ 开源贡献任务。赛制全新升级,本期黑客松活动在延续开源贡献个人挑战赛的基础上,首次探索以 Code Camp 形式组织开源活动,1 对 1 带教形式,并由开发者担任助教。并发布全新赛道——大模型应用与创意赛,基于文心大模型,创意无限,打开想象力,开发 AI 原生应用。

共有 800+ 位社区开发者参与到飞桨黑客松中,160+ 支队伍进行任务认领,本期黑客松活动在任务完成数量、参与团队规模、项目类型丰富度等方面均有提升,足可见开发者们建设飞桨和文心生态的热情。 我们期待这些开发者团队持续在飞桨开源生态中迸发出光彩和力量,与飞桨一路同行,一起建设更优雅的飞桨开源社区。

02 - 三大赛道 开源贡献

飞桨与生态伙伴携手,发布了三大赛道共计 26 个方向的开源贡献任务,从框架开发、模型套件开发、论文复现、硬件部署到产业应用任务应有尽有。开发者们结合自己的兴趣与能力在不同方向为飞桨做出重要贡献,感谢你们!

开源贡献个人挑战赛

发布 124 个开源贡献任务,包括框架、科学计算、套件和合作伙伴方向,与 OpenVINO™、海光、Arm、高通、Zilliz、开放麒麟社区、9#AISoft 等合作项目共同出品,120 个任务完成认领,96 个任务提交作品,85 个任务顺利完成,完成率 70%,感谢各位开发者的积极参与,致敬每一个开源贡献!

在第五期飞桨黑客松个人挑战赛中,开发者们码力全开,共计为飞桨新增 50+ API,增加 6 组共计 120+ API 转换规则,15 个 PHI 算子迁移、4 个分布式切分推导规则和 3 个转换函数,完成 9 篇 AI4S 领域论文代码复现,为大模型套件 PaddleMIX、PaddleNLP 及计算机视觉套件 PaddleSeg、PaddleClas、PaddleDetection 新增 10 个重要模型或新功能,为全套件模型接入动转静训练功能,为飞桨开源社区伙伴 OpenVINO™、Arm、InfiniTensor 新增 12 个新功能。

注:部分任务还有细节需要沟通,暂未完成 PR 合入,请锁定任务的开发者尽快完成 PR 合入哦~

更多详情请查看 issue:https://github.com/PaddlePaddle/Paddle/issues/57262

大模型应用与创意赛

作为飞桨星河社区五周年预热活动,共发布趣味创意与生产力工具 2 个方向的任务,鼓励开发者发挥想象力和创新精神,构思基于文心大模型的创意方案,开发创新应用,从技术创新到应用实践,共有 37 名开发者产出基于 EB SDK 的应用 60+ 个,作品种类多样,涵盖多领域,欢迎大家进入飞桨星河社区应用中心体验。

趣味创意赛道一等奖作品:AI 数字人 | 数字诗人&数字发言人&数字人聊天

生产力工具赛道一等奖作品:【Hackathon 5th】基于文心一言的日报系统

更多详情请查看 issue:https://github.com/PaddlePaddle/Paddle/issues/57585

飞桨护航计划集训营

发布 18 个框架与套件开发项目,1 对 1 带教形式,完成 18 名学员招募,共计提交 4 期周报,组织 5 期技术分享会,9 名学员进行技术分享,15 名学员通过考核。这是飞桨开源社区首次 Code Camp 形式的开源活动,所有学习笔记与周报记录留存在开源项目 PFCCLab/Camp 中,欢迎大家围观交流

集训营开源项目地址:https://github.com/PFCCLab/Camp

本期飞桨护航计划集训营开发项目内容硬核,既包括自动微分、新 IR Pass、自动混合精度、组合机制前反向统一、量化推理、算子类型扩展到复数、分布式能力建设与架构升级等核心组件开发工作,还有科学计算领域拓展专项、套件压缩能力建设、多模态大模型全流程建设等重要套件能力建设工作,营员们的开发能力、开源热情与丰富成果不仅得到了各位导师的高度认可,也获得了研发经理的肯定,3 名同学获得百度正式实习生 Offer。

更多详情请查看 issue:https://github.com/PaddlePaddle/Paddle/issues/57264

03 - 飞桨黑客松完成榜单

2023 PaddlePaddle Hackathon 飞桨黑客马拉松第五期由深度学习技术及应用国家工程研究中心主办,飞桨承办,英特尔作为顶级赞助方,OpenVINO™、华为、海光、Arm、高通、Zilliz、开放麒麟社区等共同出品,以线上认领任务的形式进行。 本次共有三大赛道:开源贡献个人挑战赛、大模型应用与创意赛、飞桨护航计划集训营。根据开发难度分为基础任务和进阶任务,为大家提供丰富的深度学习开发体验。对飞桨黑客松第五期公示榜单如有异议,请于 2023 年 12 月 25 日 24 点前反馈至 paddle-hack@baidu.com ,我们将在 12 月 26 日前对您的异议进行复核反馈。

hackathon-5th-track-1

hackathon-5th-track-2

hackathon-5th-track-3

恭喜完成开发任务的团队,将获得任务对应奖金以及飞桨黑客松结项证书,同时也可以获得百度招聘绿色通道。

04 - 新的身份等你点亮

在参与飞桨黑客松活动时,部分开发者们向飞桨框架提交 PR(Pull Request)参与开源贡献,成为飞桨框架的贡献者,并且有意愿为飞桨框架做出持续的贡献。他们接受了来自 PFCC 的邀请,正在用自己的方式参与飞桨框架建设,与飞桨共同成长。如果你也热爱开源、如果你有意愿成为飞桨开源社区的 Contributor,就快加入 PFCC 吧!

关于 PFCC

PFCC 全称 Paddle Framework Contributor Club ,意为飞桨框架贡献者俱乐部,是一个有兴趣、正在或者已经为飞桨开源框架做开源贡献的贡献者成立的虚拟组织。在这里,飞桨开源框架的贡献者进行讨论、交流和分享,并为飞桨框架做出持续的贡献。如果你有意愿加入我们,请发邮件到 ext_paddle_oss@baidu.com,在邮件中附上自己的 GitHub ID、贡献详情与联系方式,会有工作人员邀请你加入。

加入 PFCC,与我们一起参与到飞桨框架的开发中吧!

戳这里看飞桨开源社区故事 ➡️ https://pfcc.blog/

原文链接:https://mp.weixin.qq.com/s/Yjvwj8br84sPard1lLoNOQ

',39),h=[l];function i(n,c,u,P,b,m){return t(),e("div",null,h)}const g=a(d,[["render",i]]);export{k as __pageData,g as default}; diff --git a/assets/posts_hackathon-5th-episode03.md.25C8UpHA.lean.js b/assets/posts_hackathon-5th-episode03.md.25C8UpHA.lean.js new file mode 100644 index 0000000..1df10e4 --- /dev/null +++ b/assets/posts_hackathon-5th-episode03.md.25C8UpHA.lean.js @@ -0,0 +1 @@ +import{_ as a,c as e,o as t,l as r}from"./chunks/framework.CEb3mtFd.js";const o="/assets/track-1.92wc2X0b.jpg",s="/assets/track-2.CNxDMruG.jpg",p="/assets/track-3.B0IR02Ux.jpg",k=JSON.parse('{"title":"PaddlePaddle Hackathon Episode 03 | 创新碰撞,技术狂欢,飞桨黑客马拉松第五期活动圆满收官!","description":"","frontmatter":{"title":"PaddlePaddle Hackathon Episode 03 | 创新碰撞,技术狂欢,飞桨黑客马拉松第五期活动圆满收官!","date":"2023-12-25T00:00:00.000Z","author":{"name":"花花","github":"Tulip-hua"},"co_authors":[{"name":"梦师傅","github":"Ligoml"}]},"headers":[],"relativePath":"posts/hackathon-5th-episode03.md","filePath":"posts/hackathon-5th-episode03.md"}'),d={name:"posts/hackathon-5th-episode03.md"},l=r("",39),h=[l];function i(n,c,u,P,b,m){return t(),e("div",null,h)}const g=a(d,[["render",i]]);export{k as __pageData,g as default}; diff --git a/assets/posts_huanggua-story.md.vbJ2Gjxx.js b/assets/posts_huanggua-story.md.vbJ2Gjxx.js new file mode 100644 index 0000000..decad90 --- /dev/null +++ b/assets/posts_huanggua-story.md.vbJ2Gjxx.js @@ -0,0 +1 @@ +import{M as a,_ as u}from"./chunks/MessageBox.BjkmF0_f.js";import{c as s,a as l,i as e,v as t,x as n,l as i,o}from"./chunks/framework.CEb3mtFd.js";const d="/assets/huanggua-01.5sbPPZbB.jpg",_="/assets/huanggua-02.BKcdSOD0.jpg",r="/assets/huanggua-03.BPzKpsu-.jpg",h="/assets/huanggua-04.DiMrknTY.jpg",c=l("p",null,[n("他来了,他来了,他带着满满的故事,迈着自信的步伐向我们走来了!虽然刚满 15 岁,但"),l("strong",null,"小小黄瓜"),n("的开源史却已有好几年!学校趣事?开源经历?迷人帅照?成山作业?你都能在本篇博客看到!")],-1),g=l("h2",{id:"一、前言",tabindex:"-1"},[n("一、前言 "),l("a",{class:"header-anchor",href:"#一、前言","aria-label":'Permalink to "一、前言"'},"​")],-1),f=l("p",null,[l("strong",null,"Berniehuang2008"),n("(人送外号:黄瓜),是深圳一位 15 岁的初中生,同时也是 OpenTeens(全国甚至全世界第一个青少年开源社区)创始人之一。黄瓜曾贡献过开源项目 SearXNG 和 GestureX 等,是一位优秀的青少年开发者。他在 10 月加入 Paddle 社区,并且以迅雷不及掩耳之势合入 PR,成为 Paddle 社区的 contributor。现在,他正在准备参加 Paddle 黑客松,让我们一起看看他的故事吧😀~")],-1),p=l("h2",{id:"二、采访内容",tabindex:"-1"},[n("二、采访内容 "),l("a",{class:"header-anchor",href:"#二、采访内容","aria-label":'Permalink to "二、采访内容"'},"​")],-1),b=l("p",null,[l("strong",null,"简单介绍一下自己吧!")],-1),P=l("p",null,[l("strong",null,"现在是一名初三学生,课程学习忙么?有什么喜欢的科目没有?😁😁")],-1),m=l("p",null,[l("strong",null,"学校最近有什么有趣的事情可以和大家分享一下!")],-1),y=l("p",null,[l("strong",null,"当初你是如何被编程和开源世界吸引的?是什么驱使你成为了一名青少年开发者和开源社区创始人呢?")],-1),B=l("br",null,null,-1),S=l("p",null,[l("strong",null,"之前看你的 GitHub 主页里,有对 SearXNG 提交过 PR,这是一个怎样的项目?你在 SearXNG 项目中的具体贡献是什么?你最喜欢的部分是什么?这个经历让你有什么样的收获?")],-1),x=l("br",null,null,-1),A=l("blockquote",null,[l("p",null,"编者注✍️:现在初中生都已经开始接触算法了吗!")],-1),N=l("p",null,[l("strong",null,"除了在 SearXNG 项目中的贡献,我发现你还设计了一些开源小程序(eg:Dairy APP),能否分享一下你最引以为傲的作品是什么?你觉得这个作品的意义是什么?")],-1),k=l("br",null,null,-1),G=l("div",{style:{display:"flex","justify-content":"center"}},[l("figure",{style:{width:"40%"}},[l("img",{src:d,alt:"APP"}),l("figcaption",null,"Dairy APP 部分截图")])],-1),I={start:"7"},T=l("p",null,[l("strong",null,"你如何了解到 Paddle 社区的,是什么吸引你加入这个社区并开始贡献?可以分享一下你和 Paddle 社区的小故事么?")],-1),v=l("br",null,null,-1),j=l("br",null,null,-1),D=l("p",null,[l("strong",null,"加入 Paddle 社区后的第一次合并 PR 经历如何?有没有什么有趣的插曲或者教训🤓🤓🤓🤓?")],-1),w=l("blockquote",null,[l("p",null,[n("编者注✍️:文档任务很适合刚接触 Paddle 的开发者们,而相关的 PR 也很可能是大家在 Paddle 的第一个 PR。感兴趣可查看 ➡️"),l("a",{href:"https://github.com/PaddlePaddle/docs/issues/6165",target:"_blank",rel:"noreferrer"},"文档 Docathon 系列任务")])],-1),C=l("p",null,[l("strong",null,"你觉得今后 Paddle 社区对你的个人成长和技术发展有何影响?")],-1),R=l("br",null,null,-1),X=l("p",null,[l("strong",null,"作为一名青少年开发者,你一般是如何学习技术的,听说你曾经以 AI 学 AI?哈哈哈"),n("~~")],-1),M=l("br",null,null,-1),V=l("p",null,[l("strong",null,"在你的同龄人中,有多少人对编程和开发感兴趣?你是如何看待青少年参与开源的?")],-1),q=l("p",null,[l("strong",null,"你对于即将参加 Paddle 黑客松有什么样的期待和目标?你希望在黑客松中取得什么样的成绩?")],-1),O=l("br",null,null,-1),L=l("p",null,[l("strong",null,"那么在整个开源学习中,对你影响最深的是谁?为什么?(🤔🤔🤔)")],-1),Q=l("br",null,null,-1),z=l("br",null,null,-1),E=l("p",null,[l("strong",null,"对于其他年轻开发者来说,你有什么建议?或者你想鼓励他们参与到开源社区,特别是 Paddle 社区中么?")],-1),H=l("br",null,null,-1),K=l("br",null,null,-1),Z=i('

三、生活中的点点滴滴——黄瓜篇

life
黄锦源同学的日常
homework
黄瓜的作业
cat
黄瓜的猫🐱
',4),ll=JSON.parse('{"title":"【开源江湖闲聊录】初中生也能当开发者❓少年黄瓜的开源奇遇记","description":"","frontmatter":{"title":"【开源江湖闲聊录】初中生也能当开发者❓少年黄瓜的开源奇遇记","date":"2023-12-12T00:00:00.000Z","author":{"name":"孙钟恺","github":"sunzhongkai588"},"co_authors":[{"name":"文潇(小记者)","github":"wenxiaohahaha"},{"name":"黄锦源(黄瓜大帝)","github":"Berniehuang2008"}]},"headers":[],"relativePath":"posts/huanggua-story.md","filePath":"posts/huanggua-story.md"}'),F={name:"posts/huanggua-story.md"},nl=Object.assign(F,{setup(J){return(Y,$)=>(o(),s("div",null,[c,g,f,p,l("ol",null,[l("li",null,[b,e(a,null,{default:t(()=>[e(u,{name:"黄瓜🥒",github:"Berniehuang2008"},{default:t(()=>[n(" 我叫黄锦源,外号黄瓜,是深圳的一个初三学生。 ")]),_:1})]),_:1})]),l("li",null,[P,e(a,null,{default:t(()=>[e(u,{name:"黄瓜🥒",github:"Berniehuang2008"},{default:t(()=>[n(" 忙啊,当然忙。每天周考,从四点半考到六点,放学回家一堆卷子烦的要死。最喜欢的是数学,没有原因,就是喜欢😳。 ")]),_:1})]),_:1})]),l("li",null,[m,e(a,null,{default:t(()=>[e(u,{name:"黄瓜🥒",github:"Berniehuang2008"},{default:t(()=>[n(" emmm,有趣的事情?没啥,天天考试有啥有趣的。。。不过昨天我还骑车来着,扫了一辆小黄车就一路骑到深圳湾,14 公里,挺开心的。我们几个朋友还去烧纸,哇塞,烧数学书真解气!(黄瓜自注:我们数学课从来不用书) ")]),_:1})]),_:1})]),l("li",null,[y,e(a,null,{default:t(()=>[e(u,{name:"黄瓜🥒",github:"Berniehuang2008"},{default:t(()=>[n(" 我是从 Scratch 学起的,一开始就感觉 Scratch 这玩意很有意思,想让他干啥他就干啥,有一种掌控世界的感觉。后来,Scratch 写了一百多个游戏之后玩无聊了,转行 Python,才发现这玩意比 Scratch 好玩 10086 倍! "),B,n(" 初一的时候,被我们学校信竞老师征召入伍,但我对竞赛类的东西不感冒,学了一年就退坑了。 ")]),_:1})]),_:1})]),l("li",null,[S,e(a,null,{default:t(()=>[e(u,{name:"黄瓜🥒",github:"Berniehuang2008"},{default:t(()=>[n(" SearXNG 是一个开源的搜索引擎,我当时对搜索引擎算法特别着迷,就找了一个,最后发现这玩意就是从 Google、Bing 上面爬数据然后整理! "),x,n(" 不过既然点进去了,索性就帮他们修个 bug 吧,结果这就成为了我第一个参与的开源项目。现在越做越深入,跟 Maintainer 已经算得上认识了 hhh ")]),_:1})]),_:1}),A]),l("li",null,[N,e(a,null,{default:t(()=>[e(u,{name:"黄瓜🥒",github:"Berniehuang2008"},{default:t(()=>[n(" addd,Diary app 确实是我前几周的重点。我比较喜欢创新新功能,比如说一打开就弹出一篇以往的日记,配上符合当时心情的音乐,让你朝花夕拾一下。 "),k,n(" 现在嘛,我写了一个 Python 库,叫做 MercurySQLite,提供了一个高级的接口,能不用写 SQL 语句就能操作数据库,贼方便告诉你。 ")]),_:1})]),_:1})])]),G,l("ol",I,[l("li",null,[T,e(a,null,{default:t(()=>[e(u,{name:"黄瓜🥒",github:"Berniehuang2008"},{default:t(()=>[n(" 我也忘了第一次看 Paddle 是哪年了。。。不过当时我应该处于“AI 发烧友”阶段。后来,一年前?文心不是火了吗?我就想再看看 AI,就算是对 Paddle 有了一个大概的了解吧。 "),v,n(" 直到今年的中国开源年会,我不是办青少年分论坛吗?我们接下来就是教育分论坛,然后我听了梦老师的演讲,觉得“快乐开源”这档子活动挺有意思的。 "),j,n(" 其实我几个月前看过黑客松,那玩意儿实在是太难了做不来,但是快乐开源就挺好的啊,又不难,改文档也能学到很多,比如说文档的语法之类的,我的那个 SQL 项目文档就是受到了这个的启发。。 ")]),_:1})]),_:1})]),l("li",null,[D,e(a,null,{default:t(()=>[e(u,{name:"黄瓜🥒",github:"Berniehuang2008"},{default:t(()=>[n(" 哈哈哈,第一次我故意挑了一个最简单的任务做,只有几行代码,属于是投机取巧摸鱼了。。不过第二次——也就是现在正在进行的 PR——没那么轻松了。原文档的格式超级乱,我都不理解他是什么意思。然后又是 CI 的报错看不懂。。。现在差不多改完了,还有亿点点小问题,也快了 ")]),_:1})]),_:1}),w]),l("li",null,[C,e(a,null,{default:t(()=>[e(u,{name:"黄瓜🥒",github:"Berniehuang2008"},{default:t(()=>[n(" Paddle 社区的技术实力肯定是没得说的。能跟这么多大佬在一起,我觉得不管是现在还是未来,都会对我有很大的影响。就比如说吧,虽然我现在还没有深入地接触到 Paddle 的技术层面,但是我只是在 PFCC 那个群里面苟着,就能学到很多东西,比如说 Paddle 的 CI 啊、代码规范啊之类的。 "),R,n(" 然后我准备试着,只是试着哈,参加下一次的黑客松,或者是黑客松简单版。我相信,只需要一次任务,就可以把那一块的相关知识掌握熟练,然后社交技能也可以上来,这绝对是一举两得。 ")]),_:1})]),_:1})]),l("li",null,[X,e(a,null,{default:t(()=>[e(u,{name:"黄瓜🥒",github:"Berniehuang2008"},{default:t(()=>[n(" 以 AI 学 AI?试过,但是效果真的不咋地。那时候 GPT3.5 才刚出来,我问他啥都是乱答的。所以我还是觉得以前的学习方式比较好。我喜欢那种“在实际应用里学习”。也就是说,给我一个应用场景,或者是项目,然后我先想该怎么实现,遇到哪里有不懂的技术问题,再去搜,再去问别人(当然,嫌麻烦的话就问 AI /doge) "),M,n(" 我觉得这样的学习效率是最高的。 ")]),_:1})]),_:1})]),l("li",null,[V,e(a,null,{default:t(()=>[e(u,{name:"黄瓜🥒",github:"Berniehuang2008"},{default:t(()=>[n(" 我的同龄人。。。如果你指的是我们学校的话。。。那么应该不多,应该不超过五个。所有学计算机的,基本上都是为了信竞。剩下的为数不多的四五个人,也只是用 GitHub 找找东西,玩玩游戏而已。 ")]),_:1})]),_:1})]),l("li",null,[q,e(a,null,{default:t(()=>[e(u,{name:"黄瓜🥒",github:"Berniehuang2008"},{default:t(()=>[n(" 我的目标就是试一下,看看自己的水平在哪,然后顺便学一些知识。所以?只能期待题目不要太难了 hhh "),O,n(" 至于成绩嘛,我也不奢求,能得一颗星就算是重大成就了,如果我是“有技术的”,也许可以尝试 may be 多弄一点星??? ")]),_:1})]),_:1})]),l("li",null,[L,e(a,null,{default:t(()=>[e(u,{name:"黄瓜🥒",github:"Berniehuang2008"},{default:t(()=>[n(" 这个问题很难答啊 hhh,说谁都不太好。 "),Q,n(" 但是如果要说真话,这就必须提到 SearXNG 那个搜索引擎的 Maintainer。他特别有耐心,还跟我闲聊,那段时间我初出茅庐啥也不懂,要不是他,我到现在还没入门呢! "),z,n(" 当然啦,我必须希望以后能有更多影响我的人,超越他,对吧? ")]),_:1})]),_:1})]),l("li",null,[E,e(a,null,{default:t(()=>[e(u,{name:"黄瓜🥒",github:"Berniehuang2008"},{default:t(()=>[n(" 我觉得开源社区的一大魅力就在于“社区”——你永远可以找到帮助,永远可以与志同道合的人一起 coding,Paddle 社区更是一个典型。 "),H,n(" 在 Paddle,如果你有什么问题——无论白痴问题还是神级难度——都会有人来看,都会有人来帮助你解决。 "),K,n(" 我觉得 Paddle 的一大优点就是他是任务式的这种贡献机制。你可以选择各种不同难度的任务,循序渐进,慢慢提升自己。任务式贡献也可以让你有一个明确的目标,甚至是一个明确的思路,该怎么解决这个问题。 ")]),_:1})]),_:1})])]),Z]))}});export{ll as __pageData,nl as default}; diff --git a/assets/posts_huanggua-story.md.vbJ2Gjxx.lean.js b/assets/posts_huanggua-story.md.vbJ2Gjxx.lean.js new file mode 100644 index 0000000..b40b282 --- /dev/null +++ b/assets/posts_huanggua-story.md.vbJ2Gjxx.lean.js @@ -0,0 +1 @@ +import{M as a,_ as u}from"./chunks/MessageBox.BjkmF0_f.js";import{c as s,a as l,i as e,v as t,x as n,l as i,o}from"./chunks/framework.CEb3mtFd.js";const d="/assets/huanggua-01.5sbPPZbB.jpg",_="/assets/huanggua-02.BKcdSOD0.jpg",r="/assets/huanggua-03.BPzKpsu-.jpg",h="/assets/huanggua-04.DiMrknTY.jpg",c=l("p",null,[n("他来了,他来了,他带着满满的故事,迈着自信的步伐向我们走来了!虽然刚满 15 岁,但"),l("strong",null,"小小黄瓜"),n("的开源史却已有好几年!学校趣事?开源经历?迷人帅照?成山作业?你都能在本篇博客看到!")],-1),g=l("h2",{id:"一、前言",tabindex:"-1"},[n("一、前言 "),l("a",{class:"header-anchor",href:"#一、前言","aria-label":'Permalink to "一、前言"'},"​")],-1),f=l("p",null,[l("strong",null,"Berniehuang2008"),n("(人送外号:黄瓜),是深圳一位 15 岁的初中生,同时也是 OpenTeens(全国甚至全世界第一个青少年开源社区)创始人之一。黄瓜曾贡献过开源项目 SearXNG 和 GestureX 等,是一位优秀的青少年开发者。他在 10 月加入 Paddle 社区,并且以迅雷不及掩耳之势合入 PR,成为 Paddle 社区的 contributor。现在,他正在准备参加 Paddle 黑客松,让我们一起看看他的故事吧😀~")],-1),p=l("h2",{id:"二、采访内容",tabindex:"-1"},[n("二、采访内容 "),l("a",{class:"header-anchor",href:"#二、采访内容","aria-label":'Permalink to "二、采访内容"'},"​")],-1),b=l("p",null,[l("strong",null,"简单介绍一下自己吧!")],-1),P=l("p",null,[l("strong",null,"现在是一名初三学生,课程学习忙么?有什么喜欢的科目没有?😁😁")],-1),m=l("p",null,[l("strong",null,"学校最近有什么有趣的事情可以和大家分享一下!")],-1),y=l("p",null,[l("strong",null,"当初你是如何被编程和开源世界吸引的?是什么驱使你成为了一名青少年开发者和开源社区创始人呢?")],-1),B=l("br",null,null,-1),S=l("p",null,[l("strong",null,"之前看你的 GitHub 主页里,有对 SearXNG 提交过 PR,这是一个怎样的项目?你在 SearXNG 项目中的具体贡献是什么?你最喜欢的部分是什么?这个经历让你有什么样的收获?")],-1),x=l("br",null,null,-1),A=l("blockquote",null,[l("p",null,"编者注✍️:现在初中生都已经开始接触算法了吗!")],-1),N=l("p",null,[l("strong",null,"除了在 SearXNG 项目中的贡献,我发现你还设计了一些开源小程序(eg:Dairy APP),能否分享一下你最引以为傲的作品是什么?你觉得这个作品的意义是什么?")],-1),k=l("br",null,null,-1),G=l("div",{style:{display:"flex","justify-content":"center"}},[l("figure",{style:{width:"40%"}},[l("img",{src:d,alt:"APP"}),l("figcaption",null,"Dairy APP 部分截图")])],-1),I={start:"7"},T=l("p",null,[l("strong",null,"你如何了解到 Paddle 社区的,是什么吸引你加入这个社区并开始贡献?可以分享一下你和 Paddle 社区的小故事么?")],-1),v=l("br",null,null,-1),j=l("br",null,null,-1),D=l("p",null,[l("strong",null,"加入 Paddle 社区后的第一次合并 PR 经历如何?有没有什么有趣的插曲或者教训🤓🤓🤓🤓?")],-1),w=l("blockquote",null,[l("p",null,[n("编者注✍️:文档任务很适合刚接触 Paddle 的开发者们,而相关的 PR 也很可能是大家在 Paddle 的第一个 PR。感兴趣可查看 ➡️"),l("a",{href:"https://github.com/PaddlePaddle/docs/issues/6165",target:"_blank",rel:"noreferrer"},"文档 Docathon 系列任务")])],-1),C=l("p",null,[l("strong",null,"你觉得今后 Paddle 社区对你的个人成长和技术发展有何影响?")],-1),R=l("br",null,null,-1),X=l("p",null,[l("strong",null,"作为一名青少年开发者,你一般是如何学习技术的,听说你曾经以 AI 学 AI?哈哈哈"),n("~~")],-1),M=l("br",null,null,-1),V=l("p",null,[l("strong",null,"在你的同龄人中,有多少人对编程和开发感兴趣?你是如何看待青少年参与开源的?")],-1),q=l("p",null,[l("strong",null,"你对于即将参加 Paddle 黑客松有什么样的期待和目标?你希望在黑客松中取得什么样的成绩?")],-1),O=l("br",null,null,-1),L=l("p",null,[l("strong",null,"那么在整个开源学习中,对你影响最深的是谁?为什么?(🤔🤔🤔)")],-1),Q=l("br",null,null,-1),z=l("br",null,null,-1),E=l("p",null,[l("strong",null,"对于其他年轻开发者来说,你有什么建议?或者你想鼓励他们参与到开源社区,特别是 Paddle 社区中么?")],-1),H=l("br",null,null,-1),K=l("br",null,null,-1),Z=i("",4),ll=JSON.parse('{"title":"【开源江湖闲聊录】初中生也能当开发者❓少年黄瓜的开源奇遇记","description":"","frontmatter":{"title":"【开源江湖闲聊录】初中生也能当开发者❓少年黄瓜的开源奇遇记","date":"2023-12-12T00:00:00.000Z","author":{"name":"孙钟恺","github":"sunzhongkai588"},"co_authors":[{"name":"文潇(小记者)","github":"wenxiaohahaha"},{"name":"黄锦源(黄瓜大帝)","github":"Berniehuang2008"}]},"headers":[],"relativePath":"posts/huanggua-story.md","filePath":"posts/huanggua-story.md"}'),F={name:"posts/huanggua-story.md"},nl=Object.assign(F,{setup(J){return(Y,$)=>(o(),s("div",null,[c,g,f,p,l("ol",null,[l("li",null,[b,e(a,null,{default:t(()=>[e(u,{name:"黄瓜🥒",github:"Berniehuang2008"},{default:t(()=>[n(" 我叫黄锦源,外号黄瓜,是深圳的一个初三学生。 ")]),_:1})]),_:1})]),l("li",null,[P,e(a,null,{default:t(()=>[e(u,{name:"黄瓜🥒",github:"Berniehuang2008"},{default:t(()=>[n(" 忙啊,当然忙。每天周考,从四点半考到六点,放学回家一堆卷子烦的要死。最喜欢的是数学,没有原因,就是喜欢😳。 ")]),_:1})]),_:1})]),l("li",null,[m,e(a,null,{default:t(()=>[e(u,{name:"黄瓜🥒",github:"Berniehuang2008"},{default:t(()=>[n(" emmm,有趣的事情?没啥,天天考试有啥有趣的。。。不过昨天我还骑车来着,扫了一辆小黄车就一路骑到深圳湾,14 公里,挺开心的。我们几个朋友还去烧纸,哇塞,烧数学书真解气!(黄瓜自注:我们数学课从来不用书) ")]),_:1})]),_:1})]),l("li",null,[y,e(a,null,{default:t(()=>[e(u,{name:"黄瓜🥒",github:"Berniehuang2008"},{default:t(()=>[n(" 我是从 Scratch 学起的,一开始就感觉 Scratch 这玩意很有意思,想让他干啥他就干啥,有一种掌控世界的感觉。后来,Scratch 写了一百多个游戏之后玩无聊了,转行 Python,才发现这玩意比 Scratch 好玩 10086 倍! "),B,n(" 初一的时候,被我们学校信竞老师征召入伍,但我对竞赛类的东西不感冒,学了一年就退坑了。 ")]),_:1})]),_:1})]),l("li",null,[S,e(a,null,{default:t(()=>[e(u,{name:"黄瓜🥒",github:"Berniehuang2008"},{default:t(()=>[n(" SearXNG 是一个开源的搜索引擎,我当时对搜索引擎算法特别着迷,就找了一个,最后发现这玩意就是从 Google、Bing 上面爬数据然后整理! "),x,n(" 不过既然点进去了,索性就帮他们修个 bug 吧,结果这就成为了我第一个参与的开源项目。现在越做越深入,跟 Maintainer 已经算得上认识了 hhh ")]),_:1})]),_:1}),A]),l("li",null,[N,e(a,null,{default:t(()=>[e(u,{name:"黄瓜🥒",github:"Berniehuang2008"},{default:t(()=>[n(" addd,Diary app 确实是我前几周的重点。我比较喜欢创新新功能,比如说一打开就弹出一篇以往的日记,配上符合当时心情的音乐,让你朝花夕拾一下。 "),k,n(" 现在嘛,我写了一个 Python 库,叫做 MercurySQLite,提供了一个高级的接口,能不用写 SQL 语句就能操作数据库,贼方便告诉你。 ")]),_:1})]),_:1})])]),G,l("ol",I,[l("li",null,[T,e(a,null,{default:t(()=>[e(u,{name:"黄瓜🥒",github:"Berniehuang2008"},{default:t(()=>[n(" 我也忘了第一次看 Paddle 是哪年了。。。不过当时我应该处于“AI 发烧友”阶段。后来,一年前?文心不是火了吗?我就想再看看 AI,就算是对 Paddle 有了一个大概的了解吧。 "),v,n(" 直到今年的中国开源年会,我不是办青少年分论坛吗?我们接下来就是教育分论坛,然后我听了梦老师的演讲,觉得“快乐开源”这档子活动挺有意思的。 "),j,n(" 其实我几个月前看过黑客松,那玩意儿实在是太难了做不来,但是快乐开源就挺好的啊,又不难,改文档也能学到很多,比如说文档的语法之类的,我的那个 SQL 项目文档就是受到了这个的启发。。 ")]),_:1})]),_:1})]),l("li",null,[D,e(a,null,{default:t(()=>[e(u,{name:"黄瓜🥒",github:"Berniehuang2008"},{default:t(()=>[n(" 哈哈哈,第一次我故意挑了一个最简单的任务做,只有几行代码,属于是投机取巧摸鱼了。。不过第二次——也就是现在正在进行的 PR——没那么轻松了。原文档的格式超级乱,我都不理解他是什么意思。然后又是 CI 的报错看不懂。。。现在差不多改完了,还有亿点点小问题,也快了 ")]),_:1})]),_:1}),w]),l("li",null,[C,e(a,null,{default:t(()=>[e(u,{name:"黄瓜🥒",github:"Berniehuang2008"},{default:t(()=>[n(" Paddle 社区的技术实力肯定是没得说的。能跟这么多大佬在一起,我觉得不管是现在还是未来,都会对我有很大的影响。就比如说吧,虽然我现在还没有深入地接触到 Paddle 的技术层面,但是我只是在 PFCC 那个群里面苟着,就能学到很多东西,比如说 Paddle 的 CI 啊、代码规范啊之类的。 "),R,n(" 然后我准备试着,只是试着哈,参加下一次的黑客松,或者是黑客松简单版。我相信,只需要一次任务,就可以把那一块的相关知识掌握熟练,然后社交技能也可以上来,这绝对是一举两得。 ")]),_:1})]),_:1})]),l("li",null,[X,e(a,null,{default:t(()=>[e(u,{name:"黄瓜🥒",github:"Berniehuang2008"},{default:t(()=>[n(" 以 AI 学 AI?试过,但是效果真的不咋地。那时候 GPT3.5 才刚出来,我问他啥都是乱答的。所以我还是觉得以前的学习方式比较好。我喜欢那种“在实际应用里学习”。也就是说,给我一个应用场景,或者是项目,然后我先想该怎么实现,遇到哪里有不懂的技术问题,再去搜,再去问别人(当然,嫌麻烦的话就问 AI /doge) "),M,n(" 我觉得这样的学习效率是最高的。 ")]),_:1})]),_:1})]),l("li",null,[V,e(a,null,{default:t(()=>[e(u,{name:"黄瓜🥒",github:"Berniehuang2008"},{default:t(()=>[n(" 我的同龄人。。。如果你指的是我们学校的话。。。那么应该不多,应该不超过五个。所有学计算机的,基本上都是为了信竞。剩下的为数不多的四五个人,也只是用 GitHub 找找东西,玩玩游戏而已。 ")]),_:1})]),_:1})]),l("li",null,[q,e(a,null,{default:t(()=>[e(u,{name:"黄瓜🥒",github:"Berniehuang2008"},{default:t(()=>[n(" 我的目标就是试一下,看看自己的水平在哪,然后顺便学一些知识。所以?只能期待题目不要太难了 hhh "),O,n(" 至于成绩嘛,我也不奢求,能得一颗星就算是重大成就了,如果我是“有技术的”,也许可以尝试 may be 多弄一点星??? ")]),_:1})]),_:1})]),l("li",null,[L,e(a,null,{default:t(()=>[e(u,{name:"黄瓜🥒",github:"Berniehuang2008"},{default:t(()=>[n(" 这个问题很难答啊 hhh,说谁都不太好。 "),Q,n(" 但是如果要说真话,这就必须提到 SearXNG 那个搜索引擎的 Maintainer。他特别有耐心,还跟我闲聊,那段时间我初出茅庐啥也不懂,要不是他,我到现在还没入门呢! "),z,n(" 当然啦,我必须希望以后能有更多影响我的人,超越他,对吧? ")]),_:1})]),_:1})]),l("li",null,[E,e(a,null,{default:t(()=>[e(u,{name:"黄瓜🥒",github:"Berniehuang2008"},{default:t(()=>[n(" 我觉得开源社区的一大魅力就在于“社区”——你永远可以找到帮助,永远可以与志同道合的人一起 coding,Paddle 社区更是一个典型。 "),H,n(" 在 Paddle,如果你有什么问题——无论白痴问题还是神级难度——都会有人来看,都会有人来帮助你解决。 "),K,n(" 我觉得 Paddle 的一大优点就是他是任务式的这种贡献机制。你可以选择各种不同难度的任务,循序渐进,慢慢提升自己。任务式贡献也可以让你有一个明确的目标,甚至是一个明确的思路,该怎么解决这个问题。 ")]),_:1})]),_:1})])]),Z]))}});export{ll as __pageData,nl as default}; diff --git a/assets/posts_huangjiyi-story.md.Bdyh1PqX.js b/assets/posts_huangjiyi-story.md.Bdyh1PqX.js new file mode 100644 index 0000000..5b1bb5d --- /dev/null +++ b/assets/posts_huangjiyi-story.md.Bdyh1PqX.js @@ -0,0 +1 @@ +import{M as r,_ as s}from"./chunks/MessageBox.BjkmF0_f.js";import{c as n,i as t,v as e,l as i,a as o,x as a,o as l}from"./chunks/framework.CEb3mtFd.js";const g="/assets/huangjiyi-01.DXLrvOrw.jpg",d="/assets/huangjiyi-02.7pHNcGD5.jpg",p="/assets/huangjiyi-06.CyxAzjzo.jpg",u="/assets/huangjiyi-03.DYNP8_Fb.jpg",h="/assets/huangjiyi-04.ajHRyHp9.jpg",c="/assets/huangjiyi-05.DzUpMc4V.jpg",_=i('

从积极参与社区开源任务,到加入飞桨成为 (练习生) 实习生,到最终正式成为飞桨研发团队的一员。以兴趣为起点, 黄济懿师傅 将我们展示了一条通往职业的道路,希望他的故事能够激励所有对开源充满热情的开发者们。接下来,原神启动 🚀!

一、前言

黄师傅是一个地地道道的江西人,喜欢吃辣🌶️🌶️🌶️。他本科研究生都就读于广州的华南理工大学,现为电子信息专业,即将毕业前往 Paddle 工作。作为一名研究僧,他在空余时间喜欢吃吃美食或者玩玩游戏,像是原神/LOL/金铲铲之战(各位要是也在玩,可以找黄师傅哦~黄师傅求大佬带带!!)。

偷偷告诉你们:黄师傅最近的主线任务就是毕设,请务必多找他打游戏让他延毕(不是)

去年 11 月,他出于对深度学习框架的底层实现的兴趣,联系花花加入了快乐开源群。在这一年里,他陆续完成社区里各项开源任务以熟悉 Paddle 框架,期间他也把握住了来飞桨实习的机会,他不断积累开发经验,不断加深对 Paddle 的理解,最终,他通过了飞桨团队的面试,成功拿下了飞桨校招 offer!

黄师傅曾说:"我将继续在飞桨开源活动完成一些任务,希望能够学到更多的同时也能为飞桨的建设做出小小的贡献"。事实上,黄师傅曾分别参与了 PHI 算子库独立编译算子定义自动生成Fluid Kernel 函数式改造等多个快乐开源活动项目以及飞桨框架护航计划,到目前为 Paddle 贡献了 100 多个 PR。抛开实习生和正式员工的身份,黄师傅自身也是飞桨社区的自发贡献者和推动者。接下来,就让我们来瞅瞅黄师傅的精彩 Paddle 之旅吧!!

原神,启动!!(请读者自行脑补 BGM)

huangjiyi-01

二、采访内容

  1. 介绍一下自己吧,黄师傅!(●'◡'●)

    黄师傅: 我的 AI Studio 和 GitHub 的账号是 huangjiyi,也是我名字的全拼(黄济懿)。

  2. 可以简单和大家分享一下你生活中有什么兴趣爱好吗⊙o⊙(游戏、旅游、运动等等)?

    黄师傅: 我就是个死宅,平时就是打打游戏,刷刷 B 站,出门也就是找点好吃的。

  3. 听说你本科研究生都在华南理工大学,你们学校周围有什么好吃的啊?🍔🍟🍿🥯🥪🥗🎂🍬🍹🍉

    黄师傅: 因为在华工太久学校食堂已经吃腻了,我会经常出校找点吃的,但活动范围有限,学校周边我吃过比较好吃的不多,就川菜小炒、麻辣香锅、鸡公煲、螺狮粉、泰国菜这些。

  4. 我了解到你平时有在玩 LOL,那么如果把 Paddle 比作一个英雄🦸,你觉得它最像谁?为什么嘞?

    黄师傅: 我的答案是维克托,我的想象力有限,我只是觉得维克托的技能是会进化的,而 Paddle 也是在不断进化(更新)和扩展的,另外在维克托的背景故事里,他发明了很多具有智能的机械,比如蒸汽机器人,这和我们用 Paddle 来做的事比较相关,我只能想到这么多了。

维克托形象
维克托
  1. 你在加入飞桨开源群之前对 Paddle 的了解是什么样的?有没有听说过一些关于 Paddle 的传闻或者故事?

    黄师傅: 我在加入飞桨开源社区之前,我主要是一个用 PyTorch 跑深度学习实验的研究牲,对 Paddle 的了解也是和 PyTorch 类似的深度学习框架。关于 Paddle 的传闻的话像是国内最早开源的深度学习框架,以及国内最好的深度学习框架。

  2. 你第一个在 GitHub 上完成的 PR 是关于什么的呢?在 PR 的过程中你遇到了什么难题吗?

    黄师傅: 我第一个在 GitHub 上完成的 PR 是 PHI 算子库独立编译开源活动的一个子任务,只需要进行简单的代码替换,没有遇到什么难题,只是第一次改这么大项目的代码有点担心会不会改出什么问题。

    编者注✍️:【PHI 算子库独立编译】是飞桨开源社区的快乐开源活动之一~我们社区有很多类似的、名字听起来很高大上但实际上难度不大的开源活动

  3. 你觉得 Paddle 相比其他深度学习框架有什么优势?可以举个例子么?

    黄师傅: 其他深度学习框架我主要使用过 PyTorch,从用户的视角来比较的话,Paddle 具有丰富的中文文档,包括一些 API 文档和框架开发的技术文档,同时在 AI Studio 上有很多开发者分享的基于 Paddle 实现的项目和以及开发心得可以参考,这些对于国内用户十分友好。另外 Paddle 还有很多开源的套件,用户能够使用这些套件更快地完成一些深度学习应用任务。

  4. 飞桨的开源活动中,你完成的任务中有没有什么特别有趣或者有挑战性的项目?有没有什么技术难题让你觉得很兴奋或者很有成就感?

    黄师傅: 我参加过的很多关于框架开发的开源活动都比较有挑战性,期间遇到的一些困难主要是一些编译问题,然后在通过调试定位问题所在代码、弄清楚问题原因、最后解决问题的时候会比较有成就感。

  5. 据了解,你接触 Paddle 已经有一年多,那么你最欣赏 Paddle 团队中的哪些特点或价值观?为什么?

    黄师傅: 我比较欣赏的一点是 Paddle 团队非常重视开源社区生态,这一点从丰富的社区活动可以看出来,社区开发者可以从中学习到很多东西同时能够获得丰厚的奖励。

  6. 我记得你说过花花和涛姐给了你很多帮助,你觉得他们是怎样的人呢(分别说说🫶🫶)?为什么?

    黄师傅: 花花:飞桨最美运营,关键人家还很努力。 涛姐:为了让开发者能一直有新鲜热乎的开源任务做操碎了心。

    编者注✍️:花花是飞桨社区顶尖运营,涛姐是飞桨社区顶尖研发。

  7. 你是怎么获得去 Paddle 实习的机会的呢?

    黄师傅: 关于我如何获得去 Paddle 实习的机会,当时我刚开始做了一些开源任务,然后在和花花交流的时候以一种半开玩笑的语气问花花能不能去实习,结果没想到花花真的和涛姐提了,然后涛姐真的申请了,飞桨真的给我面试了,然后我面试也真的通过了,然后我就去实习了,一切都是这么突然。

    编者注✍️:其实目前已经有相当多的社区开发者,通过参与开源活动接触到 Paddle,并最终获得实习机会。另外,对于不方便线下实习的同学,我们也提供了远程实习的方案,可以了解往期【护航计划】。

  8. 在 Paddle 实习的时候,你是否参与了某个具体项目的开发?可以分享一下你在项目中的具体角色和贡献吗?

    黄师傅: 我在实习期间刚开始是接着之前在社区参加的 PHI 算子库独立编译开源项目,完成剩下的一些比较困难的任务,花了一个多月的时间完成,剩下的大部分时间参与了结构体 Kernel 注册统一这个项目,期间也会接到一些其他小任务,一共实习了 3 个月吧,基本状态是要我干啥干啥,不会的就问。

  9. 你认为实习那段时间你最大的收获是什么?你认为这段实习经历对你以后的职业生涯规划有起到什么影响?

    黄师傅: 收获很多,体验到了与在学校实验室不同的工作氛围,认识了一些研发大佬,深入了解了 Paddle 的一些机制,积累了一些编译调试和解决问题的经验。在 Paddle 的开源经历和实习经历让我找工作的目标从算法工程师转向了开发工程师,相比于具有不确定性同时很多时候凭借直觉的深度学习算法研究或者应用工作,我发现我更喜欢逻辑性更强且大多数问题都能找到原因的开发工作。

  10. 最后也恭喜你拿到 Paddle 的 offer 🎉,对于同样有志加入 Paddle 团队的学生党,你可以分享一些建议议、经验或者成功路径吗?

    黄师傅: 我感觉我能拿到飞桨 offer 很大一部分原因是我在飞桨的实习经历和参加了一些开源活动,所以我的建议是在学习技术的同时多参加飞桨的开源活动,或者有机会去飞桨实习。

offer
黄师傅的校招 offer 部分截图

三、“著名平台——虎扑评论”专区

这次,我们邀请了一些和黄师傅有过合作经历的朋友们(以及实习期间的导师🐶),贡献一下和黄师傅相关的故事,或者他们对黄师傅的评价~以下均为真心话,请放心看!

编者注✍️:黄师傅有些社恐,所以认识的社区朋友不多,大家正好可以借此机会认识一下。

by 涛姐(luotao1

',17),f=o("h3",{id:"by-日升-yuanrisheng",tabindex:"-1"},[a("by 日升("),o("a",{href:"https://github.com/YuanRisheng",target:"_blank",rel:"noreferrer"},"YuanRisheng"),a(") "),o("a",{class:"header-anchor",href:"#by-日升-yuanrisheng","aria-label":'Permalink to "by 日升([YuanRisheng](https://github.com/YuanRisheng))"'},"​")],-1),b=o("h3",{id:"by-花花-tulip-hua",tabindex:"-1"},[a("by 花花("),o("a",{href:"https://github.com/Tulip-hua",target:"_blank",rel:"noreferrer"},"Tulip-hua"),a(") "),o("a",{class:"header-anchor",href:"#by-花花-tulip-hua","aria-label":'Permalink to "by 花花([Tulip-hua](https://github.com/Tulip-hua))"'},"​")],-1),P=i('
花花的证据
黄师傅欠花花一次分享的证据(花花强烈要求贴上来的)

四、生活中的点点滴滴——黄师傅篇

',2),y=i('
螺狮粉
黄师傅力荐的他认为广州最好吃的《周成芝螺蛳粉》!
原神抽卡
谁懂十连双黄的概念?黄师傅玩几年原神了就这一次

写在最后 💡

【开源江湖闲聊录】 是一项专门为 Paddle 社区的开发者打造的特色访谈栏目📚。在这里,我们邀请到每一位别具一格且富有热情的开发者,通过文字或语音的方式进行深入采访 🎙️,探索并展现他们背后独一无二的故事,将他们的经历、见解和创意整理成精彩内容,呈现给整个社区。


',6),v=JSON.parse('{"title":"【开源江湖闲聊录】从入门到入职(入土):黄师傅的校招 offer 指南!","description":"","frontmatter":{"title":"【开源江湖闲聊录】从入门到入职(入土):黄师傅的校招 offer 指南!","date":"2023-12-05T00:00:00.000Z","author":{"name":"孙钟恺","github":"sunzhongkai588"},"co_authors":[{"name":"文潇(小记者)","github":"wenxiaohahaha"},{"name":"黄济懿(黄师傅)","github":"huangjiyi"}]},"headers":[],"relativePath":"posts/huangjiyi-story.md","filePath":"posts/huangjiyi-story.md"}'),m={name:"posts/huangjiyi-story.md"},A=Object.assign(m,{setup(k){return(T,j)=>(l(),n("div",null,[_,t(r,null,{default:e(()=>[t(s,{name:"骆涛",github:"luotao1"},{default:e(()=>[a(" 我觉得黄师傅是运气真好,类似张无忌,各种捡到宝,当然实力也是重要的。他刚来的时候其实对深度学习框架基本上不了解,然后我们快乐开源刚好放了第一个大任务-phi算子库(解决 CMake 依赖不需要懂深度学习框架)。然后他做啊做,问我们有没有机会来实习,当时 hc 太太太少了,但我们刚做起来,就给他申请,然后他就开挂了 ")]),_:1})]),_:1}),f,t(r,null,{default:e(()=>[t(s,{name:"元日升",github:"YuanRisheng"},{default:e(()=>[a(" 这位同学的工程素养很高,学习能力很强,经常超预期推进项目,最近独立完成高难度项目:飞桨 Flags 工具库建设,开源成果丰硕。另外也是原神大佬,工作累了还能带你打游戏,梦幻队友。 ")]),_:1})]),_:1}),b,t(r,null,{default:e(()=>[t(s,{name:"花花",github:"Tulip-hua"},{default:e(()=>[a(" 原神60级大佬!还欠我一次开源社区分享,请记得! ")]),_:1})]),_:1}),P,t(r,null,{default:e(()=>[t(s,{name:"黄师傅",github:"huangjiyi"},{default:e(()=>[a(" 一张螺狮粉照片,一张游戏截图,这两张图片就代表我大部分的生活了,我也就是个喜欢吃点美食、打打游戏、敲敲代码的普通人。 ")]),_:1})]),_:1}),y]))}});export{v as __pageData,A as default}; diff --git a/assets/posts_huangjiyi-story.md.Bdyh1PqX.lean.js b/assets/posts_huangjiyi-story.md.Bdyh1PqX.lean.js new file mode 100644 index 0000000..822c592 --- /dev/null +++ b/assets/posts_huangjiyi-story.md.Bdyh1PqX.lean.js @@ -0,0 +1 @@ +import{M as r,_ as s}from"./chunks/MessageBox.BjkmF0_f.js";import{c as n,i as t,v as e,l as i,a as o,x as a,o as l}from"./chunks/framework.CEb3mtFd.js";const g="/assets/huangjiyi-01.DXLrvOrw.jpg",d="/assets/huangjiyi-02.7pHNcGD5.jpg",p="/assets/huangjiyi-06.CyxAzjzo.jpg",u="/assets/huangjiyi-03.DYNP8_Fb.jpg",h="/assets/huangjiyi-04.ajHRyHp9.jpg",c="/assets/huangjiyi-05.DzUpMc4V.jpg",_=i("",17),f=o("h3",{id:"by-日升-yuanrisheng",tabindex:"-1"},[a("by 日升("),o("a",{href:"https://github.com/YuanRisheng",target:"_blank",rel:"noreferrer"},"YuanRisheng"),a(") "),o("a",{class:"header-anchor",href:"#by-日升-yuanrisheng","aria-label":'Permalink to "by 日升([YuanRisheng](https://github.com/YuanRisheng))"'},"​")],-1),b=o("h3",{id:"by-花花-tulip-hua",tabindex:"-1"},[a("by 花花("),o("a",{href:"https://github.com/Tulip-hua",target:"_blank",rel:"noreferrer"},"Tulip-hua"),a(") "),o("a",{class:"header-anchor",href:"#by-花花-tulip-hua","aria-label":'Permalink to "by 花花([Tulip-hua](https://github.com/Tulip-hua))"'},"​")],-1),P=i("",2),y=i("",6),v=JSON.parse('{"title":"【开源江湖闲聊录】从入门到入职(入土):黄师傅的校招 offer 指南!","description":"","frontmatter":{"title":"【开源江湖闲聊录】从入门到入职(入土):黄师傅的校招 offer 指南!","date":"2023-12-05T00:00:00.000Z","author":{"name":"孙钟恺","github":"sunzhongkai588"},"co_authors":[{"name":"文潇(小记者)","github":"wenxiaohahaha"},{"name":"黄济懿(黄师傅)","github":"huangjiyi"}]},"headers":[],"relativePath":"posts/huangjiyi-story.md","filePath":"posts/huangjiyi-story.md"}'),m={name:"posts/huangjiyi-story.md"},A=Object.assign(m,{setup(k){return(T,j)=>(l(),n("div",null,[_,t(r,null,{default:e(()=>[t(s,{name:"骆涛",github:"luotao1"},{default:e(()=>[a(" 我觉得黄师傅是运气真好,类似张无忌,各种捡到宝,当然实力也是重要的。他刚来的时候其实对深度学习框架基本上不了解,然后我们快乐开源刚好放了第一个大任务-phi算子库(解决 CMake 依赖不需要懂深度学习框架)。然后他做啊做,问我们有没有机会来实习,当时 hc 太太太少了,但我们刚做起来,就给他申请,然后他就开挂了 ")]),_:1})]),_:1}),f,t(r,null,{default:e(()=>[t(s,{name:"元日升",github:"YuanRisheng"},{default:e(()=>[a(" 这位同学的工程素养很高,学习能力很强,经常超预期推进项目,最近独立完成高难度项目:飞桨 Flags 工具库建设,开源成果丰硕。另外也是原神大佬,工作累了还能带你打游戏,梦幻队友。 ")]),_:1})]),_:1}),b,t(r,null,{default:e(()=>[t(s,{name:"花花",github:"Tulip-hua"},{default:e(()=>[a(" 原神60级大佬!还欠我一次开源社区分享,请记得! ")]),_:1})]),_:1}),P,t(r,null,{default:e(()=>[t(s,{name:"黄师傅",github:"huangjiyi"},{default:e(()=>[a(" 一张螺狮粉照片,一张游戏截图,这两张图片就代表我大部分的生活了,我也就是个喜欢吃点美食、打打游戏、敲敲代码的普通人。 ")]),_:1})]),_:1}),y]))}});export{v as __pageData,A as default}; diff --git a/assets/posts_limin-story.md.CtGmBrw5.js b/assets/posts_limin-story.md.CtGmBrw5.js new file mode 100644 index 0000000..4d639f5 --- /dev/null +++ b/assets/posts_limin-story.md.CtGmBrw5.js @@ -0,0 +1 @@ +import{M as o,_ as n}from"./chunks/MessageBox.BjkmF0_f.js";import{c as l,i as a,v as r,l as i,a as e,x as t,o as s}from"./chunks/framework.CEb3mtFd.js";const g="/assets/limin-01.BhjJniZE.jpg",p="/assets/limin-02.De5NuCyS.jpg",h="/assets/limin-03.ygpgHzH1.jpg",u="/assets/limin-04.L5myDjOV.jpg",c="/assets/limin-05.D2TPwTlm.jpg",d="/assets/limin-06.B8mhuhou.jpg",b="/assets/limin-07.CGDPdTU2.jpg",_=i('

从对 Git 一窍不通到如今能够丝滑完成黑客松赛题,从曾经历鬼门关的生死挣扎到现在能够轻松跑几公里不喘气,从毕业于武大国软学的有志青年到佛系养生的新时代躺平中年,敏师傅 的人生经历就像是那瓶经年陈酿的老酒,醇厚细腻、回味无穷。

一、前言

是谁,天天说自己是 “老咸鱼” ?是谁,戏称自己是 “快奔 4️⃣的老头子”?又是谁,自诩为 “摸🐟王者“?是他、是他、就是他~我们的朋友——敏师傅!!!

limin-01

匿名回复: 我没有,假的,都是假的

敏师傅毕业于武汉大学,目前在珠海某甲方企业工作。作为新时代中年人,敏师傅和许多开源者一样,喜欢躺平、宅家、吃吃吃!但敏师傅不仅喜欢吃,还喜欢做。不仅喜欢做,还擅长烹饪各式各样的美味佳肴,堪称“当代好男人”(敏:“相对的,比群里其他大佬差距还很大!”)、“顶级家庭煮夫”、“万千少女的理想老公🫰❤️(敏:“不是不是,我有主的,理想厨子是真!”)连米国五星上将麦克阿瑟见了都评价道:“不是米其林大厨请不起,而是李敏更具性价比!”

后文有敏师傅的厨艺展示哦~

在健身养身方面,李敏师傅也颇有经验。给他一根杠铃杆,他能撬动整个亚欧大陆!给他一套跑步装备,他能漫步宇宙!著名物理学家阿基米德曾说:“李敏所创造出来的物理奇迹足以改写人类此前所有的力学研究!”无论是极限深蹲、恐怖硬拉还是痛苦卧推,在李敏的面前都不过是老八进厕所手到擒来!

匿名回复: 没有没有,都是瞎说的,手无缚鸡之力!

而在开源方面,作为一个非专业的开源开发者,敏师傅从学习如何提交 PR 做起,到加入 Paddle 的 API 文档修改组,再到后面又积极参加一系列快乐开源活动和更具挑战性的黑客松。正如敏师傅所说:“自己在 Paddle 就像打怪升级一样做各种任务”。在这段 Paddle 的这段旅程中,他一点点精进了自己的技术,也结识了许多热爱开源的小伙伴。接下来让我们去瞧瞧这位多才多艺的“摸🐟老头子”(just kidding😉😉😉)!

左图:李敏师傅
左图:李敏师傅
右图:水群摸鱼日常
右图:水群摸鱼日常

二、采访内容

  1. 介绍一下自己吧,敏师傅!

    敏师傅: 各位大佬好,专业摸鱼,日常躺平晒太阳的咸鱼就是我了。身高 183,体重 170。老胖鱼一条。

  2. 敏师傅说个人爱好之一是宅,那么平时宅在家干什么呢?

    敏师傅: 宅家追剧,鉴于囊中羞涩,又秉持开源,所以都是看免费的(大家不要学我,要支持正版,知识产权法在头顶)。有时会神经质发现地脏,就做个简单的扫除;有时就去公园跑跑步、做做拉伸,尽量让自己活的久点,要不然养老金白交了;要么小主想逛苍蝇馆子,就祭出地图精准定位去吃,吃完回家。

  3. 你曾经有提到在机器学习的过程中自己差点 “见了太祖”,请给大家分享一下这次惊险的经历😮

    匿名回复:不是学习中,是那会刚好在学基础,我出事跟学习无关啊~

    敏师傅: 某年,我在工作中,可能因为淋雨作业、感冒,加上伙食里有沙吧...多种原因叠加在一起,一天上午在办公室突然感到头昏。一开始估摸自己是低血压了,就去卫生队让值班人员量了个血压,结果 40/20。我估计自己身体出了大问题,赶忙让他们打了针 NE,然后喊队长把我送医院。

    到了医院迷迷糊糊的,不敢让自己睡着。一天下了 3 张病危,好像是急性胆囊炎合并肺炎,附加胸腔积液。指标各种超标,医生也不敢手术,一直发烧,让医生给打了丙球续命,中间因为升压药泵注射漏了,整个胳膊肿得不像样,让护士帮忙买土豆切片敷那吸收了才完事,同为三甲,简直了。

    过了 5 天医生估计受不了了,让转广州医院,还好领导派了个人跟着,就整了个车把我送到广总。那边直接说割胆囊,我怕,就说保守治疗,主任也同意了,就在广总住了一个多月。抽血都抽了三四十管,也没查出来病因,多科会诊好几次,像实验体一样躺着被几十人围观好几次。最后我看化验单,连非洲的传染病都查了,结果全是阴性。也就不了了之保守治疗了。先住传染科,然后呼吸内科,然后心内科。反正躺床上被推来推去,哈哈哈。

    那一个多月禁食,每天就是打营养针。就记得那脂肪乳,一瓶能打几个小时,每天从上午 8 点打到晚上 8 点。最后几天,医生才让吃流食,粥都不能喝,只能喝粥上面的米汤,唉。然后回到单位吃了半年的过汤菜(就是把所有菜都放水里洗洗尽量没有油),肚子上的肉都没了,皮都耷拉下来了😂

    编者注✍️:真・大难不死,必有后福啊。不过咱们社区开发者怎么什么离奇的经历都有...?

  4. 听说敏师傅的工作经历也非常曲折有趣,能具体说说么?

    敏师傅: 这个,也没啥。毕业稀里糊涂进了某集团,一开始说干计算机的事,结果一点不沾边,各种其他技能点点了个遍。架设卫星锅,招待上级,液压系统维修,汽车机油液压油更换,气路维修,强电弱电架设,挖坑种树等各种。

    全国各地的沙漠,森林,海岛跑了大半,格尔木睡沙漠,半夜帐篷被吹飞去追帐篷,靖宇睡森林,半夜下暴雨水淹帐篷急忙转移,跟着护林工逛森林,吃野果,挖人参,烧松子,反正东北比西北好玩的多。海岛就懵了,坐船就吐的昏天暗地,然后各种晒脱皮,最难受的地儿。

    后面几年总算是接触计算机,做了个仿真训练系统,抄了一堆网站,各种借调打黑工。然后就想着赶紧滚蛋啥都不想干了,躺平。后面就是学机器学习,接着住院,接着佛系养生。

  5. 你最早接触开源是在什么时候?

    敏师傅: 大学吧,那会为了看越狱、迷失、危机边缘那些。好用的播放器不多,关键是字幕。射手网开源了个播放器,就 SVN 拿下来看了看,支持各种制式视频,最大的特点是可以在线搜索字幕源并选择,在那个 RealPlayer 的年代,真的是非常的优秀。

  6. 那你又是怎么加入到 Paddle 社区的?您对于开源社区的价值和意义是怎样理解的?你认为这些价值和意义在 Paddle 社区又是如何体现的?

    敏师傅: 好像是查飞桨文档学习时,梦师傅的文档修改任务,然后就上了大船。 我觉得在国内做开源真的挺不容易,毕竟开源在绝大部分人认为就是免费,其实也就是免费,而且大家都信奉拿来主义,开源协议那块也不关心。开源需要投入的人力物力财力都是不小的,投入少了,社区和维护不够,BUG 就多了。但绝大多数软件,都是从开源起家的,操作系统、中间件、数据库、应用软件等等,所有层面都有开源的身影,是开源让计算机发展的更迅速,微软都不得不妥协进行开源,可想开源的力量。

    价值和意义的话,就用我接触的几个大佬概括下吧:

    • 涛姐,我所接触到飞桨负责开源的最高级别人物。涛姐从研发那割下来的开源任务,要考虑到我们的能力,不能太难,适众面又要广泛,对应负责的研发还要 Review,都是增加飞桨内部的工作量。然后做黑客松题目时发现,题目所需的,可以把开源题目串起来。这时才发现涛姐选题的前瞻性、系统性、大局观。对整体框架的全局把握才能轻车熟路深入浅出的发布出我们能做的题目。可想而知涛姐的能力有多强 👍。

    • 梦师傅花花,运营的核心 CP,原文档负责人,从任务发布、统计信息、数据到对接第三方,做过统计上报的都能懂,那就是个磨人想砸键盘的活,我们一堆人是一个个点,她们那是一整个面,但凡报上去的信息不对,就是反复的核实修改,线下的活动也组织的有声有色,从历次活动照片能看出参与者欢快的笑容,也反映出组织者的能力有多强。

    • 孙师傅,现 Docathon 发起人和文档总负责任。虽然他总是潜水,而且使用者总说文档有错误。但反过来看,那还不是因为 API 更新快,参数修复多。孙师傅负责的是很庞大的费眼睛的项目,代码嘛,能跑就行,有的使用者只关心 API 怎么用。但文档,是所有人必须要看的,严谨系数其实比代码要高的多,孙师傅劳心劳力确实不容易。

    编者注✍️:梦师傅是产品经理,不是运营哈哈哈。另外,我潜水是因为沉迷工作

  7. 作为一个非专业的开发者,一开始接触 Paddle 的时候你遇了过什么困难或者问题,是怎么解决的?

    敏师傅: 刚开始,对流行的开发是一窍不通。对于 Git,只会把代码下下来自己用,从来没有提过 PR。那会在群里啥也不懂,连 PR 是啥也不知道,Git 其他命令也不会,只会 clone,后来在梦师傅和张师傅的帮助下,看教程。但是那会儿,前面几个 PR 只会在 GitHub 打开单文件修改提交,CI 流程过不去。后来看了张师傅的 PR 教程,才学会了命令提交。

  8. 你有提到最初是看教程学习 Paddle 的,你觉得飞桨的文档和教程怎么样?

    敏师傅: 飞桨文档和教程,在主线这块是维护的很及时的,就是对于分支一些,教程和代码的不同步还是很明显的,记得有个给黑白视频上色的教程,怎么都跑不下来,最后才知道,得用老的仓库代码才行。但教程里的代码,clone 下来必然是最新的。

  9. 你参加过哪些飞桨的开源项目?你最喜欢哪个项目,为什么?

    敏师傅: 参加的挺多,都是摸鱼做做边缘任务,最喜欢的应该是 001 带的任务,因为他基本 724 在线,改 PR 的速度赶不上他 Comment 的速度,哈哈哈哈哈哈。

    编者注✍️:001 (SigureMo)是 Paddle 社区出了名的劳模,望周知。由于是第一位社区 commiter 而被大家称为 001。

  10. 听说你还参加了黑客松,那段经历一定很精彩,能否分享一下你在那期间遇到的有趣事情或者特别人呢?

    敏师傅: 在婷姐带领下做了点 FP16 的任务,在花花带领下写了个 API,跟其他大佬比起来,我这基本就是小学生水平,就记得那会 CI 各种拥挤(当然,责任在我,因为我没环境,只能靠 CI,哈哈哈哈)。

  11. 你觉得 Paddle 社区在吸引和培养新的开发者方面做得如何?是否有一些改进的建议或者想法?

    敏师傅: 我觉得一直都很吸引人,梦师傅、花花、酥酥、孙师傅各种活动都能面面俱到(虽然没实地参加,但看照片能看得出)。 建议想法啥的,我这四肢不发达头脑简单的脑子就算了,跟着大家学就好。🙂

  12. 除了 Paddle 之外,您还参与过其他开源项目吗?如果有的话,您觉得 PaddlePaddle 与其他项目相比有哪些独特之处?

    敏师傅: 其他的么,好像真没,MMEngine 算么,当时要找框架,所以提了 1 个还是 2 个 PR 吧,后面就放弃了,因为没有免费算力可以用😀,还是咱飞桨好用。

  13. 在与花花、孙师傅、梦师傅、涛姐和其他 Paddle 大佬的交流中,您学到了哪些知识和经验?对您的技术有哪些影响呢

    敏师傅: 平时怕他们忙,基本不主动找各位大佬。我们这都是点,她(他)们那是面,所以她们的工作量肯定是非常大的,能不打扰就不打扰。

  14. 对于在某甲方公司工作,敏师傅有没有一些摸鱼小技巧可以分享一下呢?你是如何平衡工作和生活的?

    敏师傅: 摸鱼技巧?开会带本书,看看会议就过去了,反正路人甲一个,一般就用“三不”回答:不会、不懂、不知道。领导的决定都是对的,领导的决策都不会错,错了那也是我们马仔理解不够深,执行不彻底,落实不到位。

    平衡工作生活的话,下了班就 不干活,遵守 995,除了大值班,这都得参加,没啥说的。

    编者注✍️:学到了。

  15. 对于那些想要成为开源贡献者的人,您有什么鼓励和建议?

    敏师傅: 不管是不是科班出身,大项目里开源一般有利无害的吧。我毕业太久,现在的应聘肯定卷出了天际,啥力扣 ACM 估计都是基操,能用开源项目加分的话,先进大厂实习再氪肝留大厂也是条路吧。说的不一定对,请客观看待。

  16. 最后,敏师傅还有什么想和大家说的么?

    敏师傅: 有新手怪的话,大佬们给我留点。我还是砍砍史莱姆和稻草人就好😀。

三、著名大型评论平台——虎扑评论专区

敏师傅和太多的人打过交道了。由于篇幅的原因,我们邀请了部分和敏师傅有过合作经历的朋友们,贡献一下他们和敏师傅发生的故事,或者对敏师傅的评价~以下均为真心话,请放心食用!

limin-04

by 孙师傅(sunzhongkai588

',17),m=e("br",null,null,-1),f=e("h3",{id:"by-婷姐-zhangting2020",tabindex:"-1"},[t("by 婷姐("),e("a",{href:"https://github.com/zhangting2020",target:"_blank",rel:"noreferrer"},"zhangting2020"),t(") "),e("a",{class:"header-anchor",href:"#by-婷姐-zhangting2020","aria-label":'Permalink to "by 婷姐([zhangting2020](https://github.com/zhangting2020))"'},"​")],-1),y=e("h3",{id:"by-汪师傅-greatv",tabindex:"-1"},[t("by 汪师傅("),e("a",{href:"https://github.com/GreatV",target:"_blank",rel:"noreferrer"},"GreatV"),t(") "),e("a",{class:"header-anchor",href:"#by-汪师傅-greatv","aria-label":'Permalink to "by 汪师傅([GreatV](https://github.com/GreatV))"'},"​")],-1),P=e("h3",{id:"by-花花-tulip-hua",tabindex:"-1"},[t("by 花花("),e("a",{href:"https://github.com/Tulip-hua",target:"_blank",rel:"noreferrer"},"Tulip-hua"),t(") "),e("a",{class:"header-anchor",href:"#by-花花-tulip-hua","aria-label":'Permalink to "by 花花([Tulip-hua](https://github.com/Tulip-hua))"'},"​")],-1),k=e("blockquote",null,[e("p",null,"编者注✍️:下面这位就是花师傅说的时好时坏的 002 ⬇️")],-1),q=e("h3",{id:"by-张师傅-liyulingyue",tabindex:"-1"},[t("by 张师傅("),e("a",{href:"https://github.com/liyulingyue",target:"_blank",rel:"noreferrer"},"liyulingyue"),t(") "),e("a",{class:"header-anchor",href:"#by-张师傅-liyulingyue","aria-label":'Permalink to "by 张师傅([liyulingyue](https://github.com/liyulingyue))"'},"​")],-1),T=e("h3",{id:"by-独师傅-longranger2",tabindex:"-1"},[t("by 独师傅("),e("a",{href:"https://github.com/longranger2",target:"_blank",rel:"noreferrer"},"longranger2"),t(") "),e("a",{class:"header-anchor",href:"#by-独师傅-longranger2","aria-label":'Permalink to "by 独师傅([longranger2](https://github.com/longranger2))"'},"​")],-1),x=e("br",null,null,-1),I=e("h3",{id:"by-陈沧夜-mrcangye",tabindex:"-1"},[t("by 陈沧夜("),e("a",{href:"https://github.com/mrcangye",target:"_blank",rel:"noreferrer"},"mrcangye"),t(") "),e("a",{class:"header-anchor",href:"#by-陈沧夜-mrcangye","aria-label":'Permalink to "by 陈沧夜([mrcangye](https://github.com/mrcangye))"'},"​")],-1),C=e("h3",{id:"by-梦师傅-ligoml",tabindex:"-1"},[t("by 梦师傅("),e("a",{href:"https://github.com/Ligoml",target:"_blank",rel:"noreferrer"},"Ligoml"),t(") "),e("a",{class:"header-anchor",href:"#by-梦师傅-ligoml","aria-label":'Permalink to "by 梦师傅([Ligoml](https://github.com/Ligoml))"'},"​")],-1),V=i('
梦的证据
敏哥安慰梦师傅的聊天截图

四、敏师傅的佛系养身 TIME~🏃‍♀️🏋️‍♀️⛹️‍♀️🚴‍♀️🤸‍♀️👯‍♂️💪

经历

先设定个小目标,就减肥吧,然后开始了漫长的减肥计划。 一开始 3 公里都难跑及格,啥也不管,先开跑,同时补充氨糖和维生素,免得关节废了。好像从 95 跑到 85 后,各种体测也没问题了。前几个月体重掉的快,后来基本一个月一公斤,逐渐五公里到十公里,最后跑了个半马试试自己的耐力。然后体重就到了瓶颈期,跑步成了热身,体重不减,体脂不减,请教专业人士,开始上力量,原始三件套:深蹲,硬拉,卧推。先慢跑 3 公里,然后负重训练。后来逐渐加上 HIIT,体重最轻的时候到了 70 公斤。

过来人的小 tips💡

总结一下大概如下:热身是必要的,体重大先用有氧减脂,一开始不用太在意体重,练就完了,碳水和蛋白质要保证,氨糖和维生素也是必备,到了某天会发现衣服大了,体重下来了。到了瓶颈期就可以上力量,没有条件就用 HIIT 代替,比如斯巴达 500,虽然痛苦,但是非常有效,提升新陈代谢率,提高心肺功能。在上力量时,如果有体检,会发现尿酸升高,这个是力量训练中常有的,可以暂停一周再复测,正常值后就说明是力量训练导致,就不用担心了。

五、彩蛋 🥚

1. 十项全能的家庭煮夫敏敏子在线狂秀厨艺

',8),z=i('
左图:李敏师傅
敏哥做的菜-1
右图:水群摸鱼日常
敏哥做的菜-2

2. 敏哥个人自述

敏哥在采访前也精心写了一份【个人自述】,篇幅过长就不贴在正文了,好奇的话可以读一下哦~

编者注✍️:留个彩蛋!我把它放在了博客 GitHub repo 下的 src/eggs/limin-story/ 文件夹下哦~


写在最后 💡

【开源江湖闲聊录】 是一项专门为 Paddle 社区的开发者打造的特色访谈栏目📚。在这里,我们邀请到每一位别具一格且富有热情的开发者,通过文字或语音的方式进行深入采访 🎙️,探索并展现他们背后独一无二的故事,将他们的经历、见解和创意整理成精彩内容,呈现给整个社区。


',8),w=JSON.parse('{"title":"【开源江湖闲聊录】躺平健身搞开源:敏师傅的三十而立","description":"","frontmatter":{"title":"【开源江湖闲聊录】躺平健身搞开源:敏师傅的三十而立","date":"2023-12-07T00:00:00.000Z","author":{"name":"孙钟恺","github":"sunzhongkai588"},"co_authors":[{"name":"文潇(小记者)","github":"wenxiaohahaha"},{"name":"李敏(敏师傅)","github":"enkilee"}]},"headers":[],"relativePath":"posts/limin-story.md","filePath":"posts/limin-story.md"}'),R={name:"posts/limin-story.md"},N=Object.assign(R,{setup(S){return(j,A)=>(s(),l("div",null,[_,a(o,null,{default:r(()=>[a(n,{name:"孙钟恺",github:"sunzhongkai588"},{default:r(()=>[t(" 一开始对敏哥印象深刻,是因为敏哥的微信昵称拼音——讷言敏行(nè yán mǐn xíng),总共 4 个,有位前同事能把其中 2 个读错成 nà ... ... háng。🤣 "),m,t(" 之后,从提文档修复的 PR 开始,就能明显感觉到敏哥的进步,再到后来敏哥能一口气把好多快乐开源任务都认领完成了,真的非常厉害。 ")]),_:1})]),_:1}),f,a(o,null,{default:r(()=>[a(n,{name:"张婷",github:"zhangting2020"},{default:r(()=>[t(" 敏师傅领题目、push 研发超积极。最厉害的是自己不做测试的,都是一把改完 push 上去看 CI 结果,也不需要 GPU 算力(手动狗头),以充分利用婷姐的脑力资源为主。 ")]),_:1})]),_:1}),y,a(o,null,{default:r(()=>[a(n,{name:"汪昕",github:"GreatV"},{default:r(()=>[t(" 敏师傅,当然是实力超强的摸鱼仙人 ")]),_:1})]),_:1}),P,a(o,null,{default:r(()=>[a(n,{name:"花花",github:"Tulip-hua"},{default:r(()=>[t(" 众所周知,飞桨开源社区分为两股势力:以敏师傅为首的好人阵营,以 002 为首的时好时坏阵营。 ")]),_:1})]),_:1}),k,q,a(o,null,{default:r(()=>[a(n,{name:"张一乔",github:"liyulingyue"},{default:r(()=>[t(" 敏师傅简直是吾辈楷模,能愉快的摸鱼提 PR,还有老婆,真让人羡慕。 ")]),_:1})]),_:1}),T,a(o,null,{default:r(()=>[a(n,{name:"张伟鸿",github:"longranger2"},{default:r(()=>[t(" 敏师傅给我的感觉就如同金庸武侠小说里的扫地僧,活跃在飞桨各大大小小的社区当中,神秘而且武功深不可测,有极高技艺却又深藏不露。嘴上说着摸鱼,但上班的时候提起 PR 毫不手软(敏师傅,咱贵公司还招人吗[可怜])。敏师傅也是一部行走的百科全书,上知天文,下知地理,尤其对吃的颇有造诣,如果你想知道不同地方的美食,问敏师傅就对了。 "),x,t(" 不过我也得来吐槽下敏师傅,平时我认领的任务还没开始做的时候,张师傅都是口嗨说要背刺我,但只有敏师傅是来真的,直接把我认领的任务做了,希望敏师傅下次能给我留口汤喝,ball ball you 了😭 ")]),_:1})]),_:1}),I,a(o,null,{default:r(()=>[a(n,{name:"陈龙",github:"mrcangye"},{default:r(()=>[t(" 敏师傅是我人生重要的领路人之一,每次抉择迷茫时候,敏师傅总会用他经验满满的信息差对我的迷茫分叉口进行降维打击!最后让我拨云见月,酣畅淋漓! ")]),_:1})]),_:1}),C,a(o,null,{default:r(()=>[a(n,{name:"梦柳",github:"Ligoml"},{default:r(()=>[t(" 敏哥人超好!职场导师+1 ")]),_:1})]),_:1}),V,a(o,null,{default:r(()=>[a(n,{name:"敏师傅",github:"enkilee"},{default:r(()=>[t(" 自我宣言:本人手艺还行,刀工一般,之前在某集团时没事跑去炊事班练练手,打打牙祭。煎、炒、烹、炸、焖、炖、溜、熬、蒸、烩、煮、烙、汆、酿、扒、烧都会烧点。 ")]),_:1})]),_:1}),z]))}});export{w as __pageData,N as default}; diff --git a/assets/posts_limin-story.md.CtGmBrw5.lean.js b/assets/posts_limin-story.md.CtGmBrw5.lean.js new file mode 100644 index 0000000..e1c635b --- /dev/null +++ b/assets/posts_limin-story.md.CtGmBrw5.lean.js @@ -0,0 +1 @@ +import{M as o,_ as n}from"./chunks/MessageBox.BjkmF0_f.js";import{c as l,i as a,v as r,l as i,a as e,x as t,o as s}from"./chunks/framework.CEb3mtFd.js";const g="/assets/limin-01.BhjJniZE.jpg",p="/assets/limin-02.De5NuCyS.jpg",h="/assets/limin-03.ygpgHzH1.jpg",u="/assets/limin-04.L5myDjOV.jpg",c="/assets/limin-05.D2TPwTlm.jpg",d="/assets/limin-06.B8mhuhou.jpg",b="/assets/limin-07.CGDPdTU2.jpg",_=i("",17),m=e("br",null,null,-1),f=e("h3",{id:"by-婷姐-zhangting2020",tabindex:"-1"},[t("by 婷姐("),e("a",{href:"https://github.com/zhangting2020",target:"_blank",rel:"noreferrer"},"zhangting2020"),t(") "),e("a",{class:"header-anchor",href:"#by-婷姐-zhangting2020","aria-label":'Permalink to "by 婷姐([zhangting2020](https://github.com/zhangting2020))"'},"​")],-1),y=e("h3",{id:"by-汪师傅-greatv",tabindex:"-1"},[t("by 汪师傅("),e("a",{href:"https://github.com/GreatV",target:"_blank",rel:"noreferrer"},"GreatV"),t(") "),e("a",{class:"header-anchor",href:"#by-汪师傅-greatv","aria-label":'Permalink to "by 汪师傅([GreatV](https://github.com/GreatV))"'},"​")],-1),P=e("h3",{id:"by-花花-tulip-hua",tabindex:"-1"},[t("by 花花("),e("a",{href:"https://github.com/Tulip-hua",target:"_blank",rel:"noreferrer"},"Tulip-hua"),t(") "),e("a",{class:"header-anchor",href:"#by-花花-tulip-hua","aria-label":'Permalink to "by 花花([Tulip-hua](https://github.com/Tulip-hua))"'},"​")],-1),k=e("blockquote",null,[e("p",null,"编者注✍️:下面这位就是花师傅说的时好时坏的 002 ⬇️")],-1),q=e("h3",{id:"by-张师傅-liyulingyue",tabindex:"-1"},[t("by 张师傅("),e("a",{href:"https://github.com/liyulingyue",target:"_blank",rel:"noreferrer"},"liyulingyue"),t(") "),e("a",{class:"header-anchor",href:"#by-张师傅-liyulingyue","aria-label":'Permalink to "by 张师傅([liyulingyue](https://github.com/liyulingyue))"'},"​")],-1),T=e("h3",{id:"by-独师傅-longranger2",tabindex:"-1"},[t("by 独师傅("),e("a",{href:"https://github.com/longranger2",target:"_blank",rel:"noreferrer"},"longranger2"),t(") "),e("a",{class:"header-anchor",href:"#by-独师傅-longranger2","aria-label":'Permalink to "by 独师傅([longranger2](https://github.com/longranger2))"'},"​")],-1),x=e("br",null,null,-1),I=e("h3",{id:"by-陈沧夜-mrcangye",tabindex:"-1"},[t("by 陈沧夜("),e("a",{href:"https://github.com/mrcangye",target:"_blank",rel:"noreferrer"},"mrcangye"),t(") "),e("a",{class:"header-anchor",href:"#by-陈沧夜-mrcangye","aria-label":'Permalink to "by 陈沧夜([mrcangye](https://github.com/mrcangye))"'},"​")],-1),C=e("h3",{id:"by-梦师傅-ligoml",tabindex:"-1"},[t("by 梦师傅("),e("a",{href:"https://github.com/Ligoml",target:"_blank",rel:"noreferrer"},"Ligoml"),t(") "),e("a",{class:"header-anchor",href:"#by-梦师傅-ligoml","aria-label":'Permalink to "by 梦师傅([Ligoml](https://github.com/Ligoml))"'},"​")],-1),V=i("",8),z=i("",8),w=JSON.parse('{"title":"【开源江湖闲聊录】躺平健身搞开源:敏师傅的三十而立","description":"","frontmatter":{"title":"【开源江湖闲聊录】躺平健身搞开源:敏师傅的三十而立","date":"2023-12-07T00:00:00.000Z","author":{"name":"孙钟恺","github":"sunzhongkai588"},"co_authors":[{"name":"文潇(小记者)","github":"wenxiaohahaha"},{"name":"李敏(敏师傅)","github":"enkilee"}]},"headers":[],"relativePath":"posts/limin-story.md","filePath":"posts/limin-story.md"}'),R={name:"posts/limin-story.md"},N=Object.assign(R,{setup(S){return(j,A)=>(s(),l("div",null,[_,a(o,null,{default:r(()=>[a(n,{name:"孙钟恺",github:"sunzhongkai588"},{default:r(()=>[t(" 一开始对敏哥印象深刻,是因为敏哥的微信昵称拼音——讷言敏行(nè yán mǐn xíng),总共 4 个,有位前同事能把其中 2 个读错成 nà ... ... háng。🤣 "),m,t(" 之后,从提文档修复的 PR 开始,就能明显感觉到敏哥的进步,再到后来敏哥能一口气把好多快乐开源任务都认领完成了,真的非常厉害。 ")]),_:1})]),_:1}),f,a(o,null,{default:r(()=>[a(n,{name:"张婷",github:"zhangting2020"},{default:r(()=>[t(" 敏师傅领题目、push 研发超积极。最厉害的是自己不做测试的,都是一把改完 push 上去看 CI 结果,也不需要 GPU 算力(手动狗头),以充分利用婷姐的脑力资源为主。 ")]),_:1})]),_:1}),y,a(o,null,{default:r(()=>[a(n,{name:"汪昕",github:"GreatV"},{default:r(()=>[t(" 敏师傅,当然是实力超强的摸鱼仙人 ")]),_:1})]),_:1}),P,a(o,null,{default:r(()=>[a(n,{name:"花花",github:"Tulip-hua"},{default:r(()=>[t(" 众所周知,飞桨开源社区分为两股势力:以敏师傅为首的好人阵营,以 002 为首的时好时坏阵营。 ")]),_:1})]),_:1}),k,q,a(o,null,{default:r(()=>[a(n,{name:"张一乔",github:"liyulingyue"},{default:r(()=>[t(" 敏师傅简直是吾辈楷模,能愉快的摸鱼提 PR,还有老婆,真让人羡慕。 ")]),_:1})]),_:1}),T,a(o,null,{default:r(()=>[a(n,{name:"张伟鸿",github:"longranger2"},{default:r(()=>[t(" 敏师傅给我的感觉就如同金庸武侠小说里的扫地僧,活跃在飞桨各大大小小的社区当中,神秘而且武功深不可测,有极高技艺却又深藏不露。嘴上说着摸鱼,但上班的时候提起 PR 毫不手软(敏师傅,咱贵公司还招人吗[可怜])。敏师傅也是一部行走的百科全书,上知天文,下知地理,尤其对吃的颇有造诣,如果你想知道不同地方的美食,问敏师傅就对了。 "),x,t(" 不过我也得来吐槽下敏师傅,平时我认领的任务还没开始做的时候,张师傅都是口嗨说要背刺我,但只有敏师傅是来真的,直接把我认领的任务做了,希望敏师傅下次能给我留口汤喝,ball ball you 了😭 ")]),_:1})]),_:1}),I,a(o,null,{default:r(()=>[a(n,{name:"陈龙",github:"mrcangye"},{default:r(()=>[t(" 敏师傅是我人生重要的领路人之一,每次抉择迷茫时候,敏师傅总会用他经验满满的信息差对我的迷茫分叉口进行降维打击!最后让我拨云见月,酣畅淋漓! ")]),_:1})]),_:1}),C,a(o,null,{default:r(()=>[a(n,{name:"梦柳",github:"Ligoml"},{default:r(()=>[t(" 敏哥人超好!职场导师+1 ")]),_:1})]),_:1}),V,a(o,null,{default:r(()=>[a(n,{name:"敏师傅",github:"enkilee"},{default:r(()=>[t(" 自我宣言:本人手艺还行,刀工一般,之前在某集团时没事跑去炊事班练练手,打打牙祭。煎、炒、烹、炸、焖、炖、溜、熬、蒸、烩、煮、烙、汆、酿、扒、烧都会烧点。 ")]),_:1})]),_:1}),z]))}});export{w as __pageData,N as default}; diff --git a/assets/posts_loaf-sharing.md.CLynDrU1.js b/assets/posts_loaf-sharing.md.CLynDrU1.js new file mode 100644 index 0000000..a9cf897 --- /dev/null +++ b/assets/posts_loaf-sharing.md.CLynDrU1.js @@ -0,0 +1 @@ +import{_ as t,c as s,o,l as a}from"./chunks/framework.CEb3mtFd.js";const r="/assets/loaf-1.DZaFXaGl.jpg",e="/assets/loaf-2.C5vilUke.jpg",p="/assets/loaf-3.-v8qKROs.jpg",n="/assets/loaf-4.CyalVKQV.jpg",l="/assets/loaf-5.CtZZjeUz.jpg",i="/assets/loaf-6.Bi0vscBh.jpg",g="/assets/loaf-7.CJq_cUQ-.jpg",c="/assets/loaf-8.VWs4ngSl.jpg",_="/assets/loaf-9.C4UjXp3U.jpg",h="/assets/loaf-10.Cb3b4g6B.jpg",S=JSON.parse('{"title":"如何在开源社区摸 🐟?","description":"","frontmatter":{"title":"如何在开源社区摸 🐟?","date":"2023-12-18T00:00:00.000Z","author":{"name":"孙钟恺","github":"sunzhongkai588"}},"headers":[],"relativePath":"posts/loaf-sharing.md","filePath":"posts/loaf-sharing.md"}'),f={name:"posts/loaf-sharing.md"},m=a('

本篇博客文章的内容,来源于作者在「第八届中国开源年会」上分享的一次主题为 「如何在开源社区摸 🐟」 的闪电演讲,以下的部分为演讲的具体内容。

loaf-01

01-个人简介

大家好,今天我想分享的主题是 「如何在开源社区摸 🐟」。在演讲开始前先自我介绍一下,我叫孙钟恺,社区里的开发者都称呼我为 孙师傅,下图为我的 Github ID、头像和贡献热力图。

loaf-02

从上面的职业标签可以看出,我是入职百度一年半(0.5🐔年)、目前负责 Paddle 开源社区以及官网文档的飞桨校招产品经理。作为一名新人,我也没有什么特长,唯一擅长的就是摸 🐟 吧~所以在这里也和大家分享一下我的摸 🐟 经验。

02-摸 🐟 经验

我的摸鱼经验其实从这幅图就可以说明白,就是工作上三思而后行

  • 第一,这工作能不能不做
  • 第二,这工作能不能晚点做
  • 第三,这工作能不能交给别人做

loaf-03

但是,理想是丰满的,现实是骨感的。老板的回复也很直接:

  • 第一,你能不能滚蛋;
  • 第二,你能不能早点滚蛋。

不过对于第三点呢,老板似乎不太抗拒(反正不是交给他做🐶)。于是我就在思考,也许可以通过“把工作转交给别人”的方式,来简单摸个 🐟。

那么问题来了,具体交给谁做呢?我看向了我的同事和研发大爷们。经过几百回的试探和心理博弈后,研发大爷们均以“人力不够”、“优先级低”等借口来拒绝我。而且咱们研发工作日做牛做马,一到周末直接原地消失了,一看 GitHub 热力图,周六、周日都是空的。

补充:不过这也说明百度还算是一个遵守劳动法的公司,周末都是双休的~

然后,我把我的目光转向了社区开发者们。哎,发现他们的开源热情似乎还是很高涨的,有的开发者甚至把开源视为人生价值(“工作就是图一乐”、“人生价值实现还得靠开源”)我又翻了翻一些社区开发者的 GitHub 热力图,一看吓一跳 😮,绿油油的一片,7*24 小时全职开源。

loaf-04

至此之后呢,我就把 “把活儿交给社区开发者”,作为我摸 🐟 的核心思想。

loaf-05

但是,怎么“把活儿交给社区开发者”,也是需要讲点基本法的,所以我总结了两条方法~

03-「把活儿交给社区开发者」初级版

首先,我先介绍一下初级版,即把一些 明确的轻量级任务 交给社区开发者做。

怎么理解呢?其实很多问题已经由社区开发者和内部研发进行多轮讨论了,并经过 任务拆解 后,形成了可以直接去上手做的轻量级任务。这些轻量级任务最终会公布到社区,并以 tracking issue 的形式进行发布和追踪,下图右方就是部分的这类任务。

loaf-06

因为这些任务相对简单、好上手,社区开发者反馈其实非常好,有些人可能周末会去做,有些人甚至上班摸鱼的时候也在做。

发布这类任务的优点在于——因为任务比较简单,“啪”的一下做的很快,完成率又特别高。更重要的是,开发者也会很愉悦,比如花一个小时提一个 PR 上来,就能把任务做完了,很容易带来满足感~(而且也会有小礼品)

不过这类任务也有一些缺点——这些任务需要花精力进行任务的拆解、详细的描述,甚至还可能需要指导和大量的 Review。所以这 🐟 虽然摸了,但只摸了一半。

loaf-07

03-「把活儿交给社区开发者」终极摸鱼版

基于上述,我之后又总结了终极摸鱼版的方法,就是 把问题交由社区开发者来主导

怎么理解呢?就是我们飞桨只提供大概的题目和方向,由社区开发者根据问题 自行进行拆解,然后在我们的指导下开展任务。比较典型的是 将 xdoctest 引入飞桨工作流,这个题目是由社区开发者顺师傅(@megemini)来完成的。

xdoctest 是一个文档示例代码的检查工具。

从下面右半边可以看到,顺师傅按自己的理解对任务进行拆解,分为不同的阶段,并有条不紊的完成。并且还衍生出了一些批量的社区任务,比如全量的修改了飞桨一千多个 API 的示例代码。这是一个人完成不了的,需要号召更多的社区开发者来参与,因此这个项目也极大调动了整个社区的氛围和活力。

loaf-08

所以说,其实把问题交给社区开发者主导,会有很多积极的方面~一方面能够帮我们分担了很大的研发精力(帮我们摸 🐟),另一方面也会不经意间对整个社区有正向的影响力。

04-摸 🐟 的前提条件

最后也提一下,其实摸鱼也有很多前提条件,需要有良好的社区氛围丝滑的社区交流研发的大力支持运营的宣传推广...这些条件都是缺一不可的~所以虽然是摸鱼,但也需要遵循很多客观规律。

loaf-09


以上是我演讲的全部内容,感谢大家的观看~

loaf-10

',41),d=[m];function u(b,k,q,P,j,x){return o(),s("div",null,d)}const T=t(f,[["render",u]]);export{S as __pageData,T as default}; diff --git a/assets/posts_loaf-sharing.md.CLynDrU1.lean.js b/assets/posts_loaf-sharing.md.CLynDrU1.lean.js new file mode 100644 index 0000000..f7f6afa --- /dev/null +++ b/assets/posts_loaf-sharing.md.CLynDrU1.lean.js @@ -0,0 +1 @@ +import{_ as t,c as s,o,l as a}from"./chunks/framework.CEb3mtFd.js";const r="/assets/loaf-1.DZaFXaGl.jpg",e="/assets/loaf-2.C5vilUke.jpg",p="/assets/loaf-3.-v8qKROs.jpg",n="/assets/loaf-4.CyalVKQV.jpg",l="/assets/loaf-5.CtZZjeUz.jpg",i="/assets/loaf-6.Bi0vscBh.jpg",g="/assets/loaf-7.CJq_cUQ-.jpg",c="/assets/loaf-8.VWs4ngSl.jpg",_="/assets/loaf-9.C4UjXp3U.jpg",h="/assets/loaf-10.Cb3b4g6B.jpg",S=JSON.parse('{"title":"如何在开源社区摸 🐟?","description":"","frontmatter":{"title":"如何在开源社区摸 🐟?","date":"2023-12-18T00:00:00.000Z","author":{"name":"孙钟恺","github":"sunzhongkai588"}},"headers":[],"relativePath":"posts/loaf-sharing.md","filePath":"posts/loaf-sharing.md"}'),f={name:"posts/loaf-sharing.md"},m=a("",41),d=[m];function u(b,k,q,P,j,x){return o(),s("div",null,d)}const T=t(f,[["render",u]]);export{S as __pageData,T as default}; diff --git a/assets/posts_nknan-story.md.C0DqNXs8.js b/assets/posts_nknan-story.md.C0DqNXs8.js new file mode 100644 index 0000000..60a891b --- /dev/null +++ b/assets/posts_nknan-story.md.C0DqNXs8.js @@ -0,0 +1 @@ +import{M as n,_ as i}from"./chunks/MessageBox.BjkmF0_f.js";import{c as l,i as t,v as a,l as o,a as s,x as e,o as r}from"./chunks/framework.CEb3mtFd.js";const g="/assets/NKNaN-1.L6B9mBNY.jpeg",N="/assets/NKNaN-2.DsOESAXA.jpeg",p="/assets/NKNaN-3.BgREEBki.jpeg",u="/assets/NKNaN-4.aUQgvqgN.jpeg",f="/assets/NKNaN-5.CRSa-9AH.jpeg",d="/assets/NKNaN-6.Cs90Nvon.jpeg",_="/assets/NKNaN-7.BpooYvDx.jpeg",h="/assets/NKNaN-8.DxaDPc8s.jpeg",c="/assets/NKNaN-9.BRRQUkq7.jpeg",m="/assets/NKNaN-10.OH6Ys9wN.jpeg",K=o('

大家好!这次我们有幸采访到社区中的一位特别的朋友——NKNaN。她不仅是飞桨社区中的佼佼者,对于开发中的难题总能迎刃而解,也是一位才华横溢且性格随和的女性开发者。通过这次的对话,我们将一起走进李睿文的日常生活,了解她在社区背后充满转折和惊喜的个人故事~

一、前言

NKNaN 是我们社区中的一位特别的成员,她不仅是我们社区中少有的女性猛将,更是一个勇敢跨界的探索者。从西安的古城墙到香港的繁华街道,再到可能的北美新生活,她的脚步从未停歇。她的学术之旅横跨金融、数学和计算机科学,每一步都显得那么自然而充满挑战。

NKNaN 的职业生涯同样精彩纷呈——她曾冲动地辞去稳定的工作,追寻博士学位的梦想,但在一年后,她又勇敢地决定放弃,选择重新探索适合自己的道路。无论是在学术界还是生活中,NKNaN 都以她独有的风格和魅力,展示了自己对生活的热情和对技术的执着。

她的故事不仅充满了色彩,还散发着温暖的光芒。让我们一起走进 NKNaN 的世界,看她如何在技术的大潮中保持真我,用代码和智慧编织自己的梦想,享受那份难得的轻松和自在。

二、采访内容

  1. 介绍一下自己吧,Nan 佬!

    NKNaN: 哈喽大家好,我是百度飞桨社区的个人开发者 NKNaN,非常荣幸能够被选中参与这次采访~我老家在西安,本科毕业于香港理工大学金融服务专业,(水)master 毕业于香港科技大学金融科技专业。因为想要出国看看外面的世界,目前正在申请北美的 CS 项目。关于我自己的话,平时比较宅,喜欢室内的活动,撸猫、弹钢琴、看动画片、写代码;偶尔外出,外出的话喜欢随手拍拍风景?MBTI 是 INFJ,还被人誉为 I 人中的 I 人。

    撸猫
    撸猫
    看透一切的猫猫
    看透一切的猫猫
    随拍
    随拍
  2. 看到你本科在香港理工大学就读工商管理专业,可以聊聊当时为什么选择这个专业呀?以及为什么选择去香港读书?

    NKNaN: 专业是家里人给我选的。因为我爸妈都在银行工作,他们就觉得学了这个,以后进银行比较方便呗~

    选择去香港也是父母决定,他们可能觉得香港是亚洲金融中心之类的,更加国际化一点。所以当时高考完了之后,父母告诉我可以选择香港这条路,就用高考成绩给我报了香港的学校。当时香港所有学校都申了,但港前三所都要面试,我英语口语又差,就挂掉了,最后还是选择了港理工。

    但现在回过头看看决策还挺失误的,一开始就没有规划好就选择了去香港。这人生地不熟的,又不能转专业,还是太听父母话了。

    维港
    本科大二最后一次去维港,之后疫情就回家网课了qaq
  3. 觉得失误是因为对本科专业不太喜欢吗?但看你本科专业学的很好、绩点非常高,还获得了学院杰出学术成就奖!

    NKNaN: 这个奖是按每一年小专业的排名发的,如果在本专业排前三的话就能获得。可能我们专业比较废,大部分人都比较菜,像其他那些小专业的获奖大佬,他们的分数就比我高。

    而且其实我的专业算是文科。文科怎么说呢,学和不学感觉好像没啥区别?像我们绝大部分课程的 assessment,很大一部分得分占比是通过写 essay 来拿分,但 essay 人家愿意给你几分就给你几分,纯看人家的心情。所以这边也奉劝大家,如果对自己写文商课小论文的能力没有十足把握千万不要来学商科!!

    另外,商科如果想学得好,英语好是最基础的。家里资源也要好,还不能是 i 人!像做 presentation 的时候,必须要表现的很 expressive,要能说(吹)出来好多东西。但我就是 i 人,不太适合商科这种风格,还是喜欢做一些具象化的成果。

    所以本科的时候就想转计算机了,但学校太坑太死板了,不让转专业,就只能去辅修。当时成绩好的人都会去辅修数学或者计算机(好多人都去辅修计算机)因为我的 GPA 不够,最后就选择辅修数学了~其实自己也想往计算机方面靠,就自学了 Machine Learning 之类的课程,后来读的 master 也是香港科技大学的金融科技专业。

  4. 想学计算机是因为兴趣吗?还是因为赚钱多呀(笑)

    NKNaN: 一开始确实是基于自己兴趣吧,后来发现这个赚钱确实也挺多的~不过感觉对计算机感兴趣的女孩子确实可能比较少一点。

  5. 研究生毕业之后,你在上海某银行的金融科技子公司短暂工作了一年,可以讲讲吗?

    NKNaN: (先给公司打个码)我当时入职了智能风控组,主要是用机器学习模型给风控项目做建模,比较传统和偏业务。但实际上做的事情挺杂的,还会做一些客户信用评分卡评级之类的事,会用到一些统计学习模型,基本就是调调参数。我自己对这种工作没有非常大的热情,想看看能不能读个博提升一下(虽然后来发现读错了),就有点冲动的裸辞了,也不建议大家学习。

    不过那里的团队氛围真心很 nice,大家的关系都很融洽,比较扁平化,入职之后会有很多破冰以及团建的活动,平时也会互相分享技术心得。

    上海某公园团建-1
    上海某公园团建-1
    上海某公园团建-2
    上海某公园团建-2
  6. 冲动是因为受到刺激了吗?

    NKNaN: 对,确实有点受刺激。那份工作工资很少,一个月没有补贴的时候只有 9k,有补贴的时候也只有一万多一点(应届生刚进来的工资),这还是在上海!向上发展的路线我也比较迷茫,走技术路线在那里好像待遇一般,走管理路线又不太适合我。而且杂事也多,像处理一些数据都算正事了,很多时候会做和工作完全无关的事,就比如说组织什么活动、清点一下资产、给部门 HR 做助理……给人分工很不明确的感觉。

    但其实如果一直待在那里也可以安安稳稳的,只是我自己不太喜欢能一眼望得到头的生活,每个人的选择不一样啦。

  7. 那之后去读博是什么感觉~以及读了一年后为什么又选择 quit?

    NKNaN: 在 2023 年 9 月我去港理工攻读 PhD,但工作其实 5 月就辞了,因为那会儿导师已经开始给我做一些数学基础和科研能力的训练(做题和读 paper)。我导师挺 push 的,一周要开三次组会,其中我要主讲两次——一次是论文进度、一次是讲做的习题。然后还有一次相当于旁听,但是旁听也不能只听着,得发表意见参与进来,很累。

    而且我导师是属于应用数学学院下的,她是想把传统的统计学和 Machine Learning 结合,做一些统计迁移学习,而不是用目前流行的 Deep Learning,这就对数学能力要求比较高。虽然我本科辅修了数学,但还是觉得自己的数学基础能力不太够,可能看 paper 的时候理解的会容易一点,不过理解和自己推出来这两者差别是很大的(真的推不了一点)。

    可是我能力太差了,光是训练就把我搞懵了。如果按我当前这个速度去读博,可能得要五年……导师对我期望值也很高,想着三年就毕业吧,弄得我压力很大。而且对于这个方向我也不是很感兴趣,感觉太传统了,所以最后还是决定 quit。

  8. 所以选择 quit 一方面是压力大,另一方面是方向不太合适?

    NKNaN: 是的。除非你本科就是学数学的,已经经过三到四年的严格专业训练,然后再去读这个博士,可能收获会更大吧~或者找一个计算机系的教授,跟着做深度学习可能更适合我。

  9. 你这些年在香港待了也挺久的,喜欢香港文化吗?粤语会说吗?

    NKNaN: 我觉得对香港没有那么喜欢,因为有时候遇到一些比较排外的 local,体验会挺差的。

    粤语的话我到现在还不太会说,可能我语言天赋太差了。像我室友她语言就比我好的多,我跟她一起备考 GRE,她只复习了一两个月就考到了 325,而我当时考的可低了,后面又复习了两个月才考到了这分数。她一开始英语说的就很好,之后粤语学也很快,一两年就学会了,我到现在还会听不懂一些对话。另外主要是自己也不太想学粤语,感觉可难了,音调那么多,粤语的拼音发音又和中文的拼音不一样,不太规则。

    港科食堂
    港科食堂,风景属实不戳
  10. 那在日常生活中,你一般会做什么呀?

    NKNaN: 生活上我感觉因为我是 I 所以就很少社交了,除了前面提到的那些,还喜欢自己研究一些好玩的东西~比如一开始在中国大学慕课网学 Python 编程的时候,就会跟着做一些比较有意思的小项目。在学校里也修了 C++,后面为了找开发工作还学了 Java,顺便自己做了康威生命游戏,就是一个界面,里面有黑白小格子可以点点点,现在看是个挺无聊的一游戏了~其实本来想着学机器学习,但后来跟着做了这些开发项目后,觉得这些语言也挺有意思的,包括最近我还在学习一些前端知识。

    生活-1
    当然也用照片套模型炼过自己(雾)
    生活-2
    为数不多的主角是自己的外出照片
  11. 聊聊开源吧~是什么契机接触飞桨的呀?

    NKNaN: 在去年五六月的时候,我想做一些开源项目提升一下。因为当时抱有一个目的——进大厂,所以觉得做一些开源项目应该是有好处的,然后想做深度学习领域的开源项目,就去 GitHub 搜一些国内的深度学习社区嘛,看到 Paddle 仓库有一个 project —— call for contribution,在里边的列表里看到 PaddleScience 有个题目,需要做 HamiltonianMonteCarlo(HMC)API。MonteCarlo 我肯定是知道的,但对 HMC 不太熟悉,我就搜了一下是啥样子的,感觉应该还挺好实现的,就帮着做了一下。

  12. 像科学计算、API 功能增强之类的开源任务都有一定挑战性的,但对你这样的大佬来说是不是难度不大?

    NKNaN: 难度我觉得对我而言主要还是在于理解这个框架吧,就是理解框架背后的原理。因为像 MonteCarlo 这样的 API 底层本身应该是很好写的,给一个数学公式,如果能看懂就可以写出来吧!但要把它适配到这个框架里面,是需要花一定时间的。我自己的开发经验少,接触的开发项目也少,所以当时半天看不懂为什么这块儿要这么写,那块要那么写~

  13. 身为一名很厉害的女性开发者,你觉得在工作或者学术中会存在大家对女性的一些刻板印象吗?

    NKNaN: 这个我感觉可能国内有的地方确实会有这种现象吧,就是说比如说找工作的时候,像涛姐写的那样,在简历上就不会写上自己的性别。然后不仅是开发者这个职业,包括其他的一些工作,在一些国企里面,好像也更偏向于男生,可能因为出于传统刻板印象,他们觉得女生事儿多,担不起大梁。

    读 PhD 的时候倒是完全没有这类问题,因为导师本身自己也是女性。她也非常提倡有女孩子能来跟她读博,她不会觉得性别是一个做研究上的一个障碍吧。这方面可能在发达地区不会有那么严重的性别歧视。

  14. 之后有什么打算吗?是继续深造还是工作~

    NKNaN: 现在想准备去加拿大读一个 master 之类的,因为想要去国外看看。

    我感觉自己年纪有点大了,都 25 了,也有点年龄焦虑。我父母也会觉得读出来都二十七八了,有点晚了,所以大概率就是读完 master 之后找个开发的工作~

    其实我一开始还挺想去做学术研究的,但是后来发现做研究就得没日没夜,有点不对劲,完全没有 work life balance。你可能每天都得干到晚上 12 点,一点都不快乐,所以现在看起来开发应该会比做研究轻松一点吧~

  15. 最后给我们社区的小伙伴说几句话吧!

    NKNaN: 我感觉来社区里的大家,肯定都是很有自己想法的开发者~我自己也很随性很散漫,所以就希望大家能去做自己想做的,成为自己想成为的人,不要在意外界的闲言碎语,遵从自己的内心就好~

    GitHub头像原图照骗

三、两分钟快问快答

',8),b=s("hr",null,null,-1),y=s("h2",{id:"写在最后-💡",tabindex:"-1"},[e("写在最后 💡 "),s("a",{class:"header-anchor",href:"#写在最后-💡","aria-label":'Permalink to "写在最后 💡"'},"​")],-1),k=s("p",null,[s("strong",null,"【开源江湖闲聊录】"),e(" 是一项专门为 Paddle 社区的开发者打造的特色访谈栏目 📚。在这里,我们邀请到每一位别具一格且富有热情的开发者,通过文字或语音的方式进行深入采访 🎙️,探索并展现他们背后独一无二的故事,将他们的经历、见解和创意整理成精彩内容,呈现给整个社区。")],-1),P=s("p",null,[e("如果你有兴趣对社区的开发者进行采访,可以联系孙师傅,"),s("strong",null,"急缺助手!")],-1),x=s("hr",null,null,-1),B=JSON.parse('{"title":"【开源江湖闲聊录】从代码到键盘外的世界,走进 NKNaN 的日常","description":"","frontmatter":{"title":"【开源江湖闲聊录】从代码到键盘外的世界,走进 NKNaN 的日常","date":"2024-4-26","author":{"name":"孙钟恺","github":"sunzhongkai588"},"co_authors":[{"name":"李睿文","github":"NKNaN"}]},"headers":[],"relativePath":"posts/nknan-story.md","filePath":"posts/nknan-story.md"}'),j={name:"posts/nknan-story.md"},A=Object.assign(j,{setup(v){return(w,q)=>(r(),l("div",null,[K,t(n,null,{default:a(()=>[t(i,{name:"孙师傅",github:"sunzhongkai588"},{default:a(()=>[e(" 最喜欢的编程语言? ")]),_:1})]),_:1}),t(n,null,{default:a(()=>[t(i,{type:"right",name:"NKNaN",github:"NKNaN"},{default:a(()=>[e(" Python ")]),_:1})]),_:1}),t(n,null,{default:a(()=>[t(i,{name:"孙师傅",github:"sunzhongkai588"},{default:a(()=>[e(" 早起还是夜猫子? ")]),_:1})]),_:1}),t(n,null,{default:a(()=>[t(i,{type:"right",name:"NKNaN",github:"NKNaN"},{default:a(()=>[e(" 夜猫子 ")]),_:1})]),_:1}),t(n,null,{default:a(()=>[t(i,{name:"孙师傅",github:"sunzhongkai588"},{default:a(()=>[e(" 最喜欢的科技产品? ")]),_:1})]),_:1}),t(n,null,{default:a(()=>[t(i,{type:"right",name:"NKNaN",github:"NKNaN"},{default:a(()=>[e(" 平板电脑? ")]),_:1})]),_:1}),t(n,null,{default:a(()=>[t(i,{name:"孙师傅",github:"sunzhongkai588"},{default:a(()=>[e(" 最常用的app? ")]),_:1})]),_:1}),t(n,null,{default:a(()=>[t(i,{type:"right",name:"NKNaN",github:"NKNaN"},{default:a(()=>[e(" 微信 ")]),_:1})]),_:1}),t(n,null,{default:a(()=>[t(i,{name:"孙师傅",github:"sunzhongkai588"},{default:a(()=>[e(" 最近读的一本书? ")]),_:1})]),_:1}),t(n,null,{default:a(()=>[t(i,{type:"right",name:"NKNaN",github:"NKNaN"},{default:a(()=>[e(" 海伯利安 ")]),_:1})]),_:1}),t(n,null,{default:a(()=>[t(i,{name:"孙师傅",github:"sunzhongkai588"},{default:a(()=>[e(" 最喜欢的电影或电视剧? ")]),_:1})]),_:1}),t(n,null,{default:a(()=>[t(i,{type:"right",name:"NKNaN",github:"NKNaN"},{default:a(()=>[e(" 盗梦空间 ")]),_:1})]),_:1}),t(n,null,{default:a(()=>[t(i,{name:"孙师傅",github:"sunzhongkai588"},{default:a(()=>[e(" 必备的零食? ")]),_:1})]),_:1}),t(n,null,{default:a(()=>[t(i,{type:"right",name:"NKNaN",github:"NKNaN"},{default:a(()=>[e(" 可乐 ")]),_:1})]),_:1}),t(n,null,{default:a(()=>[t(i,{name:"孙师傅",github:"sunzhongkai588"},{default:a(()=>[e(" 喜欢的音乐类型或歌手? ")]),_:1})]),_:1}),t(n,null,{default:a(()=>[t(i,{type:"right",name:"NKNaN",github:"NKNaN"},{default:a(()=>[e(" 中世纪吟唱风 ")]),_:1})]),_:1}),t(n,null,{default:a(()=>[t(i,{name:"孙师傅",github:"sunzhongkai588"},{default:a(()=>[e(" 喜欢猫还是狗? ")]),_:1})]),_:1}),t(n,null,{default:a(()=>[t(i,{type:"right",name:"NKNaN",github:"NKNaN"},{default:a(()=>[e(" 猫 ")]),_:1})]),_:1}),t(n,null,{default:a(()=>[t(i,{name:"孙师傅",github:"sunzhongkai588"},{default:a(()=>[e(" 出门必备的三样东西是什么? ")]),_:1})]),_:1}),t(n,null,{default:a(()=>[t(i,{type:"right",name:"NKNaN",github:"NKNaN"},{default:a(()=>[e(" 伞,口罩,手机 ")]),_:1})]),_:1}),t(n,null,{default:a(()=>[t(i,{name:"孙师傅",github:"sunzhongkai588"},{default:a(()=>[e(" 如果不做开发,最想尝试的职业? ")]),_:1})]),_:1}),t(n,null,{default:a(()=>[t(i,{type:"right",name:"NKNaN",github:"NKNaN"},{default:a(()=>[e(" 自由职业 ")]),_:1})]),_:1}),b,y,k,P,x]))}});export{B as __pageData,A as default}; diff --git a/assets/posts_nknan-story.md.C0DqNXs8.lean.js b/assets/posts_nknan-story.md.C0DqNXs8.lean.js new file mode 100644 index 0000000..152ce65 --- /dev/null +++ b/assets/posts_nknan-story.md.C0DqNXs8.lean.js @@ -0,0 +1 @@ +import{M as n,_ as i}from"./chunks/MessageBox.BjkmF0_f.js";import{c as l,i as t,v as a,l as o,a as s,x as e,o as r}from"./chunks/framework.CEb3mtFd.js";const g="/assets/NKNaN-1.L6B9mBNY.jpeg",N="/assets/NKNaN-2.DsOESAXA.jpeg",p="/assets/NKNaN-3.BgREEBki.jpeg",u="/assets/NKNaN-4.aUQgvqgN.jpeg",f="/assets/NKNaN-5.CRSa-9AH.jpeg",d="/assets/NKNaN-6.Cs90Nvon.jpeg",_="/assets/NKNaN-7.BpooYvDx.jpeg",h="/assets/NKNaN-8.DxaDPc8s.jpeg",c="/assets/NKNaN-9.BRRQUkq7.jpeg",m="/assets/NKNaN-10.OH6Ys9wN.jpeg",K=o("",8),b=s("hr",null,null,-1),y=s("h2",{id:"写在最后-💡",tabindex:"-1"},[e("写在最后 💡 "),s("a",{class:"header-anchor",href:"#写在最后-💡","aria-label":'Permalink to "写在最后 💡"'},"​")],-1),k=s("p",null,[s("strong",null,"【开源江湖闲聊录】"),e(" 是一项专门为 Paddle 社区的开发者打造的特色访谈栏目 📚。在这里,我们邀请到每一位别具一格且富有热情的开发者,通过文字或语音的方式进行深入采访 🎙️,探索并展现他们背后独一无二的故事,将他们的经历、见解和创意整理成精彩内容,呈现给整个社区。")],-1),P=s("p",null,[e("如果你有兴趣对社区的开发者进行采访,可以联系孙师傅,"),s("strong",null,"急缺助手!")],-1),x=s("hr",null,null,-1),B=JSON.parse('{"title":"【开源江湖闲聊录】从代码到键盘外的世界,走进 NKNaN 的日常","description":"","frontmatter":{"title":"【开源江湖闲聊录】从代码到键盘外的世界,走进 NKNaN 的日常","date":"2024-4-26","author":{"name":"孙钟恺","github":"sunzhongkai588"},"co_authors":[{"name":"李睿文","github":"NKNaN"}]},"headers":[],"relativePath":"posts/nknan-story.md","filePath":"posts/nknan-story.md"}'),j={name:"posts/nknan-story.md"},A=Object.assign(j,{setup(v){return(w,q)=>(r(),l("div",null,[K,t(n,null,{default:a(()=>[t(i,{name:"孙师傅",github:"sunzhongkai588"},{default:a(()=>[e(" 最喜欢的编程语言? ")]),_:1})]),_:1}),t(n,null,{default:a(()=>[t(i,{type:"right",name:"NKNaN",github:"NKNaN"},{default:a(()=>[e(" Python ")]),_:1})]),_:1}),t(n,null,{default:a(()=>[t(i,{name:"孙师傅",github:"sunzhongkai588"},{default:a(()=>[e(" 早起还是夜猫子? ")]),_:1})]),_:1}),t(n,null,{default:a(()=>[t(i,{type:"right",name:"NKNaN",github:"NKNaN"},{default:a(()=>[e(" 夜猫子 ")]),_:1})]),_:1}),t(n,null,{default:a(()=>[t(i,{name:"孙师傅",github:"sunzhongkai588"},{default:a(()=>[e(" 最喜欢的科技产品? ")]),_:1})]),_:1}),t(n,null,{default:a(()=>[t(i,{type:"right",name:"NKNaN",github:"NKNaN"},{default:a(()=>[e(" 平板电脑? ")]),_:1})]),_:1}),t(n,null,{default:a(()=>[t(i,{name:"孙师傅",github:"sunzhongkai588"},{default:a(()=>[e(" 最常用的app? ")]),_:1})]),_:1}),t(n,null,{default:a(()=>[t(i,{type:"right",name:"NKNaN",github:"NKNaN"},{default:a(()=>[e(" 微信 ")]),_:1})]),_:1}),t(n,null,{default:a(()=>[t(i,{name:"孙师傅",github:"sunzhongkai588"},{default:a(()=>[e(" 最近读的一本书? ")]),_:1})]),_:1}),t(n,null,{default:a(()=>[t(i,{type:"right",name:"NKNaN",github:"NKNaN"},{default:a(()=>[e(" 海伯利安 ")]),_:1})]),_:1}),t(n,null,{default:a(()=>[t(i,{name:"孙师傅",github:"sunzhongkai588"},{default:a(()=>[e(" 最喜欢的电影或电视剧? ")]),_:1})]),_:1}),t(n,null,{default:a(()=>[t(i,{type:"right",name:"NKNaN",github:"NKNaN"},{default:a(()=>[e(" 盗梦空间 ")]),_:1})]),_:1}),t(n,null,{default:a(()=>[t(i,{name:"孙师傅",github:"sunzhongkai588"},{default:a(()=>[e(" 必备的零食? ")]),_:1})]),_:1}),t(n,null,{default:a(()=>[t(i,{type:"right",name:"NKNaN",github:"NKNaN"},{default:a(()=>[e(" 可乐 ")]),_:1})]),_:1}),t(n,null,{default:a(()=>[t(i,{name:"孙师傅",github:"sunzhongkai588"},{default:a(()=>[e(" 喜欢的音乐类型或歌手? ")]),_:1})]),_:1}),t(n,null,{default:a(()=>[t(i,{type:"right",name:"NKNaN",github:"NKNaN"},{default:a(()=>[e(" 中世纪吟唱风 ")]),_:1})]),_:1}),t(n,null,{default:a(()=>[t(i,{name:"孙师傅",github:"sunzhongkai588"},{default:a(()=>[e(" 喜欢猫还是狗? ")]),_:1})]),_:1}),t(n,null,{default:a(()=>[t(i,{type:"right",name:"NKNaN",github:"NKNaN"},{default:a(()=>[e(" 猫 ")]),_:1})]),_:1}),t(n,null,{default:a(()=>[t(i,{name:"孙师傅",github:"sunzhongkai588"},{default:a(()=>[e(" 出门必备的三样东西是什么? ")]),_:1})]),_:1}),t(n,null,{default:a(()=>[t(i,{type:"right",name:"NKNaN",github:"NKNaN"},{default:a(()=>[e(" 伞,口罩,手机 ")]),_:1})]),_:1}),t(n,null,{default:a(()=>[t(i,{name:"孙师傅",github:"sunzhongkai588"},{default:a(()=>[e(" 如果不做开发,最想尝试的职业? ")]),_:1})]),_:1}),t(n,null,{default:a(()=>[t(i,{type:"right",name:"NKNaN",github:"NKNaN"},{default:a(()=>[e(" 自由职业 ")]),_:1})]),_:1}),b,y,k,P,x]))}});export{B as __pageData,A as default}; diff --git a/assets/posts_paddleocr-release.md.B0ViGL7p.js b/assets/posts_paddleocr-release.md.B0ViGL7p.js new file mode 100644 index 0000000..798889b --- /dev/null +++ b/assets/posts_paddleocr-release.md.B0ViGL7p.js @@ -0,0 +1 @@ +import{_ as e,c as t,o as a,l as r}from"./chunks/framework.CEb3mtFd.js";const o="/assets/SVTRv2.5HokU9Qv.png",l="/assets/SLANet-LCNetV2.CZld0Zi9.png",n="/assets/contributors.B2Kgal7g.png",s="/assets/doc_site.BJdBqEIO.png",m=JSON.parse('{"title":"终于等到你!PaddleOCR 新版本发布!","description":"","frontmatter":{"title":"终于等到你!PaddleOCR 新版本发布!","date":"2024-07-08T00:00:00.000Z","author":{"name":"尤师傅","github":"Harryoung"}},"headers":[],"relativePath":"posts/paddleocr-release.md","filePath":"posts/paddleocr-release.md"}'),d={name:"posts/paddleocr-release.md"},i=r('

在开源社区的热烈期待与共同努力下,PaddleOCR 迎来了里程碑式的版本更新——v2.8.0!本次更新不仅引入了前沿的 OCR 技术成果,还对项目结构进行了深度优化解决了若干历史疑难问题,旨在为广大开发者提供更加高效、便捷的 OCR 解决方案。让我们一同探索 PaddleOCR v2.8.0 带来的全新体验与无限可能!

顶尖模型引入,引领 OCR 技术潮流

PaddleOCR v2.8.0 版本隆重引入了PaddleOCR 算法模型挑战赛的冠军方案,为 OCR 领域树立了新的标杆。 其中,赛题一“OCR 端到端识别任务”的冠军方案——场景文本识别算法 SVTRv2,以其卓越的识别性能与泛化能力,为用户带来了前所未有的识别体验。

SVTRv2

赛题二“通用表格识别任务”的冠军方案——表格识别算法 SLANet-LCNetV2,则以其精准高效的表格识别能力,为数据处理与分析提供了强有力的支持。

SLANet-LCNetV2

项目结构优化,聚焦 OCR 核心

为了进一步提升 PaddleOCR 项目的专业性与易用性,我们决定将非核心模块 PPOCRLabel 和 StyleText 迁移至新的仓库,使 PaddleOCR 项目更加专注于 OCR 与版面识别的核心技术。这一举措不仅简化了项目结构,也为开发者提供了更加清晰的项目导航与资源访问路径。

详见:Notice of PPOCRLabel and StyleText Project Migration

历史疑难问题解决,提升用户体验

半年多来,PaddleOCR 存在若干历史疑难问题,影响了开发者的使用体验。因此,在新版本中,我们重点解决了更新 Backbone 后无法运行模型、numpy 版本依赖冲突、Mac 系统中运行卡顿等一系列历史疑难问题。部分疑难问题还在解决过程中,欢迎广大开发者一起参与!

详见:【疑难解决】解决 PaddleOCR 历史存在的疑难 Issue

其它优化改进,持续精进

除了上述重大更新外,PaddleOCR v2.8.0 版本还包含了一系列细微但重要的优化改进。包括但不限于:

  1. 解决版面分析中,OCR 结果偶尔丢失的问题
  2. 添加 pyproject.toml,使 PaddleOCR 符合 PEP 518 规范
  3. 对于大图推理,引入滑动窗口操作

这些改进旨在进一步提升软件的稳定性、兼容性和性能表现,确保 PaddleOCR 能够在更广泛的场景中得到应用。

开源共建,共创辉煌

需要特别强调的是,PaddleOCR v2.8.0 版本的每一个进步与成就都离不开开源社区的支持与贡献。在 PMC(Project Management Committee) 的统一管理下,众多社区开发者携手并进、共同努力,才使得 PaddleOCR 能够不断前行、日益完善。这里要特别感谢 PaddleOCR PMC 成员:@GreatV (PMC Chair)、@tink2123 (PMC Chair)、@Topdu@SWHL@Liyulingyue@Sunting78@jzhang533,也感谢虽然暂未加入 PMC 但是作出了大量贡献的热心开发者。

新版本 contributors 列表,贡献者数量创历史新高!

contributors

这里预告一下,为了更好地服务广大开发者,PaddleOCR 文档教程专属站点正在由 PMC 展开建设。该站点将汇集仓库中原先散落在各处的文档资源,支持关键词检索功能,界面优雅舒适,相信大家一定会喜欢。

doc_site

我们诚挚地邀请更多开发者和开源爱好者加入我们的行列,一起将 PaddleOCR 越做越好!

结语

PaddleOCR v2.8.0 版本的发布是我们迈向新征程的重要一步。我们坚信,在未来的日子里,在大家的共同努力下,PaddleOCR 将不断创新、持续进步,为 OCR 领域的发展贡献更多的智慧与力量!

',25),c=[i];function p(h,g,u,C,P,_){return a(),t("div",null,c)}const R=e(d,[["render",p]]);export{m as __pageData,R as default}; diff --git a/assets/posts_paddleocr-release.md.B0ViGL7p.lean.js b/assets/posts_paddleocr-release.md.B0ViGL7p.lean.js new file mode 100644 index 0000000..ee43abb --- /dev/null +++ b/assets/posts_paddleocr-release.md.B0ViGL7p.lean.js @@ -0,0 +1 @@ +import{_ as e,c as t,o as a,l as r}from"./chunks/framework.CEb3mtFd.js";const o="/assets/SVTRv2.5HokU9Qv.png",l="/assets/SLANet-LCNetV2.CZld0Zi9.png",n="/assets/contributors.B2Kgal7g.png",s="/assets/doc_site.BJdBqEIO.png",m=JSON.parse('{"title":"终于等到你!PaddleOCR 新版本发布!","description":"","frontmatter":{"title":"终于等到你!PaddleOCR 新版本发布!","date":"2024-07-08T00:00:00.000Z","author":{"name":"尤师傅","github":"Harryoung"}},"headers":[],"relativePath":"posts/paddleocr-release.md","filePath":"posts/paddleocr-release.md"}'),d={name:"posts/paddleocr-release.md"},i=r("",25),c=[i];function p(h,g,u,C,P,_){return a(),t("div",null,c)}const R=e(d,[["render",p]]);export{m as __pageData,R as default}; diff --git a/assets/posts_pfcc-36th.md.DYTL3ikw.js b/assets/posts_pfcc-36th.md.DYTL3ikw.js new file mode 100644 index 0000000..62104f9 --- /dev/null +++ b/assets/posts_pfcc-36th.md.DYTL3ikw.js @@ -0,0 +1 @@ +import{M as a,_ as o}from"./chunks/MessageBox.BjkmF0_f.js";import{c as i,a as l,i as e,v as n,l as r,x as t,o as u}from"./chunks/framework.CEb3mtFd.js";const d="/assets/cut-1.WioqBQsV.png",s="/assets/cut-2.DTE8mGwP.png",c="/assets/cut-3.DykMff0-.png",_=r('

在第 36 次 PFCC 会议上,我们有幸邀请了 Ivy 社区的英国小哥 Daniel(@djl11)和 Paddle 社区开发者莱师傅(@RedContritio)分别分享了代码转换工具 Ivy、PaConvert。

会议议程

  1. 如何通过 Ivy 将 PyTorch 和 TensorFlow 模型进行转换,并直接在 Paddle 项目中使用。(35 min) @djl11

    Ivy 模型转换 demo 讲解(截图)
  2. @RedContritio PaConvert 代码转换工具介绍 (10 ~ 20min)

    • PaConvert 介绍
    • QA 环节
    PaConvert 介绍(截图)

会议材料及回放见百度网盘链接: https://pan.baidu.com/s/16vAVoXpCgdrrRK5e_-w7Ig ,提取码见 PFCC 微信群公告。

QA 环节

所有 QA 内容均已记录在「第三十六次 PFCC 会议纪要」中。

Part-1: Ivy (部分)

',7),h=l("p",null,[l("strong",null,"问题 1:"),t(" 你有测试过多少模型能够转换成功?")],-1),P=l("p",null,[l("strong",null,"问题 2:"),t(" 对于成功转换的模型,它会影响性能吗?或者可能需要更多的时间来训练嘛?")],-1),f=l("br",null,null,-1),p=l("br",null,null,-1),g=l("p",null,[l("strong",null,"问题 3:"),t(" 请问是否有覆盖率相关的工作,类似 PyTorch 那样对后端支持覆盖率有表单或者对应的 CI 流水线")],-1),y=l("br",null,null,-1),m=l("p",null,[l("strong",null,"问题 4:"),t(" PyTorch 大概有两千多个 API,包括很多废弃的、不常见的 API,有多少可以通过 Ivy 转换?")],-1),b=l("br",null,null,-1),v=l("br",null,null,-1),I=l("blockquote",null,[l("p",null,[t("编者注:细节戳 ➡️ "),l("a",{href:"https://github.com/unifyai/ivy/tree/main/ivy/functional/frontends",target:"_blank",rel:"noreferrer"},"ivy/functional/frontends")])],-1),A=l("p",null,[l("strong",null,"问题 5:"),t(" 我们刚看到的前端,目前支持了很多。但现在还有很多 API 不能转换,那我该怎么做?怎么处理它们?")],-1),C=l("br",null,null,-1),T=l("p",null,[l("strong",null,"问题 6:"),t(" PyTorch API 有很多参数,不同参数可以组成各种组合,如果某些参数不支持,则如何处理?")],-1),k=l("p",null,[l("strong",null,"问题 7:"),t(" 目前大模型很流行。对于预训练的大模型,有大量的预训练权重,是否有更快的方式进行转换。")],-1),D=l("br",null,null,-1),j=l("br",null,null,-1),x=l("p",null,[l("strong",null,"问题 8:"),t(" 当引入一个新 API 时,支持新 API 的成本有多大?")],-1),q=l("br",null,null,-1),w=l("p",null,[l("strong",null,"问题 9:"),t(" Ivy 是有特定的前端 API,还是只转译其他框架?")],-1),R=l("p",null,[l("strong",null,"问题 10:"),t(" 听起来和 keras 很相似?")],-1),M=l("p",null,[l("strong",null,"问题 11:"),t(" 我们是否需要使用更高的内存来转换模型?因为也许转换模型过程中需要保存中间信息,所以可能会占用一些内存。所以我想问问,像转换 llama 这样的大模型是否 ok?")],-1),N=l("br",null,null,-1),S=l("br",null,null,-1),U=l("p",null,[l("strong",null,"问题 12:"),t(" 你如何平衡你的生活和工作,以及保持你对开源的热情呢?")],-1),V=l("br",null,null,-1),F=l("br",null,null,-1),B=l("p",null,[l("strong",null,"问题 13:"),t(" 英国的人工智能环境怎么样?是否会有官方活动之类的?")],-1),G=l("br",null,null,-1),Q=l("h3",{id:"part-2-paconvert-部分",tabindex:"-1"},[t("Part-2: PaConvert (部分) "),l("a",{class:"header-anchor",href:"#part-2-paconvert-部分","aria-label":'Permalink to "Part-2: PaConvert (部分)"'},"​")],-1),J=l("p",null,[l("strong",null,"问题 1 :"),t(" PaConvert 是否是根据 AST 转换模型的?")],-1),K=l("p",null,[l("strong",null,"问题 2 :"),t(" 是否有中间表示?还是直接将 PyTorch 代码转换成 Paddle ?")],-1),O=l("blockquote",null,[l("p",null,"编者注 ✍️:主要是英国小哥在问莱师傅 😛")],-1),X=l("h2",{id:"会议剪影",tabindex:"-1"},[t("会议剪影 "),l("a",{class:"header-anchor",href:"#会议剪影","aria-label":'Permalink to "会议剪影"'},"​")],-1),E=l("p",null,[l("img",{src:c,alt:"cut-3"})],-1),Z=JSON.parse('{"title":"第三十六次 PFCC 会议|Ivy 与 PaConvert 分享","description":"","frontmatter":{"title":"第三十六次 PFCC 会议|Ivy 与 PaConvert 分享","date":"2024-3-29","author":{"name":"孙师傅","github":"sunzhongkai588"},"co_authors":[{"name":"Daniel(英国小哥)","github":"djl11"},{"name":"莱师傅","github":"RedContritio"}]},"headers":[],"relativePath":"posts/pfcc-36th.md","filePath":"posts/pfcc-36th.md"}'),L={name:"posts/pfcc-36th.md"},ll=Object.assign(L,{setup(z){return(H,W)=>(u(),i("div",null,[_,l("ul",null,[l("li",null,[h,e(a,null,{default:n(()=>[e(o,{name:"Daniel",github:"djl11"},{default:n(()=>[t(" 目前测试了 30 个主流模型,均能转换成功。目前我们正在测试更多 hugging face 上的模型,大概 70 ~ 75% 能够转换成功。我们也欢迎和鼓励社区告诉我们哪些模型无法有效转换,我们有信心能够解决这些问题。 ")]),_:1})]),_:1})]),l("li",null,[P,e(a,null,{default:n(()=>[e(o,{name:"Daniel",github:"djl11"},{default:n(()=>[t(" 这是一个好问题,也是我们目前正在测试的东西。我们现在看到在 Paddle 上会有 30% 到 40% 的性能损失, 这是因为在我们的 Paddle 后端上有一些低效,我们目前正在努力解决这个问题。 "),f,t(" 性能问题取决于模型,但通常来讲并不会影响训练性能。当我们从 Pytorch 转换到 Tensorflow 时,经常看到训练速度的提高。特别是当我们从一个框架转化到 Jax,经常看到一个大幅度的提升,尤其是在 TPU 上。 "),p,t(" 所以可能有一些开销,但总的来讲不会有特别大幅度的降低。即使存在个别问题,我们也会很快修复他们。话说回来,这也是一个长期的过程,因为我们正在开发许多不同的框架,并与许多不同的生态伙伴合作。我们把精力集中在用户反馈的真实用例上,而不是试图修复所有东西。所以当你使用过程中确实出问题了,请在 discord 上联系我们,我们会把它添加到高优先级的列表中,并尽快解决。 ")]),_:1})]),_:1})]),l("li",null,[g,e(a,null,{default:n(()=>[e(o,{name:"Daniel",github:"djl11"},{default:n(()=>[t(" 我们做覆盖的方式是详尽的单元测试,所以答案是有。我们在 Github 上 的 CI 已经达到了最大值,我们一直在运行单元测试,在 CPU 和 GPU 上测试每个框架、每个函数,所以我们确实有扩展函数覆盖范围。 "),y,t(" 但在每个设备上,支持每个框架、每个版本的每个功能,是一个非常大的、指数爆炸级的工作。基本上有数百万个这样的测试。所以我们真正关注的是什么?这是一个很长的答案,但就像生活中的许多事情一样,我们需要关注重要的事情。我们把更多的注意力放在真正常见的函数上(relu、add、matmul 等)那些真正不常见的、较少使用的函数,我们关注的比较少。在我们看来,我们可能永远不会达到完全覆盖,但只要覆盖到 99% 的模型就是 OK 的,这比支持每个版本每个函数更重要。 ")]),_:1})]),_:1})]),l("li",null,[m,e(a,null,{default:n(()=>[e(o,{name:"Daniel",github:"djl11"},{default:n(()=>[t(" 我们只关注当前最新版本的 pytorch,以及其 functional API。 在 ivy/functional/frontends 你可以看到所有这些细节,包括我们在每个框架中都支持什么。 "),b,t(" 主要的一点是我们支持 functional API,但我们不支持 ATen。我们并不把转换限制在 ATen 或很小的范围内(比如组成所有函数的函数子集),我们可以这么做,但不这样做的原因是我们想更高级别的代码转换。某种程度上,函数的越高层越好,因为当我们从高层 PyTorch 函数转换到高层 ivy 函数、高层 Tensorflow 函数时,把函数拆分成更小单位仍然是有可能的。但如果将底层 OP 重新创建为目标框架中能被优化的高级函数,要困难得多。这就是为什么我们专注于 functional API 和高级函数更重要(但我们也不重新实现的 class)。 "),v,t(" 这是一个很长的回答,但这是有意义的。不过我们看到了良好的覆盖率,看到绝大多数模型都能正确转换。我们鼓励人们尝试它,如果它不起作用,让我们知道,我们会让它起作用。 ")]),_:1})]),_:1}),I]),l("li",null,[A,e(a,null,{default:n(()=>[e(o,{name:"Daniel",github:"djl11"},{default:n(()=>[t(" 基本上,如果我们看到开发者对某 API 有足够的兴趣,届时我们会支持。对于不那么常见的 API,Ivy 也是可以支持这些的。如果有一个模型不能转换成功,而我们有信心能让他转换成功,那么我们可以添加对那些 API 的支持。 "),C,t(" 如果用户有自定义的 C++ 代码,那么默认情况下不能转换,但我们提供一个接口,你可以在其中指定 C++ 的 torch 实现,这样就可以转换了。 ")]),_:1})]),_:1})]),l("li",null,[T,e(a,null,{default:n(()=>[e(o,{name:"Daniel",github:"djl11"},{default:n(()=>[t(" 基本上我们支持 PyTorch 的所有行为,包括所有额外的参数等。我们通过构建基于 Ivy 的统一的 functional API(如 ivy.matmul、ivy.add、ivy.reshape 等),重新创建 PyTorch 函数,以完美模仿 PyTorch 的任何可能行为。这可能需要一个 Ivy 函数来重新创建,但如果是一个具有多种不同模式的复杂 Python 函数,可能就需要十个。然后,使用 Ivy 重新创建所有这些行为,每个 Ivy 函数都有特定的 Paddle 后端。因此,一个 PyTorch 函数可能需要多个 Ivy 函数,而这些 Ivy 函数又可能需要多个 Paddle 函数来完全重新创建该行为。所有变体、额外的参数和边缘情况都可以通过中间表示和 API 得到支持。在这些情况下,需要将其作为 Paddle 函数的组合重新创建,尽管这可能以运行时间速度为代价,但通常不会看到大的损失。 ")]),_:1})]),_:1})]),l("li",null,[k,e(a,null,{default:n(()=>[e(o,{name:"Daniel",github:"djl11"},{default:n(()=>[t(" 在从 PyTorch 转换模型到 Paddle 后,因为现在 Paddle 模型就是一个加强版的 PyTorch 模型,转换权重可以相对简单,比如将它们转换为 Numpy 数组,然后加载到 Paddle 中。实际上,Ivy 在模型转换过程中,会自动把所有的 PyTorch 权重转换为 Paddle 权重。 "),D,t(" 目前没有更快的转换方式,通常使用 DLPack(张量数据结构的中间表示标准)作为中间件,但由于不同框架对 DLPack 的支持不一致,最终选择使用 Numpy 作为中介。我们把将权重转移到 CPU,以高精度格式存储并转换为 Numpy 数组,然后转移到新框架中,这种方法在 demo 演示中以及对于大型模型都能很好地工作。 "),j,t(" 实际上目前的转换是基于 function tracing,如果大型语言模型需要多个 GPU 运行,这可能会有些复杂。不过,我们将很快转向使用纯 symbolic tracing 方法,届时就不需要存储所有权重和中间数组,而是基于符号追踪的代理数组,这将意味着不需要启动大量 GPU 来完成函数追踪。 ")]),_:1})]),_:1})]),l("li",null,[x,e(a,null,{default:n(()=>[e(o,{name:"Daniel",github:"djl11"},{default:n(()=>[t(" 从工程成本的角度来看,支持一个新 API 并不困难,也不是我们特别关注的问题。我们大部分时间都花在了 function tracing 的逻辑、抽象语法树(AST)逻辑以及编译器和追踪器上。 "),q,t(" 添加一个新的前端功能并不难,做起来相当快速和容易。事实上,所有前端 API 和后端 API 都是完全开源的(Apache 2 许可),任何人都可以为其贡献代码。如果在转换模型时失败,并且报错消息指出模型转换失败是因为缺少来自 Ivy/PyTorch 前端的某个函数,我们还提供了如何提交拉取请求以及如何自行添加该功能的链接。真正困难的部分是处理动态控制流、以可扩展的方式进行函数追踪、获取正确的抽象语法树表示,这些都是与框架无关的工作,我们以一种不特定于任何框架的方式进行这些工作。因此,简短的回答是添加新 API 相对容易,真正困难的是其他部分。 ")]),_:1})]),_:1})]),l("li",null,[w,e(a,null,{default:n(()=>[e(o,{name:"Daniel",github:"djl11"},{default:n(()=>[t(" Ivy 本身也是一个框架,拥有自己的前端 API(如 TensorFlow、PyTorch、JAX 等)以及自己的一套函数。Ivy 的 function API 有两个用途:第一个用途是作为一个中间表示,用于从一个框架转换到另一个框架,即 Ivy 的 API 充当中间表示;第二个用途是作为其自身的框架,允许直接在 Ivy 中编写新代码,可以在 Ivy 中编写整个模型,并使用 Ivy 类和 Ivy 函数,然后可以切换后端,使用 Paddle、TensorFlow、PyTorch 或 JAX 等。因此,Ivy 既能自身作为框架,也能转译其他框架。但我们认为最有价值并且最直接的是转译器功能,因为这样已有的所有代码都可以直接使用,而无需任何人编写新的 Ivy 代码。 ")]),_:1})]),_:1})]),l("li",null,[R,e(a,null,{default:n(()=>[e(o,{name:"Daniel",github:"djl11"},{default:n(()=>[t(" 是的!如果忽略前端,Ivy 和 Keras 非常相似。 ")]),_:1})]),_:1})]),l("li",null,[M,e(a,null,{default:n(()=>[e(o,{name:"Daniel",github:"djl11"},{default:n(()=>[t(" 这是一个很好的问题。目前,鉴于转译器是基于函数追踪(function tracing)的,确实需要调用模型以追踪图(graph),这意味着在转换时需要能够对模型进行推理。现在,转换本身不需要在目标设备上进行,只要你有一台内存足够的机器,就可以在 CPU 上完成转换,并且默认情况下转换是在 CPU 上进行的,因为通常 CPU 有的 RAM 比 GPU 多。 "),N,t(" 在转译器的一个很旧的版本中,我们曾同时获取所有 PyTorch 权重和所有 Paddle 权重,并让它们同时存在于内存中,这是非常糟糕的做法。现在,权重从 A 转换到 B 是逐步进行的,我们先取第一个权重,将其转换为 Numpy,然后转换为 Paddle,接着转换第二个权重,这样我们就不会重复获取权重。但是,我们避免尽可能多的函数追踪(function tracing),我们现在有自己的 AST(抽象语法树)方法,这个方法工作得很好、非常稳定,我们正在与几家公司合作开发这一点。 "),S,t(" 最终设计基于 AST,基于符号追踪,我们将实际的函数追踪作为最后的手段,因此内存使用将会非常低。但是,正如你所说,现在确实需要一些 RAM 来转换一个非常大的模型,但希望在几个月内,这将不再是问题。 ")]),_:1})]),_:1})]),l("li",null,[U,e(a,null,{default:n(()=>[e(o,{name:"Daniel",github:"djl11"},{default:n(()=>[t(" 平衡生活和工作非常困难,但幸运的是,我真的很热爱我正在做的事情,这是保持我动力的原因。我们不仅仅是在做一个开源项目,还在建立一家公司,需要与客户进行沟通。虽然我是唯一的创始人(并非是原本的设计),而且这确实需要付出大量的工作,但我对统一人工智能领域的景象充满热情,总是对看到的碎片化情况感到沮丧,无论是在 AI 框架还是在大型语言模型(LMM)的领域。目前我们正在努力统一这些领域,保持激情和兴奋是我继续前进的动力,如果我不再感到兴奋,可能就不会那么有趣了。幸好,我始终保持着兴奋感,所以工作并不感觉艰难。确实,因为这些并不感觉像是工作,所以更容易保持。 "),V,t(" 此外,帝国理工学院的学习经历非常紧张,这让我掌握了之前缺少的知识教育和时间管理经验。 "),F,t(" 但我也要说,我会把周日作为休息日,我认为你也需要休息,否则很快就会感到疲惫不堪。 ")]),_:1})]),_:1})]),l("li",null,[B,e(a,null,{default:n(()=>[e(o,{name:"Daniel",github:"djl11"},{default:n(()=>[t(" 英国的人工智能环境还是不错的。虽然我经常到处旅行,在欧洲和美国都呆过相当长的时间,所以并不算是英国本地人,但英国的 AI 环境绝对是值得关注的。比如,DeepMind 就设在英国,谷歌的主要 AI 分支也在伦敦。显然,Meta、亚马逊以及其他几家公司也在伦敦设有 AI 办公室。伦敦还有很多有趣的初创公司,所以我觉得很幸运能住在伦敦,特别是在靠近国王十字的伊斯灵顿区,那里可以说是整个科技圈的中心。我遇到的很多很酷的初创公司以及举办的活动数目都令人惊叹,所以我认为这里的环境非常好。我很高兴能在伦敦,与这么多创造酷炫事物的人在一起。 "),G,t(" 我认为最大的 AI 人才集中地是旧金山,那里又是另一个水平,但我仍感觉英国很棒,伦敦也很棒,虽然它还没有达到旧金山的水平,但也许将来会有所改变。 ")]),_:1})]),_:1})])]),Q,l("ul",null,[l("li",null,[J,e(a,null,{default:n(()=>[e(o,{name:"RedContritio",github:"RedContritio"},{default:n(()=>[t(" 是的,基于解析 python 源码,然后根据 AST 生成 Paddle 模型。 ")]),_:1})]),_:1})]),l("li",null,[K,e(a,null,{default:n(()=>[e(o,{name:"RedContritio",github:"RedContritio"},{default:n(()=>[t(" 直接转换,没有中间表示。 ")]),_:1})]),_:1})])]),O,X,E]))}});export{Z as __pageData,ll as default}; diff --git a/assets/posts_pfcc-36th.md.DYTL3ikw.lean.js b/assets/posts_pfcc-36th.md.DYTL3ikw.lean.js new file mode 100644 index 0000000..150a29f --- /dev/null +++ b/assets/posts_pfcc-36th.md.DYTL3ikw.lean.js @@ -0,0 +1 @@ +import{M as a,_ as o}from"./chunks/MessageBox.BjkmF0_f.js";import{c as i,a as l,i as e,v as n,l as r,x as t,o as u}from"./chunks/framework.CEb3mtFd.js";const d="/assets/cut-1.WioqBQsV.png",s="/assets/cut-2.DTE8mGwP.png",c="/assets/cut-3.DykMff0-.png",_=r("",7),h=l("p",null,[l("strong",null,"问题 1:"),t(" 你有测试过多少模型能够转换成功?")],-1),P=l("p",null,[l("strong",null,"问题 2:"),t(" 对于成功转换的模型,它会影响性能吗?或者可能需要更多的时间来训练嘛?")],-1),f=l("br",null,null,-1),p=l("br",null,null,-1),g=l("p",null,[l("strong",null,"问题 3:"),t(" 请问是否有覆盖率相关的工作,类似 PyTorch 那样对后端支持覆盖率有表单或者对应的 CI 流水线")],-1),y=l("br",null,null,-1),m=l("p",null,[l("strong",null,"问题 4:"),t(" PyTorch 大概有两千多个 API,包括很多废弃的、不常见的 API,有多少可以通过 Ivy 转换?")],-1),b=l("br",null,null,-1),v=l("br",null,null,-1),I=l("blockquote",null,[l("p",null,[t("编者注:细节戳 ➡️ "),l("a",{href:"https://github.com/unifyai/ivy/tree/main/ivy/functional/frontends",target:"_blank",rel:"noreferrer"},"ivy/functional/frontends")])],-1),A=l("p",null,[l("strong",null,"问题 5:"),t(" 我们刚看到的前端,目前支持了很多。但现在还有很多 API 不能转换,那我该怎么做?怎么处理它们?")],-1),C=l("br",null,null,-1),T=l("p",null,[l("strong",null,"问题 6:"),t(" PyTorch API 有很多参数,不同参数可以组成各种组合,如果某些参数不支持,则如何处理?")],-1),k=l("p",null,[l("strong",null,"问题 7:"),t(" 目前大模型很流行。对于预训练的大模型,有大量的预训练权重,是否有更快的方式进行转换。")],-1),D=l("br",null,null,-1),j=l("br",null,null,-1),x=l("p",null,[l("strong",null,"问题 8:"),t(" 当引入一个新 API 时,支持新 API 的成本有多大?")],-1),q=l("br",null,null,-1),w=l("p",null,[l("strong",null,"问题 9:"),t(" Ivy 是有特定的前端 API,还是只转译其他框架?")],-1),R=l("p",null,[l("strong",null,"问题 10:"),t(" 听起来和 keras 很相似?")],-1),M=l("p",null,[l("strong",null,"问题 11:"),t(" 我们是否需要使用更高的内存来转换模型?因为也许转换模型过程中需要保存中间信息,所以可能会占用一些内存。所以我想问问,像转换 llama 这样的大模型是否 ok?")],-1),N=l("br",null,null,-1),S=l("br",null,null,-1),U=l("p",null,[l("strong",null,"问题 12:"),t(" 你如何平衡你的生活和工作,以及保持你对开源的热情呢?")],-1),V=l("br",null,null,-1),F=l("br",null,null,-1),B=l("p",null,[l("strong",null,"问题 13:"),t(" 英国的人工智能环境怎么样?是否会有官方活动之类的?")],-1),G=l("br",null,null,-1),Q=l("h3",{id:"part-2-paconvert-部分",tabindex:"-1"},[t("Part-2: PaConvert (部分) "),l("a",{class:"header-anchor",href:"#part-2-paconvert-部分","aria-label":'Permalink to "Part-2: PaConvert (部分)"'},"​")],-1),J=l("p",null,[l("strong",null,"问题 1 :"),t(" PaConvert 是否是根据 AST 转换模型的?")],-1),K=l("p",null,[l("strong",null,"问题 2 :"),t(" 是否有中间表示?还是直接将 PyTorch 代码转换成 Paddle ?")],-1),O=l("blockquote",null,[l("p",null,"编者注 ✍️:主要是英国小哥在问莱师傅 😛")],-1),X=l("h2",{id:"会议剪影",tabindex:"-1"},[t("会议剪影 "),l("a",{class:"header-anchor",href:"#会议剪影","aria-label":'Permalink to "会议剪影"'},"​")],-1),E=l("p",null,[l("img",{src:c,alt:"cut-3"})],-1),Z=JSON.parse('{"title":"第三十六次 PFCC 会议|Ivy 与 PaConvert 分享","description":"","frontmatter":{"title":"第三十六次 PFCC 会议|Ivy 与 PaConvert 分享","date":"2024-3-29","author":{"name":"孙师傅","github":"sunzhongkai588"},"co_authors":[{"name":"Daniel(英国小哥)","github":"djl11"},{"name":"莱师傅","github":"RedContritio"}]},"headers":[],"relativePath":"posts/pfcc-36th.md","filePath":"posts/pfcc-36th.md"}'),L={name:"posts/pfcc-36th.md"},ll=Object.assign(L,{setup(z){return(H,W)=>(u(),i("div",null,[_,l("ul",null,[l("li",null,[h,e(a,null,{default:n(()=>[e(o,{name:"Daniel",github:"djl11"},{default:n(()=>[t(" 目前测试了 30 个主流模型,均能转换成功。目前我们正在测试更多 hugging face 上的模型,大概 70 ~ 75% 能够转换成功。我们也欢迎和鼓励社区告诉我们哪些模型无法有效转换,我们有信心能够解决这些问题。 ")]),_:1})]),_:1})]),l("li",null,[P,e(a,null,{default:n(()=>[e(o,{name:"Daniel",github:"djl11"},{default:n(()=>[t(" 这是一个好问题,也是我们目前正在测试的东西。我们现在看到在 Paddle 上会有 30% 到 40% 的性能损失, 这是因为在我们的 Paddle 后端上有一些低效,我们目前正在努力解决这个问题。 "),f,t(" 性能问题取决于模型,但通常来讲并不会影响训练性能。当我们从 Pytorch 转换到 Tensorflow 时,经常看到训练速度的提高。特别是当我们从一个框架转化到 Jax,经常看到一个大幅度的提升,尤其是在 TPU 上。 "),p,t(" 所以可能有一些开销,但总的来讲不会有特别大幅度的降低。即使存在个别问题,我们也会很快修复他们。话说回来,这也是一个长期的过程,因为我们正在开发许多不同的框架,并与许多不同的生态伙伴合作。我们把精力集中在用户反馈的真实用例上,而不是试图修复所有东西。所以当你使用过程中确实出问题了,请在 discord 上联系我们,我们会把它添加到高优先级的列表中,并尽快解决。 ")]),_:1})]),_:1})]),l("li",null,[g,e(a,null,{default:n(()=>[e(o,{name:"Daniel",github:"djl11"},{default:n(()=>[t(" 我们做覆盖的方式是详尽的单元测试,所以答案是有。我们在 Github 上 的 CI 已经达到了最大值,我们一直在运行单元测试,在 CPU 和 GPU 上测试每个框架、每个函数,所以我们确实有扩展函数覆盖范围。 "),y,t(" 但在每个设备上,支持每个框架、每个版本的每个功能,是一个非常大的、指数爆炸级的工作。基本上有数百万个这样的测试。所以我们真正关注的是什么?这是一个很长的答案,但就像生活中的许多事情一样,我们需要关注重要的事情。我们把更多的注意力放在真正常见的函数上(relu、add、matmul 等)那些真正不常见的、较少使用的函数,我们关注的比较少。在我们看来,我们可能永远不会达到完全覆盖,但只要覆盖到 99% 的模型就是 OK 的,这比支持每个版本每个函数更重要。 ")]),_:1})]),_:1})]),l("li",null,[m,e(a,null,{default:n(()=>[e(o,{name:"Daniel",github:"djl11"},{default:n(()=>[t(" 我们只关注当前最新版本的 pytorch,以及其 functional API。 在 ivy/functional/frontends 你可以看到所有这些细节,包括我们在每个框架中都支持什么。 "),b,t(" 主要的一点是我们支持 functional API,但我们不支持 ATen。我们并不把转换限制在 ATen 或很小的范围内(比如组成所有函数的函数子集),我们可以这么做,但不这样做的原因是我们想更高级别的代码转换。某种程度上,函数的越高层越好,因为当我们从高层 PyTorch 函数转换到高层 ivy 函数、高层 Tensorflow 函数时,把函数拆分成更小单位仍然是有可能的。但如果将底层 OP 重新创建为目标框架中能被优化的高级函数,要困难得多。这就是为什么我们专注于 functional API 和高级函数更重要(但我们也不重新实现的 class)。 "),v,t(" 这是一个很长的回答,但这是有意义的。不过我们看到了良好的覆盖率,看到绝大多数模型都能正确转换。我们鼓励人们尝试它,如果它不起作用,让我们知道,我们会让它起作用。 ")]),_:1})]),_:1}),I]),l("li",null,[A,e(a,null,{default:n(()=>[e(o,{name:"Daniel",github:"djl11"},{default:n(()=>[t(" 基本上,如果我们看到开发者对某 API 有足够的兴趣,届时我们会支持。对于不那么常见的 API,Ivy 也是可以支持这些的。如果有一个模型不能转换成功,而我们有信心能让他转换成功,那么我们可以添加对那些 API 的支持。 "),C,t(" 如果用户有自定义的 C++ 代码,那么默认情况下不能转换,但我们提供一个接口,你可以在其中指定 C++ 的 torch 实现,这样就可以转换了。 ")]),_:1})]),_:1})]),l("li",null,[T,e(a,null,{default:n(()=>[e(o,{name:"Daniel",github:"djl11"},{default:n(()=>[t(" 基本上我们支持 PyTorch 的所有行为,包括所有额外的参数等。我们通过构建基于 Ivy 的统一的 functional API(如 ivy.matmul、ivy.add、ivy.reshape 等),重新创建 PyTorch 函数,以完美模仿 PyTorch 的任何可能行为。这可能需要一个 Ivy 函数来重新创建,但如果是一个具有多种不同模式的复杂 Python 函数,可能就需要十个。然后,使用 Ivy 重新创建所有这些行为,每个 Ivy 函数都有特定的 Paddle 后端。因此,一个 PyTorch 函数可能需要多个 Ivy 函数,而这些 Ivy 函数又可能需要多个 Paddle 函数来完全重新创建该行为。所有变体、额外的参数和边缘情况都可以通过中间表示和 API 得到支持。在这些情况下,需要将其作为 Paddle 函数的组合重新创建,尽管这可能以运行时间速度为代价,但通常不会看到大的损失。 ")]),_:1})]),_:1})]),l("li",null,[k,e(a,null,{default:n(()=>[e(o,{name:"Daniel",github:"djl11"},{default:n(()=>[t(" 在从 PyTorch 转换模型到 Paddle 后,因为现在 Paddle 模型就是一个加强版的 PyTorch 模型,转换权重可以相对简单,比如将它们转换为 Numpy 数组,然后加载到 Paddle 中。实际上,Ivy 在模型转换过程中,会自动把所有的 PyTorch 权重转换为 Paddle 权重。 "),D,t(" 目前没有更快的转换方式,通常使用 DLPack(张量数据结构的中间表示标准)作为中间件,但由于不同框架对 DLPack 的支持不一致,最终选择使用 Numpy 作为中介。我们把将权重转移到 CPU,以高精度格式存储并转换为 Numpy 数组,然后转移到新框架中,这种方法在 demo 演示中以及对于大型模型都能很好地工作。 "),j,t(" 实际上目前的转换是基于 function tracing,如果大型语言模型需要多个 GPU 运行,这可能会有些复杂。不过,我们将很快转向使用纯 symbolic tracing 方法,届时就不需要存储所有权重和中间数组,而是基于符号追踪的代理数组,这将意味着不需要启动大量 GPU 来完成函数追踪。 ")]),_:1})]),_:1})]),l("li",null,[x,e(a,null,{default:n(()=>[e(o,{name:"Daniel",github:"djl11"},{default:n(()=>[t(" 从工程成本的角度来看,支持一个新 API 并不困难,也不是我们特别关注的问题。我们大部分时间都花在了 function tracing 的逻辑、抽象语法树(AST)逻辑以及编译器和追踪器上。 "),q,t(" 添加一个新的前端功能并不难,做起来相当快速和容易。事实上,所有前端 API 和后端 API 都是完全开源的(Apache 2 许可),任何人都可以为其贡献代码。如果在转换模型时失败,并且报错消息指出模型转换失败是因为缺少来自 Ivy/PyTorch 前端的某个函数,我们还提供了如何提交拉取请求以及如何自行添加该功能的链接。真正困难的部分是处理动态控制流、以可扩展的方式进行函数追踪、获取正确的抽象语法树表示,这些都是与框架无关的工作,我们以一种不特定于任何框架的方式进行这些工作。因此,简短的回答是添加新 API 相对容易,真正困难的是其他部分。 ")]),_:1})]),_:1})]),l("li",null,[w,e(a,null,{default:n(()=>[e(o,{name:"Daniel",github:"djl11"},{default:n(()=>[t(" Ivy 本身也是一个框架,拥有自己的前端 API(如 TensorFlow、PyTorch、JAX 等)以及自己的一套函数。Ivy 的 function API 有两个用途:第一个用途是作为一个中间表示,用于从一个框架转换到另一个框架,即 Ivy 的 API 充当中间表示;第二个用途是作为其自身的框架,允许直接在 Ivy 中编写新代码,可以在 Ivy 中编写整个模型,并使用 Ivy 类和 Ivy 函数,然后可以切换后端,使用 Paddle、TensorFlow、PyTorch 或 JAX 等。因此,Ivy 既能自身作为框架,也能转译其他框架。但我们认为最有价值并且最直接的是转译器功能,因为这样已有的所有代码都可以直接使用,而无需任何人编写新的 Ivy 代码。 ")]),_:1})]),_:1})]),l("li",null,[R,e(a,null,{default:n(()=>[e(o,{name:"Daniel",github:"djl11"},{default:n(()=>[t(" 是的!如果忽略前端,Ivy 和 Keras 非常相似。 ")]),_:1})]),_:1})]),l("li",null,[M,e(a,null,{default:n(()=>[e(o,{name:"Daniel",github:"djl11"},{default:n(()=>[t(" 这是一个很好的问题。目前,鉴于转译器是基于函数追踪(function tracing)的,确实需要调用模型以追踪图(graph),这意味着在转换时需要能够对模型进行推理。现在,转换本身不需要在目标设备上进行,只要你有一台内存足够的机器,就可以在 CPU 上完成转换,并且默认情况下转换是在 CPU 上进行的,因为通常 CPU 有的 RAM 比 GPU 多。 "),N,t(" 在转译器的一个很旧的版本中,我们曾同时获取所有 PyTorch 权重和所有 Paddle 权重,并让它们同时存在于内存中,这是非常糟糕的做法。现在,权重从 A 转换到 B 是逐步进行的,我们先取第一个权重,将其转换为 Numpy,然后转换为 Paddle,接着转换第二个权重,这样我们就不会重复获取权重。但是,我们避免尽可能多的函数追踪(function tracing),我们现在有自己的 AST(抽象语法树)方法,这个方法工作得很好、非常稳定,我们正在与几家公司合作开发这一点。 "),S,t(" 最终设计基于 AST,基于符号追踪,我们将实际的函数追踪作为最后的手段,因此内存使用将会非常低。但是,正如你所说,现在确实需要一些 RAM 来转换一个非常大的模型,但希望在几个月内,这将不再是问题。 ")]),_:1})]),_:1})]),l("li",null,[U,e(a,null,{default:n(()=>[e(o,{name:"Daniel",github:"djl11"},{default:n(()=>[t(" 平衡生活和工作非常困难,但幸运的是,我真的很热爱我正在做的事情,这是保持我动力的原因。我们不仅仅是在做一个开源项目,还在建立一家公司,需要与客户进行沟通。虽然我是唯一的创始人(并非是原本的设计),而且这确实需要付出大量的工作,但我对统一人工智能领域的景象充满热情,总是对看到的碎片化情况感到沮丧,无论是在 AI 框架还是在大型语言模型(LMM)的领域。目前我们正在努力统一这些领域,保持激情和兴奋是我继续前进的动力,如果我不再感到兴奋,可能就不会那么有趣了。幸好,我始终保持着兴奋感,所以工作并不感觉艰难。确实,因为这些并不感觉像是工作,所以更容易保持。 "),V,t(" 此外,帝国理工学院的学习经历非常紧张,这让我掌握了之前缺少的知识教育和时间管理经验。 "),F,t(" 但我也要说,我会把周日作为休息日,我认为你也需要休息,否则很快就会感到疲惫不堪。 ")]),_:1})]),_:1})]),l("li",null,[B,e(a,null,{default:n(()=>[e(o,{name:"Daniel",github:"djl11"},{default:n(()=>[t(" 英国的人工智能环境还是不错的。虽然我经常到处旅行,在欧洲和美国都呆过相当长的时间,所以并不算是英国本地人,但英国的 AI 环境绝对是值得关注的。比如,DeepMind 就设在英国,谷歌的主要 AI 分支也在伦敦。显然,Meta、亚马逊以及其他几家公司也在伦敦设有 AI 办公室。伦敦还有很多有趣的初创公司,所以我觉得很幸运能住在伦敦,特别是在靠近国王十字的伊斯灵顿区,那里可以说是整个科技圈的中心。我遇到的很多很酷的初创公司以及举办的活动数目都令人惊叹,所以我认为这里的环境非常好。我很高兴能在伦敦,与这么多创造酷炫事物的人在一起。 "),G,t(" 我认为最大的 AI 人才集中地是旧金山,那里又是另一个水平,但我仍感觉英国很棒,伦敦也很棒,虽然它还没有达到旧金山的水平,但也许将来会有所改变。 ")]),_:1})]),_:1})])]),Q,l("ul",null,[l("li",null,[J,e(a,null,{default:n(()=>[e(o,{name:"RedContritio",github:"RedContritio"},{default:n(()=>[t(" 是的,基于解析 python 源码,然后根据 AST 生成 Paddle 模型。 ")]),_:1})]),_:1})]),l("li",null,[K,e(a,null,{default:n(()=>[e(o,{name:"RedContritio",github:"RedContritio"},{default:n(()=>[t(" 直接转换,没有中间表示。 ")]),_:1})]),_:1})])]),O,X,E]))}});export{Z as __pageData,ll as default}; diff --git a/assets/posts_pku-course.md.BIsX0K5j.js b/assets/posts_pku-course.md.BIsX0K5j.js new file mode 100644 index 0000000..38009d0 --- /dev/null +++ b/assets/posts_pku-course.md.BIsX0K5j.js @@ -0,0 +1 @@ +import{_ as e,c as a,o as t,l as r}from"./chunks/framework.CEb3mtFd.js";const s="/assets/jun-present.BtGbfy4w.jpg",o="/assets/jie-present.BZ_ZT7yz.jpg",n="/assets/apollo-park-all.B5rKS27b.jpg",p="/assets/apollo-park-meng-present.C8_YR9Ph.jpg",g=JSON.parse('{"title":"飞桨开源社区走进北京大学课堂","description":"","frontmatter":{"title":"飞桨开源社区走进北京大学课堂","date":"2023-11-21T00:00:00.000Z","author":{"name":"Jun","github":"jzhang533"},"co_authors":[{"name":"杰师傅","github":"Aurelius84"}]},"headers":[],"relativePath":"posts/pku-course.md","filePath":"posts/pku-course.md"}'),l={name:"posts/pku-course.md"},i=r('

飞桨开源社区走进北京大学课堂

10 月 11 日,飞桨开源社区应北京大学计算机学院周明辉副院长邀请,在周老师的开源软件开发课程的第四次课上,为北大的同学们介绍了飞桨开源社区和飞桨新一代 IR 设计。

Jun 给同学们介绍了飞桨开源社区的基本情况 jun-present

杰师傅给同学们深入浅出的介绍了飞桨新一代 IR 设计。 jie-present

课程材料在线观看

这次课程的 Slides,可以在这里在线浏览:飞桨-北大讲课-2023-10-11

彩蛋 🎊

飞桨开源社区曾经在 Apollo Park 接待过北大的国际留学生,梦师傅曾经全英文给参加北京大学夏季夏令营的牛校的神兽们讲解过飞桨。 apollo-park-allapollo-park-meng-present

',8),_=[i];function c(m,u,E,A,h,B){return t(),a("div",null,_)}const b=e(l,[["render",c]]);export{g as __pageData,b as default}; diff --git a/assets/posts_pku-course.md.BIsX0K5j.lean.js b/assets/posts_pku-course.md.BIsX0K5j.lean.js new file mode 100644 index 0000000..9621ea9 --- /dev/null +++ b/assets/posts_pku-course.md.BIsX0K5j.lean.js @@ -0,0 +1 @@ +import{_ as e,c as a,o as t,l as r}from"./chunks/framework.CEb3mtFd.js";const s="/assets/jun-present.BtGbfy4w.jpg",o="/assets/jie-present.BZ_ZT7yz.jpg",n="/assets/apollo-park-all.B5rKS27b.jpg",p="/assets/apollo-park-meng-present.C8_YR9Ph.jpg",g=JSON.parse('{"title":"飞桨开源社区走进北京大学课堂","description":"","frontmatter":{"title":"飞桨开源社区走进北京大学课堂","date":"2023-11-21T00:00:00.000Z","author":{"name":"Jun","github":"jzhang533"},"co_authors":[{"name":"杰师傅","github":"Aurelius84"}]},"headers":[],"relativePath":"posts/pku-course.md","filePath":"posts/pku-course.md"}'),l={name:"posts/pku-course.md"},i=r("",8),_=[i];function c(m,u,E,A,h,B){return t(),a("div",null,_)}const b=e(l,[["render",c]]);export{g as __pageData,b as default}; diff --git a/assets/posts_pytorch-conference-01.md.BBNDYGg1.js b/assets/posts_pytorch-conference-01.md.BBNDYGg1.js new file mode 100644 index 0000000..5a6702b --- /dev/null +++ b/assets/posts_pytorch-conference-01.md.BBNDYGg1.js @@ -0,0 +1 @@ +import{_ as e,c as o,o as r,l as t}from"./chunks/framework.CEb3mtFd.js";const a="/assets/conference-1.DBvZ5WAN.png",n="/assets/conference-2.CId3e9nV.png",i="/assets/conference-3.BbykAX0f.png",c="/assets/conference-4.B6IVZNeq.png",h="/assets/conference-5.BXAfcv7B.png",l="/assets/conference-6.DpRNenSJ.png",k=JSON.parse('{"title":"【睁眼看世界 🌍】|PyTorch Conference 2023 - State of PyTorch","description":"","frontmatter":{"title":"【睁眼看世界 🌍】|PyTorch Conference 2023 - State of PyTorch","date":"2024-3-03","author":{"name":"孙钟恺","github":"sunzhongkai588"},"co_authors":[{"name":"散步(小散)","github":"sanbuphy"}]},"headers":[],"relativePath":"posts/pytorch-conference-01.md","filePath":"posts/pytorch-conference-01.md"}'),s={name:"posts/pytorch-conference-01.md"},p=t('

本文是对 PyTorch Conference 2023 中的《State of PyTorch》部分进行了精准的中文翻译和详细的文字总结,旨在向读者介绍 PyTorch 社区的 2023 年动态。同时也特别参考了散步大佬的《PyTorch Conference 2023 翻译系列文章》,在此基础上,进行了细致的校对和优化,确保翻译准确无误。对散步大佬之前的辛勤翻译和对开源社区的贡献,表示衷心的感谢和敬意。


写在最前

【睁眼看世界 🌍】专栏旨在打破知识边界,通过将国际上的优秀文章、会议精华以及高质量学习资料翻译成中文,使得这些宝贵的知识资源能够为广大中文读者所共享,而不是局限于国内的小圈子。

对于对此有兴趣、愿意贡献力量的开发者,也可以联系孙师傅,一同完善这个栏目,共同促进知识的自由流动和技术的共同进步。


Lightning Talk

我的名字是 Alban,是 META 的一名软件工程师,已经在 PyTorch 工作了很长时间,并且主要在 PyTorch 核心库维护方面做了很多工作。

在今天这个快速闪电演讲中,我要给大家介绍一下 PyTorch 的现状。以前参加过大会的人,也许知道我们每年都在进行着类似的讨论。Joe 去年就在这里做了类似演讲。今天我想谈论的是三个重要的 PyTorch 里程碑,以及今年发生的三个重要活动,还会谈论一些有趣的数字。Joe 之前已经给大家展示过其中的一些,但能亲眼看到这些数据总归是很有趣的。而在最后,我会给大家介绍一下如何参与 PyTorch ,以及如何帮助我们一起建设 PyTorch。

PyTorch Milestones

1. PyTorch 2.0

  • 20M+ downloads
  • Adds:
    • torch.compile
    • MPS backend for Apple M1/M2
    • torch.func
    • set_default_device
    • Better transformer

第一个重要的 PyTorch 里程碑是:今年(2023 年)年初发布了 PyTorch 2.0 版本。它在所有平台上下载超过 2000 万次,所以对我们来说,这是一个相当重要的发版。并且,下载数量仍在增加。它添加了一系列非常重要的功能:

  1. torch.compile。我们已经讨论过它很多次,因此在这里不再讨论。
  2. MPS 后端。一个重要功能是支持 MPS 后端,能够充分利用 Apple M1/M2 芯片的 GPU 部分。现在该功能处于测试阶段,随着覆盖范围和稳定性的提升,会支持更多新功能。
  3. torch.func。对于了解这的人来说,它又叫 functorch。和 Jax 类似,它新增支持函数式 API,并且融入在 “PyTorch 世界”中,因此能兼容其他所有 PyTorch 功能。
  4. set_default_device。我不知道大家是否熟悉这个功能。它可以通过改变创建 PyTorch 模型时使用的默认设备,来显著加速初始化(initialization),例如直接在设备上进行初始化。或者如你在一些主题演讲中看到的例子一样,快速的创建模型。通过使用元设备(meta device),即一个没有数据的伪设备(fake device),来跳过模型的初始化过程,直接加载权重。这样就可以避免占用太多内存,进行不必要的初始化等类似事情。
  5. 更好的 transformer。这是由 PyTorch 团队和众多 maintainers 共同努力做出的重大推进,一起改进 PyTorch 中的 transformer 模型。无论是 transofmer 相关的高层 API ,还是底层运算,你都可以拥有目前的最佳实现。

编者注 ✍️:这部分演讲内容是对 PyTorch 2.0 简略概括,详细内容可以看 Blog2.0 Release notes

2. Spring Docathon

  • 27 active partipants
  • 5 new tutorials & examples
  • 45+ PRs merged
  • 53+ issues closed

另一个值得一提的重要里程碑是:今年(2023 年)发起的 Spring Docathon 活动。该活动共吸引了 27 位开发者参与,成功合入了超过 45 个 PR(Pull Request),解决了 53 个 Issues。非常有效地促进了我们 tutorials 仓库的改进,不仅提高了教程的质量,还增加了新的教程内容,确保我们的教程始终保持最新。

编者注 ✍️:其实飞桨也提供了 Paddle Docathon ,活动初衷和 PyTorch 是一样的,但整体难度和质量比起 PyTorch Docathon 来说要低一些。第六期黑客松会有一个专门的赛道:优秀稿件征集与传播,大家也可以敬请期待。

3. First Year of the Foundation

  • Open to new membership June 2023
  • New premier members (IBM, Intel, Hugging-facing)
  • New general members (Graphcore)

最后,正如 Joe 和 Ibrahim 所提到的,今年(2023)是基金会成立的第一年。并且在今年六月,基金会向新成员敞开了大门。面对当前的发展,我们感到无比兴奋。

在我撰写这篇演讲稿时,我们已经迎来了四名新成员,而现在又新增了两名,增长的速度甚至超过了我制作幻灯片的速度。我对我们吸引到的成员的多样性感到非常激动,既有专注于底层组件和后端技术的企业,如 IBM 和 Intel,也有更注重高层应用、面向终端用户的企业,如 Graphcore 和 Hugging Face。看到我们在各个方面都在取得增长,对基金会和整个生态系统来说,确实是非常令人振奋的。

编者注 ✍️:Ibrahim Haddad 是 Linux 基金会副总裁(AI & DATA 方向),也是 PyTorch Foundation 董事会的执行官。

PyTorch in Numbers

接下来,让我们来看一些数字。

1. The pytorch/pytorch codebase

对于那些密切关注代码库的人而言,过去的一年(2022 年),我们总共有 12000 次 commits。并且我们非常高兴看到开源贡献增长了 8%,这里的增长特指来自于除日常核心维护人员之外的开源贡献者。

图表展示了每年我们代码库的 commits 数量。如你所见,它正在不断增长,并且未来也会越来越多。

conference-1

2. The pytorch/pytorch top contributors

所有的开源贡献增长都离不开我们每一位贡献者的共同努力。今年,我们共有 1,128 名贡献者对代码库作出了贡献,相较去年增长了 10%。看到这么多人投身于 PyTorch 的开源工作,实在是让人感到非常振奋。

我在此列出了一些提交量最多的贡献者的 GitHub ID,他们的活跃度非常高。当然,还有许多人虽然只提交了少量代码,但他们对代码的改进和贡献的多样性也极为关键。

这所有的努力共同促成了,GitHub 上使用 PyTorch 的仓库数量超过 600,000 个,比去年增长了 20%。因此,看到越来越多的人不仅使用 PyTorch,还发布基于 PyTorch 实现的代码,这确实非常让人兴奋。

conference-2

3. Driving state-of-the-art AI research

其中,大部分代码来自于科研领域,PyTorch 在推动许多前沿 AI 技术的发展方面发挥了重要作用。今年,已有超过 7,000 个 AI 科研论文相关的 GitHub 仓库用到了 PyTorch。事实上,60%的 AI 研究成果是基于 PyTorch 来实现的。因此,见证这样一个开放、繁荣的科研生态,我们感到无比兴奋。

conference-3

4. Powering the AI indusry

  • 65K+ PyTorch professionals(on LinkedIn)
    • 50%+ YOY increase
  • 3K new jobs requiring PyTorch

如今,PyTorch 在工业界的发展也取得了显著进步,正在迅速弥补之前的落后处境。以 LinkedIn 的统计数据为例,我们观察到将 PyTorch 作为核心技能的求职者每年增长率达到 50%,同时,越来越多的职位也开始要求应聘者掌握 PyTorch。

5. Talk of the town

我们的一切成就,都离不开我们庞大社区的支持。接下来,我想分享一些关于社区的有趣数据。Discuss Forum 是 PyTorch 为用户、开发者及其他所有人提供的互动论坛。每月,我们有大约 400 名新成员加入,网站浏览量超过 200 万次。同时,我们的网站也非常活跃,每月约有 2000 篇新帖子发布。我们非常需要活跃的社区,让更多成员帮忙解答用户和开发者的问题。

conference-4

Join us

在这里,我想呼吁大家加入我们!PyTorch 不仅是一个开源项目,它也是我们共同奋斗的目标。只有依靠一个庞大而活跃的社区,我们才能不断推动 PyTorch 向前发展。因此,我们做了很多工作来尝试巩固我们的社区生态。

1. How to get involved

我们根据社区里很不错的反馈(包括如何帮助新成员融入、如何让他们共同参与到 PyTorch 的建设中来),创建了一个新页面——PyTorch 终极贡献指南。点击下面的链接可以查看,接下来我也会讲一下如何参与其中。

PyTorch 终极贡献指南:https://github.com/pytorch/pytorch/wiki/The-Ultimate-Guide-to-PyTorch-Contributions

2.Non-code contributions

首先我想和大家讲的是,我们是有很多非代码的贡献。所以对 PyTorch 的贡献远不止编写代码,还有很多其他方面的工作。

conference-5

在左边可以看到我之前提到的论坛。同时我们还有一个开发者论坛 Dev-Discuss,在这里,你可以提问、回答问题或与社区成员讨论各种话题。这些都是非常重要的贡献方式,而且每个人都可以参与其中。另外,因为社区中的所有人都可以建设 PyTorch,所以报告问题、提出新功能建议等也是你可以做出的重要贡献。例如,我们非常欢迎大家对我今天提到的新功能提出反馈,无论是 torch.compile 还是其他功能。请告诉我们什么地方做得不够好,什么工作得很好,以及你还需要什么功能。

3. Code contributions

  • Reproduce and investigate issues
  • Bugfix/FeaturePullReguests
  • Review/maintain
  • Documentationch

当然,众所周知,代码贡献自然也是非常重要的。这里我认为第一点(Reproduce and investigate issues)特别有趣,这可能不是每个人都会想到的贡献方式,但帮助复现和调查 issues 是非常非常有价值的一件事情,即使这并不是在“编写代码”,并且也比较耗时。多年前,当我开始为 PyTorch 做贡献时,我做的第一件事就是 debugging issues,并在论坛上回答问题。这不仅有趣,也非常有帮助,因为一旦我们明确了问题所在,接下来的修复 bug 和增加新功能的工作就会变得更加简单。在 PyTorch 社区,提交 bug 修复或新功能的 PR 往往是解决问题过程中最迅速的一步。找到问题所在,弄清楚需要做什么,实际上才是最关键的的。

第三点是,我鼓励任何感兴趣的开发者不只是提交代码,也帮助我们审查代码和维护代码库。现在基金会完全开放了,我们有来自世界各地的许多贡献者帮助我们维护 PyTorch 的子仓库,我们鼓励所有感兴趣的人参与进来。

最后,我们也非常重视文档的编写和改进。我相信许多人都知道我们的文档网站和教程网站,我们也在努力的增加更多文档内容,所以任何文档相关的贡献都非常欢迎。对于那些对此感兴趣的人,我们下个月将举办一个 PyTorch Docathon 文档马拉松活动。如果你想参加,学习新技能并获得认可,请关注我们的博客文章了解更多信息。

conference-6

编者注 ✍️:活动已经结束了哦~

编者最后的碎碎念

  • PyTorch 生态力量非常强大,是目前 Paddle 或者国内任何一个深度学习框架都无法企及的一个高度。
  • Paddle 本身的社区治理结构、运作方式,其实是带有一定国内特色的。
  • 翻译会议真的很花时间,比单纯的翻译文章累多了,散步能翻译到 30 篇后(总共 60 多篇) 的会议内容真的太强了。目前散步在和 Linux 基金会取得联系,可能会有专门的团队进行翻译,有兴趣加入的也可以联系他。
  • 散步做的一个英文转录翻译的工具,可以看看:https://github.com/sanbuphy/WhisperTranslator
',63),u=[p];function b(d,g,f,y,P,m){return r(),o("div",null,u)}const T=e(s,[["render",b]]);export{k as __pageData,T as default}; diff --git a/assets/posts_pytorch-conference-01.md.BBNDYGg1.lean.js b/assets/posts_pytorch-conference-01.md.BBNDYGg1.lean.js new file mode 100644 index 0000000..a4a582e --- /dev/null +++ b/assets/posts_pytorch-conference-01.md.BBNDYGg1.lean.js @@ -0,0 +1 @@ +import{_ as e,c as o,o as r,l as t}from"./chunks/framework.CEb3mtFd.js";const a="/assets/conference-1.DBvZ5WAN.png",n="/assets/conference-2.CId3e9nV.png",i="/assets/conference-3.BbykAX0f.png",c="/assets/conference-4.B6IVZNeq.png",h="/assets/conference-5.BXAfcv7B.png",l="/assets/conference-6.DpRNenSJ.png",k=JSON.parse('{"title":"【睁眼看世界 🌍】|PyTorch Conference 2023 - State of PyTorch","description":"","frontmatter":{"title":"【睁眼看世界 🌍】|PyTorch Conference 2023 - State of PyTorch","date":"2024-3-03","author":{"name":"孙钟恺","github":"sunzhongkai588"},"co_authors":[{"name":"散步(小散)","github":"sanbuphy"}]},"headers":[],"relativePath":"posts/pytorch-conference-01.md","filePath":"posts/pytorch-conference-01.md"}'),s={name:"posts/pytorch-conference-01.md"},p=t("",63),u=[p];function b(d,g,f,y,P,m){return r(),o("div",null,u)}const T=e(s,[["render",b]]);export{k as __pageData,T as default}; diff --git a/assets/posts_sanbu-story.md.Bbv7dzA3.js b/assets/posts_sanbu-story.md.Bbv7dzA3.js new file mode 100644 index 0000000..d9c366e --- /dev/null +++ b/assets/posts_sanbu-story.md.Bbv7dzA3.js @@ -0,0 +1 @@ +import{M as i,_ as n}from"./chunks/MessageBox.BjkmF0_f.js";import{c as o,x as e,i as r,v as a,l,a as t,o as s}from"./chunks/framework.CEb3mtFd.js";const g="/assets/sanbu-01.BmLwkxl7.jpg",h="/assets/sanbu-02.CbmTx2S8.jpg",u="/assets/sanbu-03.CN4yarz2.jpg",p="/assets/sanbu-04.xtcdIdF6.jpg",c="/assets/sanbu-05.DXN_Ieqp.jpg",d="/assets/sanbu-06.UwhvCp2U.jpg",b="/assets/sanbu-07.DmjkGGLp.jpg",f="/assets/sanbu-08.Ck6rEVYm.jpg",_="/assets/sanbu-09.Dddg5DQv.jpg",m="/assets/sanbu-10.CLzscM3v.jpg",y="/assets/sanbu-11.zJPpyF50.jpg",k="/assets/sanbu-12.4-hUXVF8.jpg",x=l('

“负暄檐宇下,散步池塘曲”,本期我们邀请到了热情好学的散步 🚶‍♀️ 师傅!你想知道他的人生理想么?你想了解他的学习历程么?你想知道他的日常生活么?你想得到他的真挚祝福么?点击此篇博客,让我们一起走进小散的浪漫人生~

一、个人名片

sanbu-01

编者注✍️:潇某真的有很努力把小散的照片 P 得可爱,想看原图可以私聊 😁,反正肯定不会给滴 🐶!

二、采访内容

  1. 散师傅,给大家介绍一下自己吧!

    小散师傅: 大家好!我是散步🚶(@sanbuphy),菜但是喜欢学。你们可能会在水群之旅中遇到我。如果觉得我话痨了,请喊我去学习;如果你也喜欢讨论问题,欢迎随时找我一起讨论进步 😁😁;如果你觉得我有缺点,很欢迎你直接指出,这是我自省并前进的动力之一;如果你喜欢做开源 & 没事喜欢做一些玩具,那更请你和我一起去快乐开源!!!!

    「散步」 名字由来(用小散原话):因为我想人生就这样 不要那么焦虑,也不要浪费;想要在一个茶足饭饱的午后,在阳光的指引下因生命的跳动而缓缓向前。最好的指代应该是散步,想要向前,但不至于拧巴,就这样的走下去了,也就像生活这般的过下去了。

  2. 大家对你都比较熟悉,一方面是因为你在社区的贡献量,另一方面是因为你经常水群,能不能给大家讲讲 你是怎么做到同时水 5~10 个群的?

    小散师傅: 其实这个很简单。只要你和我一样宅 & 不打游戏 & 没有女朋友 & 打字飞快,就可以一次性水完全部群了!(群保安,不时保卫一下群里的业主们 😂😂)为数不多的好处就是因此可以认识各类大佬。

    小散四件套
  3. 听说不只是 Paddle 的群,你也加了很多别的群,有没有比较有意思的群可以分享?

    小散师傅: 其实我加的大部分群都是技术群。可能也许,我觉得有意思的大家觉得无聊呢。。。 最近觉得比较好玩的是:dlsys 相关的学习群和我自己的一个每周写博客打卡群(不写就发红包 🥹🥹)。但我觉得每一个有大佬愿意和我交流的群都很有趣,能和大佬们在一起学习成长是我的荣幸,也是我的快乐。我可以在聊天中获取对新事物的理解,我沉迷于此。

    编者注✍️:散佬有自己的博客哦 ➡️ https://www.aispacewalk.cn/

  4. 你本科毕业于福州大学,给大家分享一下福大的吃喝玩乐攻略吧!在学校时,有没有什么好玩的事情发生?

    小散师傅:

    • 食堂对面的水果捞,都很好吃 😋😋,阿姨会很诚实的说水果 🍉 酸还是甜;
    • 湖边很好看,草坪很大,适合躺平;
    • 曾经参加学校管弦乐团 🎺,那是我最快乐的时光之一;
    • 水煮肉片 yyds,没有之一;
    • 曾经有一张神图火遍全网(一只狗望着楼梯下的情侣),没错,就是咱们教学楼拍的;
    • 食堂基本上可以随便吃,很难踩雷(我最爱吃的就是食堂)。
    梦的证据
    上述谈到的小狗望情侣照片

    编者注✍️:下面有小散师傅参与管弦乐团的照片哦~

  5. 我了解到:你是物理系出身,当时为什么会选这个专业呢?后来为什么又放弃对物理的学习?

    小散师傅:

    • 选物理专业原因:很简单,每个曾经中二的少年 🧒 都想研究宇宙和量子力学(你想掌握力量吗 😈?)
    • 对于放弃物理的学习:因为发现自己笨而且懒,也许做不出什么有价值的东西了,以及发现自己的本心并不在于物理,而物理应该属于本心就在于它的人,只有这样才配得上一直学下去。光是耍小聪明是不可能被物理之神眷顾的。
  6. 后来你开始学经济,然后才转向深度学习。是什么让你开始学经济,后来又是怎么喜欢上深度学习的呢?

    小散师傅: 学经济是因为:看到了徐高老师的《宏观经济二十五讲》。他的讲课中有一张图让我很是触动且惭愧(我每次想偷懒就翻出来看看👀),我觉得让他们(下方图片中的人)过得更好是我想做的事情。但后来,做了一些经济学相关的事(研究金融危机和大衰退/做经济学实证研究)以及听到了老师说的一句话:“写是一回事,采纳又是一回事”,我就发现:只有能有实际用途和影响力的东西才是重要的。还记得《宏观经济学二十五讲:中国视角》中经典的一句话,凯恩斯说:“从长远看,我们都已死去”。所以,人生实属短暂,我们应当在短时间内接触更有为主义的事情,现在就要让他实现。

    喜欢上深度学习:它足够强,可以在短期内对人有帮助,仅此而已。

    徐高讲课中的图
  7. 在转向深度学习的过程中,有没有遇到什么困难?又是如何克服的?

    小散师傅: 实际上,与学习物理和数学相比,深度学习稍微没那么抗压,难度大的反而在计算机基础。但总的来说,我一直遵守八个字:“不懂就问、不会就学”。我喜欢向所有比我厉害的人学习,只要朝着目标,随机梯度下降就行了。我没有特别的克服什么困难,那样听起来很痛苦;实际上更多的应该是快乐和珍惜,在 🫂 拥抱每一次难题中尝试进步。

  8. 你觉得进入深度学习领域让你感觉到快乐么? 你觉得这一系列的转变对你的职业生涯和个人发展有何影响?

    小散师傅: 总的来说我认为还是快乐的!因为他拥有无限的创造力,也有很大的可能永远地改变人类的生产力。我觉得这个转变是我人生中的随机扰动因子,人生是一场锚定自身性格特质与价值观的随机游走,我们猜不到之后会发生什么,只能让命运沿着自己向前发展,也许等之后发生了各种各样的事情, 我就能找到一条看似靠谱理由回答今天的疑问了。不过,从价值观来说,也许没有影响,只是在愿景上的不同实现方式罢了。

  9. 你提到选择计算机领域的决定源于对提高生产力的渴望,那么在你看来,深度学习和开源社区是如何实现这一目标的?

    小散师傅: 开源社区是深度学习发展的最大加速器之一,而深度学习则是创造力和智力普及化的最大加速器。

  10. 你是怎么与飞桨相遇的呢?你个人对飞桨的印象如何呢?

    小散师傅: 其实我本来是在 OpenMMLab 社区混的,但是看到 Paddle 社区回复勤一点(没有拉踩!研发大哥确实多一些)以及大佬参与被拉入坑,然后发现了新大陆、接触了很多大佬。非常感谢能和 Paddle 相遇。我对 Paddle 的印象就是:在国内你很难找到一个那么多研发大哥和开源大佬陪你一起卷以及发各种奖励的社区了(甚至有时候周末都会回复你)。很多有趣的方向都可以尝试,和飞桨最好的相处方式就是和它一起变的更强。但很惭愧的是我由于太忙,现在参加的频率变低了,其实很多项目都非常好玩,希望大家有时间的话可以当游戏多多参与。

  11. 在开源社区中,您认识了很多开发者或是社区运营者。他们给你留下了什么印象?能具体举例说说么?

    小散师傅: 有太多人所以我只能简短说明,有没提到的朋友我先道哥歉,因为太多了。

    • 黄子豪(@DrRyanHuang)以及林旭(@isLinXu): 主要是我的引路人大哥,没有他们我不会学那么多。
    • 张一乔师傅(@liyulingyue): 让我知道了什么是热情!
    • zrr 老哥(@zrr1999): 让我知道了什么是坚持和热情,以及深耕和专注很重要。
    • 卢畅老哥(@AndSonder): 一直很认真专注,我很想学会拥有他们的水平,可以洋洋洒洒几百上千行代码多文件代码。
    • 花花(@Tulip-hua): 社区顶流运营不必说!
    • 梦师傅(@Ligoml): 每次看到梦师傅就想问头发颜色变了没。
    • 001(@SigureMo): 热情、专注、可怕的强——集三位一体的每一位 Paddle 开源社区老哥的偶像。
    • zbc(@Zheng-Bicheng): 渣男!但是很强。
    • 涛姐(@luotao1): DDL 战士!
    • 军哥(@jzhang533): 深藏功与名的感觉。
    • 其他师傅: 其实很多师傅眼熟,都是我很佩服的人,希望大家能一直在开源社区走下去,大家都是我的老师(认真滴)。
  12. 你在 Paddle 社区中经历过最搞笑的事情是什么?

    小散师傅: 某次黑客松第四期清一色取某人的名字玩梗(咳咳,这里打个谜语)

    编者注✍️:黑客松是百度飞桨社区举办的深度学习领域大型编程活动,鼓励开发者了解与参与飞桨深度学习开源项目,做出自己的代码贡献。

黑客松花花名字梗
  1. 你是否有一些特别喜欢的开源项目或者技术?可以分享一下你喜欢的原因吗?

    小散师傅: 我最喜欢的技术其实没有特别的哪一个,我都很喜欢,都有它独特的美感,能不能都喜欢❤️! 开源项目的话,那肯定是 Paddle ,当然其他开源项目我也很喜欢(比如 OpenVINO),只要拥有社区和快速答复的研发大哥,那一定就是我爱的社区。

  2. 散师傅对开源肯定有自己独特的见解,那么你认为什么样的人才能称得上是一位优秀的开源者?

    小散师傅:

    • 能一个人召集一些贡献者;
    • 文能随手撕几百几千行代码,武能独立开设新仓库包括完整的体系架构建设;
    • 熟读几个开源项目源码(至少一个大项目);
    • 熟练 GitHub 操作(独立开设 CI、review PR、审核 issue 等);
    • 写一个漂亮的 README 而不感到烦躁。
  3. 你的周末一般时这么度过的?会和朋友出去玩还是宅家呢?

    小散师傅: 很显然——宅,主要是每天都觉得自己很菜,还是花时间努力变强吧,向一切大佬们学习。而且,由于我的事情太多,每天几乎都要处理到比较晚,周末也是如此。不过我最开心的事情就是偶尔可以去拍拍照,安慰一下我的艺术脑的创作欲。

    编者注✍️:下方 🈶️ 散师傅的摄影作品。散师傅尤其喜欢运用光影!

  4. 总结一下你最喜欢的一句话!

    小散师傅: 见善从之,闻义则服;见路不走,实事求是;不懂就问,不会就学。

  5. 新的一年开始了~散师傅给我们小小总结一下你的 2023 年,展望一下 2024 年怎么样?

    小散师傅: 2023 有一些务虚,希望 2024 可以更加务实、专注、静下心,不要偷懒,聚焦于做一些长期主义、有用的事情(比如某个方向能够随手成百上千行),链接更多的有缘人并相互成长。希望自己可以变成更从容的人、能帮助别人的人、更阳光开朗的人、能传递快乐与希望的人。

    不过,比起展望自己的 2024,我更希望大家的 2024 都能变得越来越好;人间短暂,希望我们都能走在希望的田野上,无论岁月如何流淌,都能在梦想的道路上互相映照,让生命力在每一处角落绽放。我无比真诚祝愿每一位看过&没看过这篇博客的朋友都能寻找到自己的希翼与幸福。 祝愿每一位人安好。

    编者注✍️:这是小散师傅非常非常认真写的祝福,酝酿了很久很久!

三、小散的十八般武艺

小散爱好词云图

绘画篇 🎨

小散绘画

音乐篇 🪕

最上图为小散参加学校管弦乐队照片 下左为小散的小号 下右为小散为乐队设计的标志
',14),P=l('

摄影篇 📷

小散的摄影作品集1
小散的摄影作品集2

厨艺篇😋

小散厨艺展示集1
小散厨艺展示集2

四、著名大型评论平台——虎扑评论专区

散师傅很活跃,尤其是在开源群里活跃(都是在问问题!好卷~),因此也就结识了很多朋友 👬。这次我们邀请到和小散师傅有着密切联系的大佬们来谈谈他们对于小散师傅的印象。大家快来看看吧 😄~~

by zrr1999(@zrr1999

',9),j=t("h3",{id:"by-花花-tulip-hua",tabindex:"-1"},[e("by 花花("),t("a",{href:"https://github.com/Tulip-hua",target:"_blank",rel:"noreferrer"},"@Tulip-hua"),e(") "),t("a",{class:"header-anchor",href:"#by-花花-tulip-hua","aria-label":'Permalink to "by 花花([@Tulip-hua](https://github.com/Tulip-hua))"'},"​")],-1),q=t("h3",{id:"by-梦柳师傅-ligoml",tabindex:"-1"},[e("by 梦柳师傅("),t("a",{href:"https://github.com/Ligoml",target:"_blank",rel:"noreferrer"},"@Ligoml"),e(") "),t("a",{class:"header-anchor",href:"#by-梦柳师傅-ligoml","aria-label":'Permalink to "by 梦柳师傅([@Ligoml](https://github.com/Ligoml))"'},"​")],-1),w=t("h3",{id:"by-卢畅师傅-andsonder",tabindex:"-1"},[e("by 卢畅师傅("),t("a",{href:"https://github.com/AndSonder",target:"_blank",rel:"noreferrer"},"@AndSonder"),e(") "),t("a",{class:"header-anchor",href:"#by-卢畅师傅-andsonder","aria-label":'Permalink to "by 卢畅师傅([@AndSonder](https://github.com/AndSonder))"'},"​")],-1),v=t("h3",{id:"by-涛姐-luotao1",tabindex:"-1"},[e("by 涛姐("),t("a",{href:"https://github.com/luotao1",target:"_blank",rel:"noreferrer"},"@luotao1"),e(") "),t("a",{class:"header-anchor",href:"#by-涛姐-luotao1","aria-label":'Permalink to "by 涛姐([@luotao1](https://github.com/luotao1))"'},"​")],-1),z=t("ol",null,[t("li",null,"【开源社区对比研究】 以 CI 为例的调研,做的清晰明了;"),t("li",null,[e("在群里常常和 "),t("a",{href:"https://github.com/engineer1109"},"@engineer1109"),e(" 同学讨论技术问题;")]),t("li",null,"工作应该是推理方向的,但对性能优化、部署等其他方向也很有兴趣。")],-1),T=t("h3",{id:"by-张一乔师傅-liyulingyue",tabindex:"-1"},[e("by 张一乔师傅("),t("a",{href:"https://github.com/liyulingyue",target:"_blank",rel:"noreferrer"},"@liyulingyue"),e(") "),t("a",{class:"header-anchor",href:"#by-张一乔师傅-liyulingyue","aria-label":'Permalink to "by 张一乔师傅([@liyulingyue](https://github.com/liyulingyue))"'},"​")],-1),S=t("h3",{id:"by-军哥-jzhang533",tabindex:"-1"},[e("by 军哥("),t("a",{href:"https://github.com/jzhang533",target:"_blank",rel:"noreferrer"},"@jzhang533"),e(") "),t("a",{class:"header-anchor",href:"#by-军哥-jzhang533","aria-label":'Permalink to "by 军哥([@jzhang533](https://github.com/jzhang533))"'},"​")],-1),A=t("h3",{id:"by-文大潇😁-wenxiaohahaha",tabindex:"-1"},[e("by 文大潇😁("),t("a",{href:"https://github.com/wenxiaohahaha",target:"_blank",rel:"noreferrer"},"@wenxiaohahaha"),e(") "),t("a",{class:"header-anchor",href:"#by-文大潇😁-wenxiaohahaha","aria-label":'Permalink to "by 文大潇😁([@wenxiaohahaha](https://github.com/wenxiaohahaha))"'},"​")],-1),L=t("br",null,null,-1),C=t("br",null,null,-1),D=t("hr",null,null,-1),V=t("h2",{id:"写在最后-💡",tabindex:"-1"},[e("写在最后 💡 "),t("a",{class:"header-anchor",href:"#写在最后-💡","aria-label":'Permalink to "写在最后 💡"'},"​")],-1),N=t("p",null,[t("strong",null,"【开源江湖闲聊录】"),e(" 是一项专门为 Paddle 社区的开发者打造的特色访谈栏目 📚。在这里,我们邀请到每一位别具一格且富有热情的开发者,通过文字或语音的方式进行深入采访 🎙️,探索并展现他们背后独一无二的故事,将他们的经历、见解和创意整理成精彩内容,呈现给整个社区。")],-1),I=t("hr",null,null,-1),H=JSON.parse('{"title":"【开源江湖闲聊录】物理 ➡️ 经济 ➡️ 开源,看散步师傅的曲折求学史~","description":"","frontmatter":{"title":"【开源江湖闲聊录】物理 ➡️ 经济 ➡️ 开源,看散步师傅的曲折求学史~","date":"2024-1-14","author":{"name":"文潇","github":"wenxiaohahaha"},"co_authors":[{"name":"孙钟恺","github":"sunzhongkai588"},{"name":"散步(小散)","github":"sanbuphy"}]},"headers":[],"relativePath":"posts/sanbu-story.md","filePath":"posts/sanbu-story.md"}'),M={name:"posts/sanbu-story.md"},X=Object.assign(M,{setup(B){return(E,R)=>(s(),o("div",null,[x,e(" > 编者注✍️:小散师傅超级会拉二胡,还会小号🎺呢!!! "),P,r(i,null,{default:a(()=>[r(n,{name:"zrr师傅",github:"zrr1999"},{default:a(()=>[e(" 散师傅作为一个非人工智能相关专业的开发者,对各种新技术都充满热情,大部分时间都是靠业余时间自学新技术,虽然平时休息时间非常少,但是依然愿意花时间参与开源活动,并把自己看到的有趣的、有价值的开源项目分享出来,并留下自己的见解。同时散师傅的知识面也非常广,从半导体技术到计算机软件,再到硬件加速和大模型技术都有所涉猎,属于开发者中的佼佼者。 ")]),_:1})]),_:1}),j,r(i,null,{default:a(()=>[r(n,{name:"花花",github:"Tulip-hua"},{default:a(()=>[e(" 养成系技术大佬,很有开源热情,厦门见到散师傅感觉散师傅是个很好的人,但是感觉散师傅在互联网上要更E一点哈哈哈哈,线下见面好像话不是特别多。 ")]),_:1})]),_:1}),q,r(i,null,{default:a(()=>[r(n,{name:"梦柳",github:"Ligoml"},{default:a(()=>[e(" 散佬一直是我们社区的自学标兵,经常琢磨一些不同领域的技术问题,带着大家一起讨论学习,摇人参加快乐开源,很不错 👍。 ")]),_:1})]),_:1}),w,r(i,null,{default:a(()=>[r(n,{name:"卢畅",github:"AndSonder"},{default:a(()=>[e(" 散师傅是一个对技术非常有热情的大佬,在各大技术群里都很活跃。白天在公司打工,晚上和周末抽空也会研究新东西。他对技术的热情真的很令人钦佩,与他交流让人感受到他在学习新技术时所迸发的喜悦。 ")]),_:1})]),_:1}),v,r(i,null,{default:a(()=>[r(n,{name:"涛姐",github:"luotao1"},{default:a(()=>[e(" 我是从黑客松 TRT 推理算子中认识散步师傅的,对散步师傅印象比较深的有几个: "),z]),_:1})]),_:1}),T,r(i,null,{default:a(()=>[r(n,{name:"张一乔",github:"liyulingyue"},{default:a(()=>[e(" 一个神秘的大佬!似乎啥都会 🐮! ")]),_:1})]),_:1}),S,r(i,null,{default:a(()=>[r(n,{name:"军哥",github:"jzhang533"},{default:a(()=>[e(" 散步师傅很爱学习,也很会学习。你如果翻看他的个人 blog 和 GitHub 主页,会发现他从系统到算法,无所不学。学会后,他就在飞桨社区里做开源,也就是挖坑和填坑,做了很多很出色的工作。当然可能因为学太多了,以致于,还有些坑他挖了,还没填。我记得他做过很精彩的关于 Python 虚拟机的分享,研究过很长时间 torchdynamo,期待以后能在社区里,挖个大坑,并一起填上。今天,还意外发现他竟然自学过绿导师的操作系统课,这门课非常棒,在这里,也推荐给看到这段文字的读者。 ")]),_:1})]),_:1}),A,r(i,null,{default:a(()=>[r(n,{name:"wendaxiao",github:"wenxiaohahaha"},{default:a(()=>[e(" 和小散师傅聊天时,我能感觉到他是一个可爱的人。我从来没有见过那么多可爱的表情包(而我,很多沙雕的表情包,和小散形成鲜明对比)!除了可爱,我觉得小散是一个浪漫主义开源人,他有自己的崇高的理想和抱负(无关权财)。我希望他能坚持下去,实现自己的愿望!当然,他这个每天在群里问问题,清各种 ddl 的卷王,我是相信他的实力的!"),L,e(" 所以,继续闪闪发光吧,小散!"),C,e(" 再提一句:散师傅打字太快了,聊天我根本跟不上节奏!笑死 😆。 ")]),_:1})]),_:1}),D,V,N,I]))}});export{H as __pageData,X as default}; diff --git a/assets/posts_sanbu-story.md.Bbv7dzA3.lean.js b/assets/posts_sanbu-story.md.Bbv7dzA3.lean.js new file mode 100644 index 0000000..9950fd5 --- /dev/null +++ b/assets/posts_sanbu-story.md.Bbv7dzA3.lean.js @@ -0,0 +1 @@ +import{M as i,_ as n}from"./chunks/MessageBox.BjkmF0_f.js";import{c as o,x as e,i as r,v as a,l,a as t,o as s}from"./chunks/framework.CEb3mtFd.js";const g="/assets/sanbu-01.BmLwkxl7.jpg",h="/assets/sanbu-02.CbmTx2S8.jpg",u="/assets/sanbu-03.CN4yarz2.jpg",p="/assets/sanbu-04.xtcdIdF6.jpg",c="/assets/sanbu-05.DXN_Ieqp.jpg",d="/assets/sanbu-06.UwhvCp2U.jpg",b="/assets/sanbu-07.DmjkGGLp.jpg",f="/assets/sanbu-08.Ck6rEVYm.jpg",_="/assets/sanbu-09.Dddg5DQv.jpg",m="/assets/sanbu-10.CLzscM3v.jpg",y="/assets/sanbu-11.zJPpyF50.jpg",k="/assets/sanbu-12.4-hUXVF8.jpg",x=l("",14),P=l("",9),j=t("h3",{id:"by-花花-tulip-hua",tabindex:"-1"},[e("by 花花("),t("a",{href:"https://github.com/Tulip-hua",target:"_blank",rel:"noreferrer"},"@Tulip-hua"),e(") "),t("a",{class:"header-anchor",href:"#by-花花-tulip-hua","aria-label":'Permalink to "by 花花([@Tulip-hua](https://github.com/Tulip-hua))"'},"​")],-1),q=t("h3",{id:"by-梦柳师傅-ligoml",tabindex:"-1"},[e("by 梦柳师傅("),t("a",{href:"https://github.com/Ligoml",target:"_blank",rel:"noreferrer"},"@Ligoml"),e(") "),t("a",{class:"header-anchor",href:"#by-梦柳师傅-ligoml","aria-label":'Permalink to "by 梦柳师傅([@Ligoml](https://github.com/Ligoml))"'},"​")],-1),w=t("h3",{id:"by-卢畅师傅-andsonder",tabindex:"-1"},[e("by 卢畅师傅("),t("a",{href:"https://github.com/AndSonder",target:"_blank",rel:"noreferrer"},"@AndSonder"),e(") "),t("a",{class:"header-anchor",href:"#by-卢畅师傅-andsonder","aria-label":'Permalink to "by 卢畅师傅([@AndSonder](https://github.com/AndSonder))"'},"​")],-1),v=t("h3",{id:"by-涛姐-luotao1",tabindex:"-1"},[e("by 涛姐("),t("a",{href:"https://github.com/luotao1",target:"_blank",rel:"noreferrer"},"@luotao1"),e(") "),t("a",{class:"header-anchor",href:"#by-涛姐-luotao1","aria-label":'Permalink to "by 涛姐([@luotao1](https://github.com/luotao1))"'},"​")],-1),z=t("ol",null,[t("li",null,"【开源社区对比研究】 以 CI 为例的调研,做的清晰明了;"),t("li",null,[e("在群里常常和 "),t("a",{href:"https://github.com/engineer1109"},"@engineer1109"),e(" 同学讨论技术问题;")]),t("li",null,"工作应该是推理方向的,但对性能优化、部署等其他方向也很有兴趣。")],-1),T=t("h3",{id:"by-张一乔师傅-liyulingyue",tabindex:"-1"},[e("by 张一乔师傅("),t("a",{href:"https://github.com/liyulingyue",target:"_blank",rel:"noreferrer"},"@liyulingyue"),e(") "),t("a",{class:"header-anchor",href:"#by-张一乔师傅-liyulingyue","aria-label":'Permalink to "by 张一乔师傅([@liyulingyue](https://github.com/liyulingyue))"'},"​")],-1),S=t("h3",{id:"by-军哥-jzhang533",tabindex:"-1"},[e("by 军哥("),t("a",{href:"https://github.com/jzhang533",target:"_blank",rel:"noreferrer"},"@jzhang533"),e(") "),t("a",{class:"header-anchor",href:"#by-军哥-jzhang533","aria-label":'Permalink to "by 军哥([@jzhang533](https://github.com/jzhang533))"'},"​")],-1),A=t("h3",{id:"by-文大潇😁-wenxiaohahaha",tabindex:"-1"},[e("by 文大潇😁("),t("a",{href:"https://github.com/wenxiaohahaha",target:"_blank",rel:"noreferrer"},"@wenxiaohahaha"),e(") "),t("a",{class:"header-anchor",href:"#by-文大潇😁-wenxiaohahaha","aria-label":'Permalink to "by 文大潇😁([@wenxiaohahaha](https://github.com/wenxiaohahaha))"'},"​")],-1),L=t("br",null,null,-1),C=t("br",null,null,-1),D=t("hr",null,null,-1),V=t("h2",{id:"写在最后-💡",tabindex:"-1"},[e("写在最后 💡 "),t("a",{class:"header-anchor",href:"#写在最后-💡","aria-label":'Permalink to "写在最后 💡"'},"​")],-1),N=t("p",null,[t("strong",null,"【开源江湖闲聊录】"),e(" 是一项专门为 Paddle 社区的开发者打造的特色访谈栏目 📚。在这里,我们邀请到每一位别具一格且富有热情的开发者,通过文字或语音的方式进行深入采访 🎙️,探索并展现他们背后独一无二的故事,将他们的经历、见解和创意整理成精彩内容,呈现给整个社区。")],-1),I=t("hr",null,null,-1),H=JSON.parse('{"title":"【开源江湖闲聊录】物理 ➡️ 经济 ➡️ 开源,看散步师傅的曲折求学史~","description":"","frontmatter":{"title":"【开源江湖闲聊录】物理 ➡️ 经济 ➡️ 开源,看散步师傅的曲折求学史~","date":"2024-1-14","author":{"name":"文潇","github":"wenxiaohahaha"},"co_authors":[{"name":"孙钟恺","github":"sunzhongkai588"},{"name":"散步(小散)","github":"sanbuphy"}]},"headers":[],"relativePath":"posts/sanbu-story.md","filePath":"posts/sanbu-story.md"}'),M={name:"posts/sanbu-story.md"},X=Object.assign(M,{setup(B){return(E,R)=>(s(),o("div",null,[x,e(" > 编者注✍️:小散师傅超级会拉二胡,还会小号🎺呢!!! "),P,r(i,null,{default:a(()=>[r(n,{name:"zrr师傅",github:"zrr1999"},{default:a(()=>[e(" 散师傅作为一个非人工智能相关专业的开发者,对各种新技术都充满热情,大部分时间都是靠业余时间自学新技术,虽然平时休息时间非常少,但是依然愿意花时间参与开源活动,并把自己看到的有趣的、有价值的开源项目分享出来,并留下自己的见解。同时散师傅的知识面也非常广,从半导体技术到计算机软件,再到硬件加速和大模型技术都有所涉猎,属于开发者中的佼佼者。 ")]),_:1})]),_:1}),j,r(i,null,{default:a(()=>[r(n,{name:"花花",github:"Tulip-hua"},{default:a(()=>[e(" 养成系技术大佬,很有开源热情,厦门见到散师傅感觉散师傅是个很好的人,但是感觉散师傅在互联网上要更E一点哈哈哈哈,线下见面好像话不是特别多。 ")]),_:1})]),_:1}),q,r(i,null,{default:a(()=>[r(n,{name:"梦柳",github:"Ligoml"},{default:a(()=>[e(" 散佬一直是我们社区的自学标兵,经常琢磨一些不同领域的技术问题,带着大家一起讨论学习,摇人参加快乐开源,很不错 👍。 ")]),_:1})]),_:1}),w,r(i,null,{default:a(()=>[r(n,{name:"卢畅",github:"AndSonder"},{default:a(()=>[e(" 散师傅是一个对技术非常有热情的大佬,在各大技术群里都很活跃。白天在公司打工,晚上和周末抽空也会研究新东西。他对技术的热情真的很令人钦佩,与他交流让人感受到他在学习新技术时所迸发的喜悦。 ")]),_:1})]),_:1}),v,r(i,null,{default:a(()=>[r(n,{name:"涛姐",github:"luotao1"},{default:a(()=>[e(" 我是从黑客松 TRT 推理算子中认识散步师傅的,对散步师傅印象比较深的有几个: "),z]),_:1})]),_:1}),T,r(i,null,{default:a(()=>[r(n,{name:"张一乔",github:"liyulingyue"},{default:a(()=>[e(" 一个神秘的大佬!似乎啥都会 🐮! ")]),_:1})]),_:1}),S,r(i,null,{default:a(()=>[r(n,{name:"军哥",github:"jzhang533"},{default:a(()=>[e(" 散步师傅很爱学习,也很会学习。你如果翻看他的个人 blog 和 GitHub 主页,会发现他从系统到算法,无所不学。学会后,他就在飞桨社区里做开源,也就是挖坑和填坑,做了很多很出色的工作。当然可能因为学太多了,以致于,还有些坑他挖了,还没填。我记得他做过很精彩的关于 Python 虚拟机的分享,研究过很长时间 torchdynamo,期待以后能在社区里,挖个大坑,并一起填上。今天,还意外发现他竟然自学过绿导师的操作系统课,这门课非常棒,在这里,也推荐给看到这段文字的读者。 ")]),_:1})]),_:1}),A,r(i,null,{default:a(()=>[r(n,{name:"wendaxiao",github:"wenxiaohahaha"},{default:a(()=>[e(" 和小散师傅聊天时,我能感觉到他是一个可爱的人。我从来没有见过那么多可爱的表情包(而我,很多沙雕的表情包,和小散形成鲜明对比)!除了可爱,我觉得小散是一个浪漫主义开源人,他有自己的崇高的理想和抱负(无关权财)。我希望他能坚持下去,实现自己的愿望!当然,他这个每天在群里问问题,清各种 ddl 的卷王,我是相信他的实力的!"),L,e(" 所以,继续闪闪发光吧,小散!"),C,e(" 再提一句:散师傅打字太快了,聊天我根本跟不上节奏!笑死 😆。 ")]),_:1})]),_:1}),D,V,N,I]))}});export{H as __pageData,X as default}; diff --git a/assets/posts_shun-story.md.uWHLiez7.js b/assets/posts_shun-story.md.uWHLiez7.js new file mode 100644 index 0000000..b471ef3 --- /dev/null +++ b/assets/posts_shun-story.md.uWHLiez7.js @@ -0,0 +1 @@ +import{_ as t,c as o,o as e,l as r}from"./chunks/framework.CEb3mtFd.js";const a="/assets/shun-01.CWHiLdW6.jpg",s="/assets/shun-05.BnKWAdLF.jpg",n="/assets/shun-02.D_d2jXpo.jpg",l="/assets/shun-03.DUtFi7rq.jpg",p="/assets/shun-04.CQ3SJyp9.jpg",q=JSON.parse('{"title":"【开源江湖闲聊录】社区掌舵人:顺师傅的 Paddle 之旅","description":"","frontmatter":{"title":"【开源江湖闲聊录】社区掌舵人:顺师傅的 Paddle 之旅","date":"2023-11-21T00:00:00.000Z","author":{"name":"孙钟恺","github":"sunzhongkai588"},"co_authors":[{"name":"文潇","github":"wenxiaohahaha"},{"name":"柳顺(顺师傅)","github":"megemini"}]},"headers":[],"relativePath":"posts/shun-story.md","filePath":"posts/shun-story.md"}'),i={name:"posts/shun-story.md"},g=r('

【开源江湖闲聊录】 是一项专门为 Paddle 社区的开发者打造的特色访谈栏目📚。在这里,我们邀请到每一位别具一格且富有热情的开发者,通过文字或语音的方式进行深入采访 🎙️,探索并展现他们背后独一无二的故事,将他们的经历、见解和创意整理成精彩内容,呈现给整个社区。

一、前言

是谁,能让最摸 🐟 的开发者禁不住 PR 的诱惑,疯狂求 review?又是谁,让向来严于待人、宽以律己的 Paddle 开发者忍不住夸夸?接下来,有请我们的大佬——顺师傅

shun-01

顺师傅是一名 Paddle 的社区开发者,但在社区里,顺师傅不仅仅是一个称呼,更是一股推动力。他主导的项目 【将 xdoctest 引入飞桨工作流】 是 Paddle 社区迄今为止最大的开源活动 🎊。该项目规模极其庞大,涉及超过一千多个 API 示例的整合和数十万行代码的优化,由超过 20 名社区开发者共同完成。顺师傅的领导力不仅显著提升了 API 示例代码的规范性,还极大地促进了整个开源生态的发展和繁荣 🎉。

而顺师傅本身,作为一位经验丰富的资深开发者,也拥有着深厚的技术背景和广泛的知识储备。我们怀着对他的好奇(膜拜)🤩,通过文字采访的形式来深入了解顺师傅的故事,以下是我们与顺师傅的采访内容 📄。

二、采访内容

  1. 可以介绍一下自己吗?平时有什么兴趣爱好?

    顺师傅: 我的 AI Studio 和 GitHub 的账号是 megemini,平时喜欢看看书爬爬山跑跑步~

  2. 作为一名技术佬,你的一天是如何度过的呢? 可以分享一下你的日常生活么?

    顺师傅: 每天都会做的事情,比如写代码、跑步、看书之外,由于最近需要用到 C++,而上一次用 C++ 都是十多年前的事情了,所以近期看一些 C++ 新特性相关的书和视频教程会比较多 ~

  3. 可以简单向大家展示一下你一天的生活作息嘛?

    顺师傅: 家里情况比较特殊,没有什么可参考性~ 不过现在不会熬夜写代码了,晚上一般七八点钟也会出去跑跑~

  4. “上一次用 C++ 都是十多年前的事情了”这句话太有年代感了,是在学生时代用的吗?

    顺师傅: 嗯,工作之后 Java、Python 用的比较多 ~

  5. 你是如何成为 Paddle 社区的开发者的?

    顺师傅: 毫不避讳的说,当初是因为 AI Studio 有比较多的免费算力才接触到 Paddle 社区并真正的开始使用 PaddlePaddle 框架,慢慢的后面才接触到黑客松、快乐开源之类的活动 ~

  6. Paddle 社区开发者都称呼你为“顺师傅”,这个称呼是怎么来的?是谁第一个开始这么称呼你的(笑)?

    顺师傅: 微信的昵称就是「顺」,好像是涛姐还是 001 开始这么叫的 ... ... 惭愧 ... ...

  7. 外界对开发者的固有印象(社恐,直男),你周围的开发者形象是怎样的?你对 Paddle 哪位社区开发者印象最深?

    顺师傅: 开发者都比较坦诚,由于平时基本都是跟技术打交道,所以不管是话多也好、话少也罢,交流起来都是比较简单、热心的感觉~001 对于开源的那种热爱对我印象最为深刻~

    SigureMo 是 Paddle 社区的资深开发者,由于是第一位社区 commiter 而被大家称为 001。

  8. 为什么 001 会给你带来这样深刻的印象?可以分享一下其中的小故事嘛?

    顺师傅: 记得当时为了修改示例代码写了一个小工具,本来还只是想发出来试一下,结果好像第二天 001 的 PR 就来了~技术能力和执行力都太强了,惭愧 ... ...

  9. 你可以谈谈你对开源社区的理解和认识吗?

    顺师傅: 抛开自由、开放不谈,开源项目的参与门槛其实是比较高的,这里主要是针对正规的、规模较大的开源项目、代码类的贡献来说~因此,飞桨能够组织快乐开源、黑客松之类的活动,并且是由中文社区主导,个人感觉是非常有意义的一件事情~

  10. “将 xdoctest 引入飞桨工作流”这个项目是如何诞生的?你可以谈谈这个项目的初衷和目标吗?

    顺师傅: 这个项目是第六届中国软件开源创新大赛 Paddle 挑战赛的一个赛题,主要目标是使用 xdoctest 替换掉 CI 流水线中的不怎么好用的示例代码检查工具~

  11. 你是如何组织和号召其他社区开发者参与这个项目的?在这个过程中遇到了哪些挑战,又是如何克服的?

    顺师傅: 嗯 ... ... 这里应该主要感谢涛姐帮忙摇人吧~~~我所做的只是把事情讲清楚,仅此而已 ~

  12. 这个项目涉及到一千多个 API 示例、数十万行代码的修改,你是如何管理和协调这么大规模的项目的?

    顺师傅: 飞桨开源社区的参与者能力都很强,所以,只要把事情讲清楚,做什么、怎么做,大家自然会把事情做好~期间,001、涛姐、孙师傅、军哥等等很多人,都帮助一起分析如何把这个事情讲清楚,大家目标一致,水到渠成吧~

  13. 这个项目的完成对 Paddle 社区的开源生态有何影响?你认为它在推动开源生态繁荣方面的作用体现在哪里?

    顺师傅: 提升代码质量、对齐主流 Python 解决方案~能够引导更多 “新人” 参与到开源项目中来~

  14. 在你看来,这个项目的最大贡献是什么?为什么?

    顺师傅: 丢掉历史包袱,以后大家都是在统一的 Python 标准下参与贡献,未来的技术选择灵活性都大很多~

  15. 回顾这个项目,有哪些时刻让你印象深刻?为什么?

    顺师傅: 印象最深刻的是当时 RFC 讨论的时候~参与之前本来是抱着试一试、捡漏的心态来的,结果 RFC 一番讨论下来,有种骑虎难下的感觉 ... ... 另外,在发起示例代码修改这个快乐开源活动之后,看到能有这么多开发者参与进来,并且最终把这个项目做了下来,飞桨开源社区号召力之大,属实给了我一次小小的震撼~

  16. 对于未来,你对 Paddle 社区有哪些期待和建议?

    顺师傅: 希望能够引导更多中文社区的开发者参与进来,能够有更多在校的学生参与进来~另外,提一点小小的建议,虽然已经参与飞桨开源社区快一年了,但是,仍然对 Paddle 本身的框架技术路线、技术规划以及一些细节考量非常模糊,希望能有这方面较为系统的文档、视频教程吧~

  17. 作为一名经验丰富的老开发,对于想要参与开源社区,特别是 Paddle 社区的年轻人,你有什么建议或者寄语?

    顺师傅: 只有让更多年轻的开发者不断接过手中的桨,才能将开源社区一直行驶下去,直至星辰大海~

三、“五星评论家麦克阿瑟”专区

我们也邀请了一些和顺师傅很熟悉的、有过合作经历的朋友们,贡献一下和顺师傅相关的故事,或者他们对顺师傅的评价~以下均为真心话,请放心看! shun-05

001(SigureMo

就 Xdoctest 这个任务而言,最开始其实我自己都是没有多少信心的,毕竟是整个框架级别的,光是任务量想想就头疼,而且历史遗留问题特别多,怎么想都做不来吧?当初想着在 RFC 阶段就尽可能抛出我已知的各种坑,让开发者知难而退,这样我也能省心些,要是啥也不懂的我也带不动。

但是顺师傅的出现打破了我的摸鱼计划,顺师傅上千行的 RFC 调研地比我了解的还清楚,对于我提出的各种「劝退」问题也逐一回复了合理的解决方案,这时候我突然觉得,也许真的能成?

RFC 合入后顺师傅有条不紊地推进着整个任务,每一次遇到疑难问题时,顺师傅总能选出合适的解决方案。比如 Paddle Tensor 打印时候 Place 不对齐的问题、输出精度问题、运行环境隔离问题等等,这些都是 Xdoctest 本身存在的诸多问题,经过顺师傅的调整和优化,Xdoctest 已经基本能够完美适配我们 Paddle 了。

此外大家可能比较熟悉顺师傅发放的两个开源任务,也是整个任务耗时最久的部分,顺师傅在开源任务中从开发者转变为了 reviewer,帮助我们 review 了很大一部分的 PR,并且 review 地十分细致且专业。

然后就如大家所见到的,真的成了。

顺师傅太强了~期待下次合作~

涛姐(luotao1

本任务难点在于工程量大、历史包袱重,感谢顺师傅带着所有队员(24 位)用强大的耐心、细心完成了这一旷日持久的推进,你们的工匠精神值得全体同学学习!众人拾柴火焰高,感谢项目的所有参与的同学!

编者注✍️: 涛姐的话太官方了,所以我挑了句重点,希望涛姐能原谅我 🤪

敏师傅(enkilee

有幸通过软件开源创新大赛,结识了顺师傅,他的大赛课题是将 xdoctest 引入到飞桨框架工作流中,为了提升效率,减少错误,还不辞辛苦做了一个简单的转换工具 convert_doctest,极大的节省了修改的工作量,减少了出错成本。

此任务工作量巨大,而且很多 API 历史遗留问题繁杂,顺师傅在工作中展现出的极高的职业素养和敬业精神令我们为之侧目。他对待每一个细节都非常用心,力求做到尽善尽美。在面对复杂的问题时,他总是能够迅速找到解决办法,充分体现了他的专业能力和经验。

此外,顺师傅还具有很强的团队协作能力,他乐于与大家分享经验和技巧,共同提高整个团队的工作效率。在工作中,他总是能够主动承担责任,为团队的发展贡献自己的力量。

川川(gouzil

顺师傅好强,带带弟弟 shun-02 顺师傅的分析能力和组织能力都超强 shun-03

孙师傅(sunzhongkai588

在参与顺师傅的项目过程中,我甚至感觉顺师傅像我的 mentor,因为从他身上切切实实学到了很多东西,比如问题的拆解、项目的组织、技术的交流等...

尤其是看到顺师傅逻辑非常清晰的 RFC 文档后,仅从文档写作方面都让我受益匪浅(因为文档的编写需要非常多的逻辑推理和思考,而像顺师傅一样把事情讲清楚的研发,真的不多,大家感兴趣也可以去看看)功利地说,顺师傅对我的职业发展有非常大的提升,希望顺师傅能够继续加油,影响更多人!

四、结尾

在探索顺师傅的旅程中,我们不仅发现了一个技术上的资深开发者,也见证了一个开源社区领路人的成长和影响力。他的故事和成就展示了开源社区不仅是技术的聚集地,更是所有开发者开源热情的熔炉 🔥。

期待顺师傅在未来的旅程中继续发光发热,为 Paddle 或是其他开源社区带来更多的创新和启示 💡。

最后,应顺师傅要求,就不附照片了,以一棵柳树作为结尾 🌲

shun-04

彩蛋 🥚

往期 blog 有顺师傅真容哦~大家可以去探索一下!

',28),h=[g];function d(u,c,b,m,P,_){return e(),o("div",null,h)}const f=t(i,[["render",d]]);export{q as __pageData,f as default}; diff --git a/assets/posts_shun-story.md.uWHLiez7.lean.js b/assets/posts_shun-story.md.uWHLiez7.lean.js new file mode 100644 index 0000000..f8316b9 --- /dev/null +++ b/assets/posts_shun-story.md.uWHLiez7.lean.js @@ -0,0 +1 @@ +import{_ as t,c as o,o as e,l as r}from"./chunks/framework.CEb3mtFd.js";const a="/assets/shun-01.CWHiLdW6.jpg",s="/assets/shun-05.BnKWAdLF.jpg",n="/assets/shun-02.D_d2jXpo.jpg",l="/assets/shun-03.DUtFi7rq.jpg",p="/assets/shun-04.CQ3SJyp9.jpg",q=JSON.parse('{"title":"【开源江湖闲聊录】社区掌舵人:顺师傅的 Paddle 之旅","description":"","frontmatter":{"title":"【开源江湖闲聊录】社区掌舵人:顺师傅的 Paddle 之旅","date":"2023-11-21T00:00:00.000Z","author":{"name":"孙钟恺","github":"sunzhongkai588"},"co_authors":[{"name":"文潇","github":"wenxiaohahaha"},{"name":"柳顺(顺师傅)","github":"megemini"}]},"headers":[],"relativePath":"posts/shun-story.md","filePath":"posts/shun-story.md"}'),i={name:"posts/shun-story.md"},g=r("",28),h=[g];function d(u,c,b,m,P,_){return e(),o("div",null,h)}const f=t(i,[["render",d]]);export{q as __pageData,f as default}; diff --git a/assets/posts_starter-camp.md.Db9PfhHS.js b/assets/posts_starter-camp.md.Db9PfhHS.js new file mode 100644 index 0000000..b7b225a --- /dev/null +++ b/assets/posts_starter-camp.md.Db9PfhHS.js @@ -0,0 +1 @@ +import{_ as e,c as r,o as t,l as a}from"./chunks/framework.CEb3mtFd.js";const o="/assets/starter-01.BQhXy2TN.png",i="/assets/starter-02.Bf2WfiHX.png",l="/assets/starter-03.BOZeuzfN.png",n="/assets/starter-04.zLBRTWXy.png",s="/assets/starter-05.B8V6TaI0.png",h="/assets/starter-06.CtTR9ub7.png",g="/assets/starter-07.CmzgjHu_.png",c="/assets/starter-08.BWHELzJ3.png",u="/assets/starter-11.jq6tV3JA.png",z=JSON.parse('{"title":"新征程 ⛵️ |飞桨「启航计划」集训营圆满落幕","description":"","frontmatter":{"title":"新征程 ⛵️ |飞桨「启航计划」集训营圆满落幕","date":"2024-2-18","author":{"name":"孙钟恺","github":"sunzhongkai588"}},"headers":[],"relativePath":"posts/starter-camp.md","filePath":"posts/starter-camp.md"}'),f={name:"posts/starter-camp.md"},b=a('

在 2023 年的 11 月 14 日,飞桨开源社区开启了一个新项目(新坑)—— 启航计划集训营。经过为期两个月紧张而充实的集训后,启航计划集训营于 1 月 30 日 正式圆满完成所有集训计划。在集训期间,大家出色地完成了三项热身打卡任务,并且有 19 位营员合入了超过 110 个 PR。衷心感谢各位营员的积极参与和卓越贡献!在这里,也向开源社区的各位 “汇报” 一下活动情况~

01 - 启航计划是什么?

「启航计划」 是飞桨社区发起的远程代码集训项目,也是「护航计划」的前置活动。我们以开展为期 2 个月集训营的形式,鼓励开发者积极参与开发 2 个方向的快乐开源任务,以此提升自己的代码实践能力,与社区共同成长 💪。

  • 基础方向:Paddle 核心框架 + Paddle CV 套件的快乐开源任务,将有机会参与社区里最轻松愉快的开源开发活动。
  • 大模型方向:参与 PaddleMIX 跨模态大模型套件的快乐开源任务,将有机会接触社区里最前沿的大模型应用开发与工具建设。

活动详情见 Issue: #58497

starter-01

与护航计划的区别?

  • 不限定开发者背景,企业和学生开发者均可参与。
  • 不进行面试,直接进行简历筛选
  • 集训内容为完成 【快乐开源任务】,合入 1 个 PR 即满足结营条件,相对轻松。
  • 提供高质量集训课程,并以 PR review 交流的形式进行沟通,而非导师一对一带教的形式。
  • 时间周期更短(2 个月),门槛相对更低。

参与者需要做什么?

1. 自选任务,并投递简历报名,通过筛选后即可入营。集训营持续 2 个月,上限 30 人

  • 共有 36 名候选人参与报名并投递简历。内部筛选后,最终通过 29 位学员。
  • 入选学员中,22 名学生(电子科大、西交、杭电、浙大、清华……)、7 名企业开发者。
  • 入选学员中,13 名 PFCC 成员,16 名新人。

入选营员:@NKNaN@shiofjsaio@YangWulve@Hhankyangg@sanbuphy@Atlantisming@GreatV@Tsaiyue@Kaedeharai@wyyang23@jiongjiongli@rhmaaa@cocoshe@zbt78@YibinLiu666@Turingg@ooooo-create@ccsuzzh@zade23@challengewly@zoey333@unicornshell@storm-ice@YinKeYu@Olive-2019@fsczz@jiangziyan-693@isLinXu@jingsongliujing

2. 按兴趣参与集训课程(一周一次)并按时提交双周周报

  • 以实际开发为导向,每周开展一次课程,总计安排 6 次课程。
  • 营员每双周提交一次周报,追踪集训进展和计划,总计提交 4 期双周报。
课程
课程以腾讯会议形式开展
周报
周报截图

3. 完成 3 个打卡任务,并至少合入 1 个快乐开源 PR

  • 打卡任务一:修改飞桨文档。25 人完成
  • 打卡任务二:Paddle 本地编译。13 人完成
  • 打卡任务三:跑通 SD 训练推理。15 人完成
打卡
热身任务打卡情况(部分)

4. 结营期间,可自愿申请一、二、三等奖,并参加答辩

结营考核详情见 Issue:#123

答辩
答辩现场

飞桨官方提供什么?

1. 开发导向的每周课程

  • 由飞桨研发和 PM 根据营员的诉求和实际开发情况,来提供每周的课程。
课程
课程安排

2. 周报管理

  • 助教负责对每双周的周报进行管理,确保提交周报的数量和质量。
周报截图
其中一期周报提及截图

3. 技术答疑

  • 在微信群以及课程中,飞桨研发会针对营员的疑惑进行一一解答。
  • 同时,会有热心、能力强的营员解答别人的问题。

4. 活动运营支持

  • PM 和助教会对活动的各个环节提供支持,保障整体活动的顺利进行。
活动安排
整体活动节奏

5. 成绩评估

  • PM 和助教会根据结营要求,在结营期间对每位学员进行评估,判断是否满足结营条件。
  • 针对一、二、三等奖的答辩,会邀请相应方向的研发导师进行评估。同时,这也是进入护航计划的绝佳机会,因为研发导师会有充足的时间来了解你~

02 - 活动成果

数字上的成果

  1. 共有 19 位营员合入了超过 110 个快乐开源 PR。
  2. 社区新加入 11 名 contributor。
  3. 15 名营员成功通过考核、顺利结营,2 名优秀营员入选护航计划。
  4. @cocoshe 在开发过程中沉淀 1 篇《 PHI 算子库 kernel 注册全流程源码阅读》

数字背后的情况

  1. 共有 19 位营员合入了超过 110 个快乐开源 PR。

完成 80+ 文档、15+ 新 IR 适配、15+ 静态图推全、 5+ cmake 治理、 5+ 复数算子等等题目,文档相关任务约占总体完成任务的一半左右.

  1. 社区新加入 11 名 contributor。

其中 7 名 contributor 只合入了一个文档相关 PR,活动后续缺少延续性。

  1. 15 名营员成功通过考核、顺利结营,2 名优秀营员入选护航计划。

考核通过的营员中,有 10 名是原 PFCC 成员,纯新人通过率不高(31%),猜测是启航计划的活动缺乏引导。

03 - 新的尝试——Docs 偶像女团(精品小团)

是什么?

自愿参与文档开发、维护的社区化小团体,氛围活跃,开发意愿很积极。

由谁组成?

  1. 3 名大二女生(2 名启航计划学员 @Turingg @Kaedeharai,1 名社区开发者@entired),主要负责开发和维护。
  2. 1 名热心社区开发者(O 师傅,大三),负责日常手把手指导 3 名女生。
  3. 2 名飞桨内部同学,负责维持团体运转、答疑解惑。

为什么组成这个团体?

集训期间,2 位女生开发意愿比较强烈,但对具体做什么事情感到迷茫,因此孙师傅就把她们拉入(骗进)了 docs 小组。

运转机制?

  • 每周一次例会,由 3 名女生轮流主持,主要通过每周开发进度、布置新任务,所有人必须参会。
  • 每周一次会议纪要,由会议主持负责写会议内容和 Todo。
  • 如流群日常沟通交流

starter-11

详细资料见:community/docs_group

',57),d=[b];function p(_,m,k,P,q,y){return t(),r("div",null,d)}const T=e(f,[["render",p]]);export{z as __pageData,T as default}; diff --git a/assets/posts_starter-camp.md.Db9PfhHS.lean.js b/assets/posts_starter-camp.md.Db9PfhHS.lean.js new file mode 100644 index 0000000..7fde498 --- /dev/null +++ b/assets/posts_starter-camp.md.Db9PfhHS.lean.js @@ -0,0 +1 @@ +import{_ as e,c as r,o as t,l as a}from"./chunks/framework.CEb3mtFd.js";const o="/assets/starter-01.BQhXy2TN.png",i="/assets/starter-02.Bf2WfiHX.png",l="/assets/starter-03.BOZeuzfN.png",n="/assets/starter-04.zLBRTWXy.png",s="/assets/starter-05.B8V6TaI0.png",h="/assets/starter-06.CtTR9ub7.png",g="/assets/starter-07.CmzgjHu_.png",c="/assets/starter-08.BWHELzJ3.png",u="/assets/starter-11.jq6tV3JA.png",z=JSON.parse('{"title":"新征程 ⛵️ |飞桨「启航计划」集训营圆满落幕","description":"","frontmatter":{"title":"新征程 ⛵️ |飞桨「启航计划」集训营圆满落幕","date":"2024-2-18","author":{"name":"孙钟恺","github":"sunzhongkai588"}},"headers":[],"relativePath":"posts/starter-camp.md","filePath":"posts/starter-camp.md"}'),f={name:"posts/starter-camp.md"},b=a("",57),d=[b];function p(_,m,k,P,q,y){return t(),r("div",null,d)}const T=e(f,[["render",p]]);export{z as __pageData,T as default}; diff --git a/assets/posts_suzhou-kaifangyuanzi.md.BWTb1jy6.js b/assets/posts_suzhou-kaifangyuanzi.md.BWTb1jy6.js new file mode 100644 index 0000000..6d4982f --- /dev/null +++ b/assets/posts_suzhou-kaifangyuanzi.md.BWTb1jy6.js @@ -0,0 +1 @@ +import{_ as t,c as e,o as r,l as a}from"./chunks/framework.CEb3mtFd.js";const o="/assets/groupchat.BetqHqwY.png",n="/assets/sun_host.BI4VmHmn.jpg",i="/assets/panelist.BaChAeGK.jpg",p="/assets/duyongkun.CQ_p59gp.jpg",l="/assets/zhaomiaomiao.dXx6awBl.jpg",d="/assets/tianshuishifan.DkDfK8bz.jpg",s="/assets/photo_all_together.FY83jsKs.jpg",h="/assets/award_ceremony.B4pBO3vf.jpg",c="/assets/meetup-1.C_uxuPD9.jpg",g="/assets/meetup-2.BYp7ViW8.jpg",C=JSON.parse('{"title":"PaddleOCR 算法模型挑战赛圆满落幕 & 杭州开发者线下 Meetup","description":"","frontmatter":{"title":"PaddleOCR 算法模型挑战赛圆满落幕 & 杭州开发者线下 Meetup","date":"2024-04-17T00:00:00.000Z","author":{"name":"尤师傅","github":"Harryoung"}},"headers":[],"relativePath":"posts/suzhou-kaifangyuanzi.md","filePath":"posts/suzhou-kaifangyuanzi.md"}'),m={name:"posts/suzhou-kaifangyuanzi.md"},u=a('

2024 年 4 月 12 日,开放原子开源大赛 PaddleOCR 算法模型挑战赛 决赛路演在苏州工业园区人工智能产业园 G1 栋 3 楼会议中心顺利举行,并取得圆满成功!🎉价值 15 万元的大奖花落谁家?选手们的技术方案有多硬核?快来看看吧~

BTW,在 4 月 14 日 我们飞桨开源社区的工作人员也顺路来到杭州,在西子湖畔的一家餐厅里举办了杭州开发者线下 Meetup,和众多熟悉又陌生的“网友”成功面基 😊。

大赛背景

开放原子开源基金会 是致力于推动全球开源事业发展的非营利机构。其目标是搭建面向全球开源领域的前沿技术竞争、优秀人才选拔创新成果展示、商业转化引导和对接交流合作平台,广泛传播开源文化、普及开源知识、推广开源项目、提升开源技能,为推进全球开源生态繁荣可持续发展提供动力。

百度飞桨开源社区与开放原子开源基金会的目标和愿景有高度的重合,因此自然而然地达成了合作办赛的意向。继 2023 年百度飞桨联合开放原子共建了「飞桨 PaddlePaddle 开源贡献挑战赛」后(大赛回顾请看 这里),这次飞桨团队再度受邀,发布了「PaddleOCR 算法模型挑战赛」。PaddleOCR 算法模型挑战赛包括两道赛题,分别是 OCR 端到端识别任务与通用表格识别任务,要求选手在 PaddleOCR 的基线模型之上,尽可能提升模型精度,同时保证模型的推理速度与基线模型相当(降速不超过 10%)。

赛题有一定难度,但同时奖金也颇为丰厚🤩:

  • 赛题一:OCR 端到端识别任务
    • 一等奖:1 支队伍,每支队伍奖金 15 万元
    • 二等奖:1 支队伍,每支队伍奖金 4 万元
    • 三等奖:1 支队伍,每支队伍奖金 1 万元
    • 开源贡献奖:7 支队伍,荣誉证书
  • 赛题二:通用表格识别任务
    • 一等奖:1 支队伍,每支队伍奖金 7 万元
    • 二等奖:1 支队伍,每支队伍奖金 2 万元
    • 三等奖:1 支队伍,每支队伍奖金 1 万元
    • 开源贡献奖:7 支队伍,荣誉证书

赛程回顾

大赛从 1 月 15 日上线,启动报名。经过两个半月的紧张打榜后,于 3 月 31 日正式封榜。经过代码审查与线上初审后,最终在 4 月 12 日在美丽的苏州工业园区举行了决赛路演。

在打榜过程中,选手们在官方交流群中积极讨论,互帮互助,还不忘给官方提需求😅。

groupchat

热心选手树先生,无私贡献了针对赛题二快速测试模型精度的脚本,得到了群友们的一致好评!开源精神拉满了!😉

赛题一 B 榜阶段,选手反馈能不能把报错信息展示为实际的报错信息,而不是简单的"没有生成 result.txt",这样才好定位并解决问题。飞桨运营同学快速评估并作出反应,认为这是一个很合理的需求,必须安排!奈何研发人手实在是紧张,直到午夜 1 点多,才完成改动并上线,保证了选手们顺利通关 B 榜。飞桨的研发小姐姐很拼有木有!✊

最终,大赛共报名 211 支团队,总人数达到空前的 671 人。 不过由于赛题本身还是有一定难度,最后 10 支队伍提交了作品,8 支队伍通过了代码审查,5 支队伍入围了决赛答辩。

飞桨官方的模型已经很强了,要在此基础上继续提分,还得保证推理速度不下降,真的很难。👿 ———— 某个不愿透露姓名的选手

路演现场

孙师傅被我抓去现场当主持人,那叫一个专业!😄

host

我则有幸抱住军哥(@jzhang533)和涛姐的大腿,当了一回评审。😎

panelist

选手们的答辩也十分精彩!复旦大学的杜永坤和北京交通大学的赵苗苗,分别针对赛题一和赛题二的模型架构进行了多方面的优化,可以说相当硬核。两位也分别摘得两个赛题的一等奖桂冠,实至名归!

duyongkunc

zhaomiaomiao

令人印象深刻的是,赛题二的「识别先锋」队,是天水师范大学的吴衡老师带领三个本科生来参赛,还都是 AI Studio 的忠实用户🤗。尽管他们的显卡资源并不充裕(据说只有几张消费级显卡),但依然阻止不了他们的参赛热情。在他们的脸上,有一丝羞怯,也洋溢着激动和开心。我从他们身上看到了开源的魅力。

tianshuishifan

路演结束,大合照来一张。

photo_all_together

获奖情况

经过紧张的路演和现场打分,最终决出了我们两个赛题的获奖队伍,如下表所示。

赛题奖项团队名称(括号内为 AI Studio 团队名)仓库地址
赛题一一等奖openocrhttps://atomgit.com/paddleocr_competition/openocr
赛题一二等奖zjj421https://atomgit.com/paddleocr_competition/zjj421
赛题二一等奖ocr 识别队(珍珠小田田的团队)https://atomgit.com/paddleocr_competition/ocr_recognition
赛题二二等奖识别先锋(dudekenny 的团队)https://atomgit.com/paddleocr_competition/RecognitionPioneer
赛题二三等奖豆没有皮吖https://atomgit.com/paddleocr_competition/doumeiyoupiya
赛题二开源贡献奖树先生https://atomgit.com/paddleocr_competition/Mr.Tree
赛题二开源贡献奖几支孤鸭嘎嘎嘎(两只孤鸭嘎嘎嘎的团队)https://atomgit.com/paddleocr_competition/duckgaga
赛题二开源贡献奖长城信息(飞行的的团队)https://atomgit.com/paddleocr_competition/GreatWallInfo_task2

恭喜所有的获奖队伍!🎉🎉🎉你们都是开源创新之路上的佼佼者!🚀🚀🚀

award_ceremony

PaddleOCR 开源共建研讨会

路演结束之后,距离午饭还有一段时间。我们便借着这个机会,邀请了参赛选手们举行了一场主题为「PaddleOCR 开源共建」的研讨会。

军哥表达了希望能够以 PaddleOCR 作为试点项目,启动飞桨开源项目社区化治理的想法。纵观国际上优秀的开源项目,都是由社区驱动的,而国内的很多开源项目,却往往只由某一家公司主导,这样其实不利于开源项目的可持续发展。大家纷纷表示了认同,但也提出了国内拿来主义盛行、开发者生存压力大、做开源只能用爱发电等现实的问题。

虽然在国内开源项目的纯社区化治理道阻且艰,但飞桨团队还是要积极推动尝试。如果做成了,将是非常有意义的一件事。👊

大家讨论的太入神,都忘记拍照留念了 😭

杭州开发者线下 Meetu 剪影

在 4 月 14 日,我们也邀请了 14 位(其中🐦了一位)飞桨开源社区的开发者,在西湖虎跑胖的餐厅里面基交友~军哥给每人都准备了一份神秘礼品哦 🎁。

meetup-1

以下为痛失真名现场

meetup-2

',42),_=[u];function f(b,k,P,z,q,y){return r(),e("div",null,_)}const R=t(m,[["render",f]]);export{C as __pageData,R as default}; diff --git a/assets/posts_suzhou-kaifangyuanzi.md.BWTb1jy6.lean.js b/assets/posts_suzhou-kaifangyuanzi.md.BWTb1jy6.lean.js new file mode 100644 index 0000000..3a083ff --- /dev/null +++ b/assets/posts_suzhou-kaifangyuanzi.md.BWTb1jy6.lean.js @@ -0,0 +1 @@ +import{_ as t,c as e,o as r,l as a}from"./chunks/framework.CEb3mtFd.js";const o="/assets/groupchat.BetqHqwY.png",n="/assets/sun_host.BI4VmHmn.jpg",i="/assets/panelist.BaChAeGK.jpg",p="/assets/duyongkun.CQ_p59gp.jpg",l="/assets/zhaomiaomiao.dXx6awBl.jpg",d="/assets/tianshuishifan.DkDfK8bz.jpg",s="/assets/photo_all_together.FY83jsKs.jpg",h="/assets/award_ceremony.B4pBO3vf.jpg",c="/assets/meetup-1.C_uxuPD9.jpg",g="/assets/meetup-2.BYp7ViW8.jpg",C=JSON.parse('{"title":"PaddleOCR 算法模型挑战赛圆满落幕 & 杭州开发者线下 Meetup","description":"","frontmatter":{"title":"PaddleOCR 算法模型挑战赛圆满落幕 & 杭州开发者线下 Meetup","date":"2024-04-17T00:00:00.000Z","author":{"name":"尤师傅","github":"Harryoung"}},"headers":[],"relativePath":"posts/suzhou-kaifangyuanzi.md","filePath":"posts/suzhou-kaifangyuanzi.md"}'),m={name:"posts/suzhou-kaifangyuanzi.md"},u=a("",42),_=[u];function f(b,k,P,z,q,y){return r(),e("div",null,_)}const R=t(m,[["render",f]]);export{C as __pageData,R as default}; diff --git a/assets/posts_tao-story.md.DPMbREGv.js b/assets/posts_tao-story.md.DPMbREGv.js new file mode 100644 index 0000000..8d41da8 --- /dev/null +++ b/assets/posts_tao-story.md.DPMbREGv.js @@ -0,0 +1 @@ +import{M as r,_ as s}from"./chunks/MessageBox.BjkmF0_f.js";import{c as n,i as o,v as a,l as i,o as p,x as e,a as t}from"./chunks/framework.CEb3mtFd.js";const l="/assets/tao-01.BX6ijUAN.jpeg",g="/assets/tao-02.BUnT8yba.jpeg",c="/assets/tao-03.CuBFfcLy.jpeg",f="/assets/tao-04.V71B6Cdn.jpeg",d="/assets/tao-05.P2XMQFEu.jpeg",u="/assets/tao-06.CAhJU0ix.jpeg",h="/assets/tao-07.TWwMfHJ4.jpeg",_="/assets/tao-08.BKQPDZFR.jpeg",m="/assets/tao-09.DHjwEJQm.jpeg",b="/assets/tao-10.D1eqPGHg.jpeg",P="/assets/tao-11.Bt1BpI2J.jpeg",y="/assets/tao-12.CqVYWYYD.jpeg",k="/assets/tao-13.Bm_8HEqz.jpeg",q="/assets/tao-14.LNcnxsAv.jpeg",j=i('

嘿,你知道飞桨社区里的 DDL 战士是谁么?嘿,你知道大家心中的 Paddle 社区妈妈是谁么?那你又知道谁是(仓库管理员)飞桨仓库的实际控制人?谁是飞桨仓库的守护者?谁是飞桨从闭源到开源的见证者?是的,本期要采访的就是我们 Paddle 的资深研发女神——涛姐!

一、采访内容

  1. 涛姐,给大家介绍一下自己吧!

    涛姐: 大家好,我是骆涛😊(@luotao1)!现在是百度飞桨的资深研发工程师~同时,也是长期的开源贡献者!我博士毕业于中国科学技术大学高性能计算方向,师从陈国良院士,在深度学习领域有 20 多项专利。我参与训练/推理/高性能/工程效率等多个方向,目前致力于活跃飞桨框架开源社区。💗💗💗

  2. 涛姐是什么时候入职 Paddle 的?是以哪种方式呢?你觉得当时获得这份工作最大的竞争力是什么?

    涛姐: 😲大概八年前,我入职了百度。当时我是校招进的 Paddle 团队,但我投的不是校招岗位,而是社招岗位。因为之前我给阿里投了校招,阿里也给我发了录取的邮件。但后来他们告诉我说是外包员工把邮件发错了,我也很无语。等我后面知道这个事情的时候,校招已经快结束了,那剩下的就只有社招这一个选择了。

    当时 Paddle 还在百度深度学习研究院(IDL)下,我觉得肯定是进不了的。但因为没有找到合适的工作,也管不了这么多就投了,结果第二天就收到 offer。

    我觉得最大的竞争力可能是在英特尔做过 Caffe 上的一些优化,所以能力还是比较匹配的。当时,我是带着我的 PPT 去面试(在英特尔有一个比较好的习惯,就是会整理之前所做的工作,因为外企都非常注重工作内容的呈现,所以当时这些 PPT 都是英特尔期间整理的已有素材)。但对面试官来说,拿着 PPT 去讲这些内容来面试,还是比较新颖的。

    还有一个 tip 是:我的简历上没有提及性别,也没有附上照片,所以面试官可能一开始以为我是男生,否则我觉得可能一面就进不了。然后面试的时候,运气比较好,代码题目都是之前复习过的,整体的表现也比较好。此外,还有一点,是我听说面试官在前面的面试里要求比较高,面了好多人都没有满意的。面了 30 多个后,再不招一个,那 Head Count 可能就没了,而我当时确实也投的比较晚。所以在各种机缘巧合下就录取了。

    总的来说,最大的竞争力我觉得第一是博士的身份;第二是已经在英特尔实习,有一些经验;第三是自己的工作有一个比较好的展现,呈现的形式还是很有吸引力的。

  3. 可以给我们谈谈 Paddle 的发展史么?听说 Paddle 最初是是闭源的,为什么后来选择开源?

    涛姐: 最初,Paddle 确实是闭源的。但是由于 IDL 研究院非常前沿,当时也请了吴恩达过来,而且还有很多研究员都是在美国。本身国外开源的氛围又很浓厚,就有了开源的想法💡。当时主流的开源深度学习框架有 Caffe、TensorFlow,至于 PyTorch 都还没有发展起来。如果 Paddle 不开源,实际上是没办法和国外主流的深度学习框架竞争。

    此外,当时公司内部还有很多同类产品,比如 Lego(乐高)、Anakin 等等。这些产品当时都服务于公司内部的业务线,而 Paddle 在当时是一个比较新的东西,实际在公司内业务线上的使用非常有限。后来还制定了 1 到 2 年的计划,就是要把公司内所有产品线都用 Paddle 跑起来。如果 Paddle 不开源,其实在公司内是死路一条。正是因为 Paddle 选择了开源这一路线,之后吞并了 Lego 和 Anakin,逐渐壮大,我认为这是开源最大的一个魅力。同时开源也是一个战略性的决策,如果 Paddle 不开源,在公司内都无法生存,更别提在国际上立足。

    编者注✍️: 军哥曾经是 Lego 的初创研发成员之一哦~

    18年paddle团建图
    18 年 Paddle 团建
    18年10月发布1.0版本
    18 年 10 月发布 1.0 版本
    18年paddle团建
    18 年 Paddle 团建
  4. 给我们讲讲你的求学之路吧!

    涛姐: 我本科、硕士和博士都是在中科大,博二时去了中科院北京软件所学习,可以说是一个联合培养计划吧!之后又去了英特尔实习,这些大致就是我的学习经历~一路走来,真的太不容易了,特别是读博期间非常受挫,心理压力巨大!读完博士的时候感觉整个人脱胎换骨了。

    涛姐大一中科大西洋乐团新年音乐会
    涛姐大一中科大西洋乐团新年音乐会
    右图:涛姐大一冬天
    涛姐大一冬天
  5. 你刚刚谈到读博于你而言简直脱胎换骨,当时为什么选择读博?读博对于你来说获得了什么?

    涛姐: 当时选择读博,是因为本科毕业的时候没有考虑过就业。而且虽然当时成绩比较好,但觉得自己除了成绩好,其他什么都不会,就想还是得深造(是真实的情况,不是凡尔赛)。此外,我们学校当时并没有提供保研这个选项,只能考研或者保送直博升学,所以我最后选择了直博。

    当时我是可以自己选择直博校外还是本校,可能班主任也比较喜欢我,他就强力推荐我留在学校读博。其实我当时也想去国防科大呀、复旦呀,但是都被班主任无情拒绝了。他给我分析了一些利弊,后面给我找的导师也非常好,是一位院士。这也为我后面能去软件所或者英特尔这些大的平台提供了一个非常有力的保障。所以,我在这里也非常感谢我的班主任,他真的是一个非常好的老师!

    读博给我带来了很多收获!对于我的职业生涯来说,如果我没有读博士,我肯定进不了百度或者英特尔,这一点毫无疑问。对学业方面来说,读博极大锻炼了我自己,也包括提高了心理承受能力、抗压能力。还有一点就是读博扩大了我的学术圈子,如果我没有继续深造,我将无法接触到如此多优秀的同学和高 level 的大佬。此外,博士身份在之后的许多场景中都还是非常有用的!

    编者注✍️:Family who konws🐮!涛姐说自己大学不是特别用功,没有搞绩点,但是成绩就是 top 10!是谁羡慕了我不说~ ​

    涛姐15年博士毕业
  6. 读博有遇到什么困难吗?博二时去到了北京软件所进一步学习培养,当时为什么去争取这个机会?

    涛姐: 刚开始读博的时候非常迷茫。因为本科的时候就没有进实验室,当时年纪小还没有这个意识,也没有现在这样环境氛围。而且本科期间成绩也还行,所以那时除了读书就是看韩剧、台剧、综艺、小说。像之前说的那样,本科毕业的时候就处于“除了成绩好,其他什么都不会”的状态。但会考试,不代表在计算机方面的能力强,因为考一个好成绩很容易,我这样说有点凡尔赛,但确实就是这样的。

    编者注✍️:涛姐特别喜欢在学校图书馆看小说,像是沧月、新武侠、古典武侠、卫斯理系列·····

    但当读博进了实验室之后,就会发现差距很大。因为读博需要做研究发论文,这和本科期间单纯的学习考试是存在很大的 gap。而且导师又坚信学生应该自我驱动型的(因为老板是院士,他觉得招进这么好一个学生,应该能够自己解决自己的问题),我完全不知道要做什么,代码也调不出来,就一下子陷入一个很迷茫的状态,和之前上课的阶段完全不一样。所以那个阶段其实是蛮难熬的,包括学校里很多老师也不会带你做实验,不会像咱们护航计划的研发同学那样手把手带。代码都要由自己调试,而遇到问题时也不知道该向谁求助,这种情况让人会感到非常痛苦。

    所以当时就争取了去北京的联合培养计划。去了北京之后,可能因为实验室风格和之前不一样,发现确实还是要有年轻老师或项目带着会好一点~

  7. 去英特尔实习是在什么时候呢?你在那段时间收获了什么?你觉得它与百度有什么不一样?

    涛姐: 嗯~我在英特尔实习是在博士的最后两年(博士第一年在学校念书,接下来的两年中科院软件所联合培养,第四年和第五年在英特尔实习),这两年的经历对我的个人成长产生了巨大的影响。

    收获的是真实的研究院实习经历(当时比较好的研究院就是 MSRA 和英特尔中国研究院这两个)。能明显感觉到企业和学校的风格是完全不一样的,接触的东西也很前沿,组里氛围也很好。而且研究院的指导和学校相比,整体的科研 sense 会拔高很多。比如当时在英特尔期间,我接触了第一代深度学习框架 Caffe,并在其中进行了一些工作。尽管我没有做很多东西,但当时写的论文(博士学位论文)因为抓住到 Caffe 这个热点,而且英特尔做的也比较好,因此论文引用量到现在已经超过 7000 次,相比起来其他很多人的论文都没人看。

    而且这段研究院经历,也帮助我获得了百度深度学习研究院(IDL)的 offer。这个 offer 在当时是挺难拿的,竞争很激烈,我自己也没想到能拿到。这也让我意识到平台的重要性。

    还有一点是在英特尔实习也开拓了我的眼界。像隔壁组是在给 Spark repo 做贡献,当时负责带队的老师后来成了英特尔研究院的院长,不过我的指导老师后来也成了院长,他们都是非常厉害的人。此外,英特尔老师在就业指导上面,会看的比较远(相对于学校老师)。当时我有两个 offer:一个是 IBM 的,一个是百度。IBM 给的还比百度多,但英特尔的老师就建议我去百度锻炼和提升一下自己。

    英特尔和百度不一样的地方就和网上说的一样:英特尔比较轻松,准时六点就能下班。一周实习工作其实我两到三天就能完成,然后剩下一半的时间都是在写我的论文。但对百度来说,即使是百度深度学习研究院(IDL),工作也会更偏向工程和产品落地,所以很忙。

    哦!再补充一下:就是,英特尔里面的女性研究员真的非常多。和百度不同,百度这边男性工程师会占大半部分!

    涛姐注✍️:在英特尔实习那两年是我最开心的时候。在外面租着房子,自己又有钱下班又早。虽然都是月光,但真的很开心😄!一下班,就可以自己追韩剧,然后做做瑜伽,自己美美容,买买衣服,逛逛淘宝~

  8. 涛姐有没有一直在坚持的兴趣爱好?大学时的爱好有哪些呢?

    涛姐: 以前的空闲时间我喜欢练瑜伽,但现在所有的空闲时间都在带娃!瑜伽是在大学时期就开始坚持的,当时是有参加一些社团,但并没有特别深入。后来在英特尔实习有钱了,就开始外面报班,参加了一些瑜伽课。感觉练瑜伽相对容易,而且让人心情平和!

    但现在我已经没有坚持了,主要原因是我几乎没有自己的闲暇时间。不加班的时候,下班后我得等娃睡觉了之后才能刷手机。而有时候还需要开会,更没有自己的时间。因为互联网工作不是传统的上下班制度,而是根据绩效和产出来衡量的。现在每天的生活节奏通常是:起床、上班、下班、带娃、睡觉,这样一个不断循环的过程。

    编者注✍️:涛姐也有和老公一起练双人瑜伽哦,大家可以去涛姐朋友圈看👀照片,哈哈哈~

    涛姐练瑜伽
  9. 学生时代你有参加过开源吗?向哪些项目/组织提交过 PR 呢?

    涛姐: 学生时代只向 Caffe 提交过 PR。那个时候是在英特尔实习,然后实习的题目也和我的论文比较相关:需要做一个 CPU 多线程加速的优化。所以就给 Caffe 提了一个 PR。但那个 PR 没有被合入,因为有一些工程上的问题会影响 Caffe 的整体。提 PR 和发论文不太一样,发论文只要性能数据达标了就可以,但是 PR 合入到主干中还要考虑到很多其他的问题。

  10. 作为过来人,涛姐在职场上有什么建议给大家?

    涛姐: 在学生时代,你就要有自己的职业生涯规划。从学生到职场会有一个心理转变的过程。特别像职场,有时候会比较复杂。经常会出现:人家晋升你没有晋升或者人家年终奖比你高(反正公司内是不允许大家讨论薪酬的)。但是谁晋升谁没晋升这些大家都知道,所以这时候你就要有:“他强任他强,清风拂山岗”的心态,你一定不要纠结于经理保谁没保谁。当你做到大家公认比较好的时候,你肯定能升职。

    然后职场里还有一个很重要的点就是:你要坚持!大家有时候 2 到 3 年会想跳槽或者每 5 年想跳槽,这个时候得看你自己的想法。我自己在百度呆了八年,没有跳槽,很大一个原因是我现在做的事情,像是开源这一类的是我比较喜欢的,我对这类事比较有热情,现在对自己的工作状态也比较满意。还有我们家那位就是跳来跳去的,之后他就劝我:还是别跳!

    编者注✍️:涛姐是校园恋爱哦~老公是以前一个实验室的!🤭

    涛姐参加活动时照片
  11. 在恋爱上有什么建议给大家?

    涛姐: 学校里还是相对比较单纯一点,所以如果可以,最好在学校解决恋爱问题。工作之后,你也没有心情去解决个人问题。事情很多(你进入职场之后,你马上面临的是买房子、经济压力、赡养老人等等事情,你要变成一个成年人负担起一个家庭的责任。所以大家趁年轻多多拼搏一下,你要是有一些经济基础的话,那相对会好一点!),职场的压力是远比学校的压力更大。而且你一年一年拖下去之后,优秀的师兄师姐们的数量是会减少的!所以要稍稍早一点!然后一定要找长得好看的,这样生出来的娃才好看!我当时的要求就是:学历要跟我同等,长得帅,然后还得是党员。其他我没有要求,再挑就挑不出来了。找对象,只能挑几个最重要的点,你要搞清楚自己最想要的是什么?你不能啥都要,那是不可能的!

    编者注✍️:涛姐人送外号「百度红娘」~

涛姐 7 个月的孕妇照
  1. 作为女性研发,你在工作上有没有遇到什么难题?与男性研发相比,你觉得有什么区别?

    涛姐: 我觉得和男生没什么区别。现在 Paddle 里的一些女性研发都非常厉害的,比如和我同一期加入 Paddle 的青青(@qingqing01)、益群(@Xreki)一起工作已经八年了,以及时间更久的志华姐、渝娟姐(虽然离职了),包括新进来的雅美(@liym27)、张婷(@zhangting2020),她们都是非常出色!你能看到的、存活到现在的 Paddle 研发都非常厉害!(因为不厉害的早就被淘汰了)而且包括我们的两个副总裁也都是女生,能坐到这么高的位置,很大程度能说明能力很强!

    所以,女孩子们一定要有自信,并且多努力学习!不要觉得是男生才能主导,要相信自己也能做成!同时,内心强大一点,知道自己的定位,要明白自己擅长什么,在工作中去充分的扬长避短!

    可能会有一个比较大的区别就是生娃。生育是女性需要面临的一个无法避免的问题,会对事业产生不同程度的影响,所以女性可能要在生娃之前多多奋斗几年。不过这个问题对于还是学生的女生来说,考虑的还有点早啦~

    另外,女生学计算机的话,热爱还是很重要的。只有热爱它,才能坚持下来~在我们的开源社区中,像孙师傅带的三个「Docs 偶像女团」的女生,我觉得是能从她们那儿看到我以前的影子!虽然她们做的事情并不难,但展现出的热爱,是非常可贵的。每次这个精品小团开会,我看她们跟孙师傅交流的时候,都是闪闪发光的。

    编者注✍️:精品小团体是飞桨启航计划的一次尝试,是招募有意愿的营员参与到某⼀具体⽅向的⼩团体。未来会推广该模式,所以大家多多参与哦!

15 年 Team buiding

二、涛姐有话说

by 涛姐(@luotao1

',10),v=t("p",null,[e("在当时,想要合入一个 PR 可难了。如果没有认识的人,PR 合进去的难度非常高,因为代码改不到他们的点上,而且也不了解他们的活动和进展,也没有类似于我们现在的 "),t("strong",null,[t("a",{href:"https://github.com/PaddlePaddle/community/tree/master/pfcc",target:"_blank",rel:"noreferrer"},"PFCC")]),e(" 例会和社区做分享。")],-1),w=t("p",null,"我现在觉得,当时能靠着没合进去的 PR 进入了百度,现在大家也能做的更好。所以鼓励大家多多参加开源活动~不仅获得好的实习项目,还可以拓宽眼界!",-1),C=t("p",null,"此外,如果一些同学没有什么项目,又想找到好的实习机会,其实现在可以在参与一些开源社区的任务。因为找到第一份工作其实是最难的,你只有找到第一份工作,后面慢慢的才会越来越顺利。但这确实很难!因为名额很珍贵,所以面试考核就是一种很公式、很官方的流程。",-1),x=t("p",null,[e("如果靠着自己在学校期间做的项目,面试阶段是讲不清楚的。即使讲清楚,面试官也会一带而过。因为这些都是网上查不到的,所以面试最终只能考代码。但像提 PR 或者发论文,面试官都能一眼看明白你做的工作,并且在网上都能查到。所以如果像参加"),t("strong",null,"护航计划"),e(",那可能就是立马拿到工作机会,我们有三个做过护航计划的同学都是立刻得到工作机会,面试流程只是走一下。")],-1),T=t("p",null,"最后送大家一句话:世界会更加广阔,前途更加无限。",-1),R=i('

编者注✍️:涛姐在上面提到没合入的 PR 是关于在 Caffe 上做 CPU 多线程优化~

三、快乐晒娃时刻

左图:涛姐童年照
涛姐童年照
右图:涛姐的小宝贝
涛姐两岁半的可爱小宝贝

涛姐全家福照片

最后再来一张宝贝的可爱九宫格😊~ ​

涛姐宝贝九宫格

编者注✍️:感谢郑必城(@Zheng-Bicheng)、散步(@sanbuphy)、张一乔(@Liyulingyue)、川川(@gouzil)四位师傅在引言为涛姐想的 title~顺序对应哦!

写在最后 💡

【开源江湖闲聊录】 是一项专门为 Paddle 社区的开发者打造的特色访谈栏目 📚。在这里,我们邀请到每一位别具一格且富有热情的开发者,通过文字或语音的方式进行深入采访 🎙️,探索并展现他们背后独一无二的故事,将他们的经历、见解和创意整理成精彩内容,呈现给整个社区。


',12),V=JSON.parse('{"title":"【开源江湖闲聊录】飞桨的见证者:涛姐的风风雨雨传奇之旅","description":"","frontmatter":{"title":"【开源江湖闲聊录】飞桨的见证者:涛姐的风风雨雨传奇之旅","date":"2024-2-6","author":{"name":"文潇","github":"wenxiaohahaha"},"co_authors":[{"name":"孙钟恺","github":"sunzhongkai588"},{"name":"骆涛(涛姐)","github":"luotao1"}]},"headers":[],"relativePath":"posts/tao-story.md","filePath":"posts/tao-story.md"}'),B={name:"posts/tao-story.md"},N=Object.assign(B,{setup(D){return(L,A)=>(p(),n("div",null,[j,o(r,null,{default:a(()=>[o(s,{name:"涛姐",github:"luotao1"},{default:a(()=>[e(" Paddle 这个平台其实很不错。说实话,在国内 Paddle 已经站在了顶尖的位置。在我的学生时代,国内是没有这样丰富的开源机会,当时开源活动只有像 Caffe 和 Intel 在办,但这些都是国外的。你要考虑很多:如何参加活动?活动符不符合你的能力?改的代码在不在点上?提了 PR 之后,别人会不会像我们 Paddle 现在这样,每个 PR 给你快速的安排研发 review?而且我们还会催大家,也给大家发礼品。这些在国外的开源开源社区几乎都是没有的。 "),v,w,C,x,T]),_:1})]),_:1}),R]))}});export{V as __pageData,N as default}; diff --git a/assets/posts_tao-story.md.DPMbREGv.lean.js b/assets/posts_tao-story.md.DPMbREGv.lean.js new file mode 100644 index 0000000..349e51c --- /dev/null +++ b/assets/posts_tao-story.md.DPMbREGv.lean.js @@ -0,0 +1 @@ +import{M as r,_ as s}from"./chunks/MessageBox.BjkmF0_f.js";import{c as n,i as o,v as a,l as i,o as p,x as e,a as t}from"./chunks/framework.CEb3mtFd.js";const l="/assets/tao-01.BX6ijUAN.jpeg",g="/assets/tao-02.BUnT8yba.jpeg",c="/assets/tao-03.CuBFfcLy.jpeg",f="/assets/tao-04.V71B6Cdn.jpeg",d="/assets/tao-05.P2XMQFEu.jpeg",u="/assets/tao-06.CAhJU0ix.jpeg",h="/assets/tao-07.TWwMfHJ4.jpeg",_="/assets/tao-08.BKQPDZFR.jpeg",m="/assets/tao-09.DHjwEJQm.jpeg",b="/assets/tao-10.D1eqPGHg.jpeg",P="/assets/tao-11.Bt1BpI2J.jpeg",y="/assets/tao-12.CqVYWYYD.jpeg",k="/assets/tao-13.Bm_8HEqz.jpeg",q="/assets/tao-14.LNcnxsAv.jpeg",j=i("",10),v=t("p",null,[e("在当时,想要合入一个 PR 可难了。如果没有认识的人,PR 合进去的难度非常高,因为代码改不到他们的点上,而且也不了解他们的活动和进展,也没有类似于我们现在的 "),t("strong",null,[t("a",{href:"https://github.com/PaddlePaddle/community/tree/master/pfcc",target:"_blank",rel:"noreferrer"},"PFCC")]),e(" 例会和社区做分享。")],-1),w=t("p",null,"我现在觉得,当时能靠着没合进去的 PR 进入了百度,现在大家也能做的更好。所以鼓励大家多多参加开源活动~不仅获得好的实习项目,还可以拓宽眼界!",-1),C=t("p",null,"此外,如果一些同学没有什么项目,又想找到好的实习机会,其实现在可以在参与一些开源社区的任务。因为找到第一份工作其实是最难的,你只有找到第一份工作,后面慢慢的才会越来越顺利。但这确实很难!因为名额很珍贵,所以面试考核就是一种很公式、很官方的流程。",-1),x=t("p",null,[e("如果靠着自己在学校期间做的项目,面试阶段是讲不清楚的。即使讲清楚,面试官也会一带而过。因为这些都是网上查不到的,所以面试最终只能考代码。但像提 PR 或者发论文,面试官都能一眼看明白你做的工作,并且在网上都能查到。所以如果像参加"),t("strong",null,"护航计划"),e(",那可能就是立马拿到工作机会,我们有三个做过护航计划的同学都是立刻得到工作机会,面试流程只是走一下。")],-1),T=t("p",null,"最后送大家一句话:世界会更加广阔,前途更加无限。",-1),R=i("",12),V=JSON.parse('{"title":"【开源江湖闲聊录】飞桨的见证者:涛姐的风风雨雨传奇之旅","description":"","frontmatter":{"title":"【开源江湖闲聊录】飞桨的见证者:涛姐的风风雨雨传奇之旅","date":"2024-2-6","author":{"name":"文潇","github":"wenxiaohahaha"},"co_authors":[{"name":"孙钟恺","github":"sunzhongkai588"},{"name":"骆涛(涛姐)","github":"luotao1"}]},"headers":[],"relativePath":"posts/tao-story.md","filePath":"posts/tao-story.md"}'),B={name:"posts/tao-story.md"},N=Object.assign(B,{setup(D){return(L,A)=>(p(),n("div",null,[j,o(r,null,{default:a(()=>[o(s,{name:"涛姐",github:"luotao1"},{default:a(()=>[e(" Paddle 这个平台其实很不错。说实话,在国内 Paddle 已经站在了顶尖的位置。在我的学生时代,国内是没有这样丰富的开源机会,当时开源活动只有像 Caffe 和 Intel 在办,但这些都是国外的。你要考虑很多:如何参加活动?活动符不符合你的能力?改的代码在不在点上?提了 PR 之后,别人会不会像我们 Paddle 现在这样,每个 PR 给你快速的安排研发 review?而且我们还会催大家,也给大家发礼品。这些在国外的开源开源社区几乎都是没有的。 "),v,w,C,x,T]),_:1})]),_:1}),R]))}});export{V as __pageData,N as default}; diff --git a/assets/posts_wangxin-story.md.bHMq97Rw.js b/assets/posts_wangxin-story.md.bHMq97Rw.js new file mode 100644 index 0000000..557fe5c --- /dev/null +++ b/assets/posts_wangxin-story.md.bHMq97Rw.js @@ -0,0 +1 @@ +import{M as s,_ as r}from"./chunks/MessageBox.BjkmF0_f.js";import{c as n,i,v as a,l,a as t,x as e,o}from"./chunks/framework.CEb3mtFd.js";const g="/assets/wangxin-01.Hz-UX5vs.jpeg",p="/assets/wangxin-02.BGcXQipn.jpeg",d="/assets/wangxin-03.CAFEHiKf.jpeg",c="/assets/wangxin-04.DPt9W4dS.jpeg",u="/assets/wangxin-05.U63PCqJk.jpeg",h="/assets/wangxin-06.muvimoV2.jpeg",f="/assets/wangxin-07.CNOKyk_u.jpeg",y="/assets/wangxin-08.qkTnZ9Mk.jpeg",_="/assets/wangxin-09.0-vCbkph.jpeg",b="/assets/wangxin-10.CRRtNptg.jpeg",m="/assets/wangxin-11.R5oNZCsm.jpeg",P="/assets/wangxin-12.BsgnfET_.jpeg",x=l('

无论是工作还是生活,他都认真对待!无论是开源世界还是家庭亲情他都怀抱深沉热爱!从一开始提修改文档 PR 的边缘者到如今横扫各大开源任务的 Paddle 扫地僧!汪师傅一直在开源界默默努力💪深耕~今天,就让我们一起揭开这位神秘大佬的面纱,探寻他的故事吧!✨✨✨

一、汪师傅幸福瞬间

汪师傅幸福瞬间 1
汪师傅幸福瞬间 2

二、采访内容

  1. 汪师傅给我们介绍一下自己吧!

    汪师傅: 我硕士毕业于兰州理工大学,通信与信息系统专业。老家在安徽安庆,目前在宁波工作,工作 4 年多了。兴趣爱好就是写代码、吃美食、喝酒。

  2. 你在兰州理工大学攻读硕士期间,最难忘的经历是什么?

    汪师傅: 在兰州最难忘的就是各种各样的美食。吃得最多的是兰州牛肉面(兰州市以外地区常见的“兰州拉面”与兰州牛肉面并非同一种食物,多为青海化隆拉面)。记得学校里有一个食堂专门做牛肉面,本地人喜欢说去吃一碗牛大。牛肉面讲究一清、二白、三红、四绿、五黄,即汤清、萝卜片白、辣椒油红、香菜和蒜苗绿,以及面条黄亮。面形又分为毛细、细、二细、三细、二柱子、韭叶、薄宽、宽、大宽等等,让人选择不过来。我一般选二细加鸡蛋加一碟牛肉。放哈(“放哈”在兰州方言中意思是"发酵”)的甜胚子奶茶是另一种难忘的美食,点一杯奶茶和三五好友坐在一起聊聊天也是一种享受。

    汪师傅拍的兰州牛肉面
  3. 你本科在安徽又在兰州读硕士,为什么选择在宁波工作?可以简单讲讲现在工作在做什么呢?

    汪师傅: 找工作的时候,一个亲戚正好拍了一张招聘广告,并且发给我了。招聘的公司在宁波,我就顺手投了一份简历,后面被录用了,就去宁波了。工作主要是做生化、免疫、血脂、血球、尿液分析仪里面涉及算法的部分。

    笔者注 ✍️:汪师傅本科毕业于安徽的淮北师范大学!

  4. 汪师傅工作四年多了,觉得工作后自己最大的变化是什么呢?

    汪师傅: 从萌新变成了老油条。

  5. 听你说平时喜欢吃美食,可以给我们推荐一下宁波/安徽/兰州分别有啥好吃的东西吗?

    汪师傅: 宁波烤菜年糕、鳗鲞、红膏呛蟹和泥螺都还不错。安徽的话推荐臭鳜鱼和山粉圆子。兰州必须来一碗牛肉面和一杯甜胚子奶茶😁。

  6. 通信这类专业好像和深度学习关联不大,你怎么想到去接触深度学习?

    汪师傅: 读研的时候做的是传感器网络和优化算法,对深度学习有些了解。工作的时候开始做信号处理算法和图像处理算法,后面做项目发现用深度学习的方法效果更好,就开始学深度学习了。

  7. 你在 Paddle 社区中做了很多贡献,当时为什么想着加入 Paddle 开源社区?后来又为什么一直坚持给 Paddle 做贡献?你觉得这些贡献有什么意义?

    汪师傅: 我是从学习 OCR 接触到 Paddle 社区的。当时在 AI Studio 上有一门课叫「动手学 OCR·十讲」,学习的过程中开始看 PaddleOCR 的代码和文档。在阅读文档的时候会发现错误,就慢慢开始提一些 typo fix 的 PR。而给 Paddle 框架做贡献则是从 Paddle 黑客松和快乐开源任务开始的。我做的第一个 Paddle 框架的贡献是 [CodeStyle] Compiler Warning tracking issue 相关的。这些开源贡献的意义大概是加深了对开源框架的理解、提升了自己写代码的能力,对代码质量有了更高的追求。

    汪师傅部分开源任务展示 1
    汪师傅部分开源任务展示 2
  8. 听说你加入了飞桨社区开源发展工作组🙌🏻,对于该工作组你有什么看法呢?

    汪师傅: 加入 PPOSDWG 后评选新一期开源之星、为社区未来的建设和发展提了一些建议,Paddle2ONNX PMC 也是在工作组讨论中诞生的。PPOSDWG 确实起到了部分社区治理的作用。

  9. 听说你也加入了Paddle2ONNX PMC,对于自己加入这个组织你又有什么看法?加入这个组织你想达成一些什么成就呢?

    汪师傅: 我是以 Paddle2ONNX 的用户角色加入的。郑师傅(@Zheng-Bicheng)是 PMC Chair,已经提了很多 PR,是主要力量。后面我可能就是多解答一些 issue。

    笔者注 ✍️:为了 Paddle2ONNX 项目的可持续健康发展和加强社区治理, 飞桨社区开源发展工作组决定设立 Paddle2ONNX PMC(Project Management Committee) 来负责 Paddle2ONNX 项目的技术决策和维护。

  10. 据我所知,汪师傅在一家生物公司工作。为什么在生物公司你还是坚持 AI 开源,而且还是 AI 框架开源?

    汪师傅: 生物公司也有很多项目要用到 AI,例如血细胞分类、识别尿液官型、识别液面高度等等。坚持开源主要是下班时间比较早,而我又不喜欢出门玩,只能在家写写代码消磨一下时间。

  11. 看你的 GitHub 热力图是全绿的,是怎么做到的呀?真的在 7*24 小时搞开源吗?

    汪师傅: 下班时候比较早,每天都能写写代码。例如做一做快乐开源任务、做一做黑客松题目,写一写自己的开源项目等等。

    汪师傅的 GitHub 热力图
  12. 你觉得参与开源社区对你的事业会有帮助吗?

    汪师傅: 参与开源社区认识了很多有趣的小伙伴,同时也能提升写代码的能力,这些都会对事业有一定的帮助。

  13. 汪师傅有在参与其他社区的开源项目么?有没有什么有趣的开源项目可以分享一下?

    汪师傅: 其他开源项目大部分都是阅读文档时,看到文档有错误,顺手提的 typos fix。如 scipy DOC: fix typo in cluster/_hierarchy.pyxyolov5 Ignore *_paddle_model/ dirlabelme Remove a duplicate statement

  14. 八卦一下,汪师傅和你的妻子是怎么认识的呀?

    汪师傅: 通过我奶奶介绍认识的,她家当时正好在我奶奶家隔壁开店。然后加上了微信,聊聊天,见见面,这样子就认识了。

    汪师傅老婆照片集 1
    汪师傅老婆照片集 2
    汪师傅与老婆合照
    汪师傅与家人合照
  15. 你有什么想对社区小伙伴说的么?

    汪师傅: 热爱生活,热爱开源。

    笔者注✍️:汪师傅也有博客哦!大家可以去看看👉 https://vlight.me/ ❤️ 一起交流技术,共同进步!

    汪师傅喝酒拍的照片集 1
    汪师傅喝酒拍的照片集 2

三、神秘汪佬的评论区

by 涛姐(luotao1

',8),k=t("h3",{id:"by-张一乔师傅-liyulingyue",tabindex:"-1"},[e("by 张一乔师傅("),t("a",{href:"https://github.com/liyulingyue",target:"_blank",rel:"noreferrer"},"liyulingyue"),e(") "),t("a",{class:"header-anchor",href:"#by-张一乔师傅-liyulingyue","aria-label":'Permalink to "by 张一乔师傅([liyulingyue](https://github.com/liyulingyue))"'},"​")],-1),v=t("h3",{id:"by-李敏师傅-enkilee",tabindex:"-1"},[e("by 李敏师傅("),t("a",{href:"https://github.com/enkilee",target:"_blank",rel:"noreferrer"},"enkilee"),e(") "),t("a",{class:"header-anchor",href:"#by-李敏师傅-enkilee","aria-label":'Permalink to "by 李敏师傅([enkilee](https://github.com/enkilee))"'},"​")],-1),w=t("h3",{id:"by-散步师傅-sanbuphy",tabindex:"-1"},[e("by 散步师傅("),t("a",{href:"https://github.com/sanbuphy",target:"_blank",rel:"noreferrer"},"sanbuphy"),e(") "),t("a",{class:"header-anchor",href:"#by-散步师傅-sanbuphy","aria-label":'Permalink to "by 散步师傅([sanbuphy](https://github.com/sanbuphy))"'},"​")],-1),j=t("h3",{id:"by-梦柳师傅-ligoml",tabindex:"-1"},[e("by 梦柳师傅("),t("a",{href:"https://github.com/Ligoml",target:"_blank",rel:"noreferrer"},"Ligoml"),e(") "),t("a",{class:"header-anchor",href:"#by-梦柳师傅-ligoml","aria-label":'Permalink to "by 梦柳师傅([Ligoml](https://github.com/Ligoml))"'},"​")],-1),N=t("hr",null,null,-1),C=t("h2",{id:"写在最后-💡",tabindex:"-1"},[e("写在最后 💡 "),t("a",{class:"header-anchor",href:"#写在最后-💡","aria-label":'Permalink to "写在最后 💡"'},"​")],-1),q=t("p",null,[t("strong",null,"【开源江湖闲聊录】"),e(" 是一项专门为 Paddle 社区的开发者打造的特色访谈栏目 📚。在这里,我们邀请到每一位别具一格且富有热情的开发者,通过文字或语音的方式进行深入采访 🎙️,探索并展现他们背后独一无二的故事,将他们的经历、见解和创意整理成精彩内容,呈现给整个社区。")],-1),O=t("hr",null,null,-1),M=JSON.parse('{"title":"【开源江湖闲聊录】Paddle 六边形战士?揭开汪师傅的神秘面纱~","description":"","frontmatter":{"title":"【开源江湖闲聊录】Paddle 六边形战士?揭开汪师傅的神秘面纱~","date":"2024-3-18","author":{"name":"文潇","github":"wenxiaohahaha"},"co_authors":[{"name":"孙钟恺","github":"sunzhongkai588"},{"name":"汪昕(汪师傅)","github":"GreatV"}]},"headers":[],"relativePath":"posts/wangxin-story.md","filePath":"posts/wangxin-story.md"}'),R={name:"posts/wangxin-story.md"},V=Object.assign(R,{setup(S){return(B,T)=>(o(),n("div",null,[x,i(s,null,{default:a(()=>[i(r,{name:"骆涛",github:"luotao1"},{default:a(()=>[e(" 汪师傅在我印象中全能,啥类型的 Paddle 题目都能做,非常 NB。而且是上班的业余时间用来 Paddle 开源,真的太感动了,对 Paddle 是真爱了。 ")]),_:1})]),_:1}),k,i(s,null,{default:a(()=>[i(r,{name:"张一乔",github:"liyulingyue"},{default:a(()=>[e(" 汪师傅!人如其头像!一直感觉是一个什么都会的大佬! ")]),_:1})]),_:1}),v,i(s,null,{default:a(()=>[i(r,{name:"李敏",github:"enkilee"},{default:a(()=>[e(" 神秘而强大的 G 佬,和 002 并称飞桨巨头之一的 greatx (但比 002 多了个核心条件😂),clang-tidy 的领头者,有硬件,有时间,有技术,有想法,多边形战士。 ")]),_:1})]),_:1}),w,i(s,null,{default:a(()=>[i(r,{name:"散步",github:"sanbuphy"},{default:a(()=>[e(" 感觉汪师傅是 Paddle 扫地僧之一,是很低调很有才华的大神,人狠话不多!😄 ")]),_:1})]),_:1}),j,i(s,null,{default:a(()=>[i(r,{name:"梦柳",github:"Ligoml"},{default:a(()=>[e(" 去年在上海办 meetup,对汪佬的初印象就是很 i,在一群 i 人中都非常明显哈哈哈,但是很有自己的想法和行动力,提出了很多对开源社区有益的想法,也在积极带领新伙伴融入飞桨快乐开源的氛围,有各位可爱的开发者是飞桨的福气~ ")]),_:1})]),_:1}),N,C,q,O]))}});export{M as __pageData,V as default}; diff --git a/assets/posts_wangxin-story.md.bHMq97Rw.lean.js b/assets/posts_wangxin-story.md.bHMq97Rw.lean.js new file mode 100644 index 0000000..a23ad49 --- /dev/null +++ b/assets/posts_wangxin-story.md.bHMq97Rw.lean.js @@ -0,0 +1 @@ +import{M as s,_ as r}from"./chunks/MessageBox.BjkmF0_f.js";import{c as n,i,v as a,l,a as t,x as e,o}from"./chunks/framework.CEb3mtFd.js";const g="/assets/wangxin-01.Hz-UX5vs.jpeg",p="/assets/wangxin-02.BGcXQipn.jpeg",d="/assets/wangxin-03.CAFEHiKf.jpeg",c="/assets/wangxin-04.DPt9W4dS.jpeg",u="/assets/wangxin-05.U63PCqJk.jpeg",h="/assets/wangxin-06.muvimoV2.jpeg",f="/assets/wangxin-07.CNOKyk_u.jpeg",y="/assets/wangxin-08.qkTnZ9Mk.jpeg",_="/assets/wangxin-09.0-vCbkph.jpeg",b="/assets/wangxin-10.CRRtNptg.jpeg",m="/assets/wangxin-11.R5oNZCsm.jpeg",P="/assets/wangxin-12.BsgnfET_.jpeg",x=l("",8),k=t("h3",{id:"by-张一乔师傅-liyulingyue",tabindex:"-1"},[e("by 张一乔师傅("),t("a",{href:"https://github.com/liyulingyue",target:"_blank",rel:"noreferrer"},"liyulingyue"),e(") "),t("a",{class:"header-anchor",href:"#by-张一乔师傅-liyulingyue","aria-label":'Permalink to "by 张一乔师傅([liyulingyue](https://github.com/liyulingyue))"'},"​")],-1),v=t("h3",{id:"by-李敏师傅-enkilee",tabindex:"-1"},[e("by 李敏师傅("),t("a",{href:"https://github.com/enkilee",target:"_blank",rel:"noreferrer"},"enkilee"),e(") "),t("a",{class:"header-anchor",href:"#by-李敏师傅-enkilee","aria-label":'Permalink to "by 李敏师傅([enkilee](https://github.com/enkilee))"'},"​")],-1),w=t("h3",{id:"by-散步师傅-sanbuphy",tabindex:"-1"},[e("by 散步师傅("),t("a",{href:"https://github.com/sanbuphy",target:"_blank",rel:"noreferrer"},"sanbuphy"),e(") "),t("a",{class:"header-anchor",href:"#by-散步师傅-sanbuphy","aria-label":'Permalink to "by 散步师傅([sanbuphy](https://github.com/sanbuphy))"'},"​")],-1),j=t("h3",{id:"by-梦柳师傅-ligoml",tabindex:"-1"},[e("by 梦柳师傅("),t("a",{href:"https://github.com/Ligoml",target:"_blank",rel:"noreferrer"},"Ligoml"),e(") "),t("a",{class:"header-anchor",href:"#by-梦柳师傅-ligoml","aria-label":'Permalink to "by 梦柳师傅([Ligoml](https://github.com/Ligoml))"'},"​")],-1),N=t("hr",null,null,-1),C=t("h2",{id:"写在最后-💡",tabindex:"-1"},[e("写在最后 💡 "),t("a",{class:"header-anchor",href:"#写在最后-💡","aria-label":'Permalink to "写在最后 💡"'},"​")],-1),q=t("p",null,[t("strong",null,"【开源江湖闲聊录】"),e(" 是一项专门为 Paddle 社区的开发者打造的特色访谈栏目 📚。在这里,我们邀请到每一位别具一格且富有热情的开发者,通过文字或语音的方式进行深入采访 🎙️,探索并展现他们背后独一无二的故事,将他们的经历、见解和创意整理成精彩内容,呈现给整个社区。")],-1),O=t("hr",null,null,-1),M=JSON.parse('{"title":"【开源江湖闲聊录】Paddle 六边形战士?揭开汪师傅的神秘面纱~","description":"","frontmatter":{"title":"【开源江湖闲聊录】Paddle 六边形战士?揭开汪师傅的神秘面纱~","date":"2024-3-18","author":{"name":"文潇","github":"wenxiaohahaha"},"co_authors":[{"name":"孙钟恺","github":"sunzhongkai588"},{"name":"汪昕(汪师傅)","github":"GreatV"}]},"headers":[],"relativePath":"posts/wangxin-story.md","filePath":"posts/wangxin-story.md"}'),R={name:"posts/wangxin-story.md"},V=Object.assign(R,{setup(S){return(B,T)=>(o(),n("div",null,[x,i(s,null,{default:a(()=>[i(r,{name:"骆涛",github:"luotao1"},{default:a(()=>[e(" 汪师傅在我印象中全能,啥类型的 Paddle 题目都能做,非常 NB。而且是上班的业余时间用来 Paddle 开源,真的太感动了,对 Paddle 是真爱了。 ")]),_:1})]),_:1}),k,i(s,null,{default:a(()=>[i(r,{name:"张一乔",github:"liyulingyue"},{default:a(()=>[e(" 汪师傅!人如其头像!一直感觉是一个什么都会的大佬! ")]),_:1})]),_:1}),v,i(s,null,{default:a(()=>[i(r,{name:"李敏",github:"enkilee"},{default:a(()=>[e(" 神秘而强大的 G 佬,和 002 并称飞桨巨头之一的 greatx (但比 002 多了个核心条件😂),clang-tidy 的领头者,有硬件,有时间,有技术,有想法,多边形战士。 ")]),_:1})]),_:1}),w,i(s,null,{default:a(()=>[i(r,{name:"散步",github:"sanbuphy"},{default:a(()=>[e(" 感觉汪师傅是 Paddle 扫地僧之一,是很低调很有才华的大神,人狠话不多!😄 ")]),_:1})]),_:1}),j,i(s,null,{default:a(()=>[i(r,{name:"梦柳",github:"Ligoml"},{default:a(()=>[e(" 去年在上海办 meetup,对汪佬的初印象就是很 i,在一群 i 人中都非常明显哈哈哈,但是很有自己的想法和行动力,提出了很多对开源社区有益的想法,也在积极带领新伙伴融入飞桨快乐开源的氛围,有各位可爱的开发者是飞桨的福气~ ")]),_:1})]),_:1}),N,C,q,O]))}});export{M as __pageData,V as default}; diff --git a/assets/posts_wuxi-kaifangyuanzi.md.BjTDfesd.js b/assets/posts_wuxi-kaifangyuanzi.md.BjTDfesd.js new file mode 100644 index 0000000..1efae88 --- /dev/null +++ b/assets/posts_wuxi-kaifangyuanzi.md.BjTDfesd.js @@ -0,0 +1 @@ +import{_ as t,c as e,o as a,l as r}from"./chunks/framework.CEb3mtFd.js";const d="/assets/competition-roadshow.BPyvtSOq.jpeg",o="/assets/meng-speech.DgYTkpXv.jpeg",l="/assets/round-table.Bj71g6wR.jpeg",p="/assets/group-photo.thp-v6D1.jpeg",i="/assets/OS-Projects.Wxwhgkfx.jpeg",s="/assets/OS-Contributors-01.TDrl-t3l.jpeg",n="/assets/OS-Contributors-02.wAuNCrPo.jpeg",c="/assets/OS-Contributors-03.9OnUxDBJ.jpeg",m="/assets/cups.DUBobWYR.jpeg",R=JSON.parse('{"title":"飞桨开源社区参加开放原子开源大赛 & 开发者大会","description":"","frontmatter":{"title":"飞桨开源社区参加开放原子开源大赛 & 开发者大会","date":"2023-12-26T00:00:00.000Z","author":{"name":"梦师傅","github":"Ligoml"}},"headers":[],"relativePath":"posts/wuxi-kaifangyuanzi.md","filePath":"posts/wuxi-kaifangyuanzi.md"}'),h={name:"posts/wuxi-kaifangyuanzi.md"},g=r('

2023 年 12 月 15 日顺利完成「第一届开放原子开源大赛 - 飞桨 PaddlePaddle 开源贡献挑战赛」决赛路演,产生 2 支一等奖队伍,16 日参加开放原子开源基金会举办的「2023 开放原子开发者大会」,与各开源组织与机构同行沟通交流,收获满满~

开放原子开源大赛 - 飞桨 PaddlePaddle 开源任务挑战大赛 🏁

开放原子开源基金会是致力于推动全球开源事业发展的非营利机构。这次飞桨团队受邀参与了「第一届开放原子开源大赛」的共建,发布飞桨 PaddlePaddle 开源贡献挑战赛,本期共计发布 6 道赛题,报名 39 支团队,收到有效提交作品 8 个,经初步筛选有 5 个作品入围决赛答辩,经 6 位评委线下评审,选出一等奖 2 名、二等奖 2 名、三等奖 1 名。飞桨获「优秀共建方」荣誉 🥳。

还有无锡市公证处的工作人员做现场公示,可正规呢~

赛题贡献 repo参赛团队团队背景获奖情况提交情况
赛题三:SSLD 蒸馏 Teacher 离线化PaddleClasSOTAFinder 团队上海交通大学二等奖代码开源地址:https://atomgit.com/oliverck/PaddleClas
PR 链接:https://atomgit.com/paddlepaddle/PaddleClas/change/1
赛题五:复现图像编辑论文 Null-text InversionPaddleMIX你想叫啥就叫啥 团队IDEA 研究院一等奖代码开源地址:https://atomgit.com/lalala/PaddleMix
RFC 链接:https://atomgit.com/paddlepaddle/community/change/1
PR 链接:https://atomgit.com/paddlepaddle/PaddleMix/change/1
赛题六:基于 PINN 的 CFD 离散网格优化PaddleScienceFAIR Mesh 团队浙江大学一等奖代码开源地址:https://atomgit.com/bianx/FAIR_PaddleScience
RFC 链接:https://atomgit.com/paddlepaddle/community/change/5
PR 链接:https://atomgit.com/paddlepaddle/PaddleScience/change/2
赛题六:基于 PINN 的 CFD 离散网格优化PaddleScience杭电飞碟 团队杭州电子科技大学二等奖代码开源地址:https://atomgit.com/guagua/paddle_hangdian
PR 链接:https://atomgit.com/paddlepaddle/PaddleScience/change/13
赛题六:基于 PINN 的 CFD 离散网格优化PaddleScienceBUAAC503 团队北京航空航天大学三等奖代码开源地址:https://atomgit.com/generic/sensitivity-PaddleScience
PR 链接:https://atomgit.com/paddlepaddle/PaddleScience/change/1

competition-roadshow

梦师傅注✍️:很有精神!

开放原子开发者大会 - 开源治理与开发者运营分论坛 💬

这次大会规格很高,百度搜索「2023 开放原子开发者大会」可以看到很多新闻。飞桨受邀参加的是「开源治理与开发者运营分论坛」,梦师傅有一个关于飞桨开源社区的分享,同时也是分论坛的主持人和圆桌嘉宾,被现场导演戏称为「全场最忙的人」🤣。

meng-speech

round-table

group-photo

开放原子开发者大会 - 开发者之夜 🌠

还没完!晚上的开发者之夜,有央视的主持人姐姐和无锡当地的 Rap 天团,各路整活层出不穷。现场颁发了「2023 年活力开源贡献者」和「2023 年生态项目」奖,咱们飞桨社区有 17 名开发者入选 🤩,同时拿到了生态项目奖哦 🥰,给各位优秀的贡献者和飞桨点赞 👍 ~

OS-Projects

OS-Contributors-01

OS-Contributors-02

OS-Contributors-03

最后展示一个大合照 🏆 ~ 2023 收获满满,2024 一定会更好!提前给大家拜个早年 🧧🧨

cups

',23),_=[g];function f(u,P,b,k,S,x){return a(),e("div",null,_)}const q=t(h,[["render",f]]);export{R as __pageData,q as default}; diff --git a/assets/posts_wuxi-kaifangyuanzi.md.BjTDfesd.lean.js b/assets/posts_wuxi-kaifangyuanzi.md.BjTDfesd.lean.js new file mode 100644 index 0000000..58296a7 --- /dev/null +++ b/assets/posts_wuxi-kaifangyuanzi.md.BjTDfesd.lean.js @@ -0,0 +1 @@ +import{_ as t,c as e,o as a,l as r}from"./chunks/framework.CEb3mtFd.js";const d="/assets/competition-roadshow.BPyvtSOq.jpeg",o="/assets/meng-speech.DgYTkpXv.jpeg",l="/assets/round-table.Bj71g6wR.jpeg",p="/assets/group-photo.thp-v6D1.jpeg",i="/assets/OS-Projects.Wxwhgkfx.jpeg",s="/assets/OS-Contributors-01.TDrl-t3l.jpeg",n="/assets/OS-Contributors-02.wAuNCrPo.jpeg",c="/assets/OS-Contributors-03.9OnUxDBJ.jpeg",m="/assets/cups.DUBobWYR.jpeg",R=JSON.parse('{"title":"飞桨开源社区参加开放原子开源大赛 & 开发者大会","description":"","frontmatter":{"title":"飞桨开源社区参加开放原子开源大赛 & 开发者大会","date":"2023-12-26T00:00:00.000Z","author":{"name":"梦师傅","github":"Ligoml"}},"headers":[],"relativePath":"posts/wuxi-kaifangyuanzi.md","filePath":"posts/wuxi-kaifangyuanzi.md"}'),h={name:"posts/wuxi-kaifangyuanzi.md"},g=r("",23),_=[g];function f(u,P,b,k,S,x){return a(),e("div",null,_)}const q=t(h,[["render",f]]);export{R as __pageData,q as default}; diff --git a/assets/posts_xdoctest-project.md.DIdZvN6i.js b/assets/posts_xdoctest-project.md.DIdZvN6i.js new file mode 100644 index 0000000..e89c6b9 --- /dev/null +++ b/assets/posts_xdoctest-project.md.DIdZvN6i.js @@ -0,0 +1 @@ +import{c as t,o as e,l as r}from"./chunks/framework.CEb3mtFd.js";const a="/assets/xdoctest-1.twGhXbsV.jpg",i="/assets/xdoctest-2.aPhS1ooI.jpg",o="/assets/xdoctest-3.Bmde-M0u.jpg",l="/assets/xdoctest-4.CQRxEsNO.jpg",n="/assets/xdoctest-5.DMtIpjJh.jpg",s="/assets/xdoctest-6.4nJubk8N.jpg",g="/assets/xdoctest-7.Ddmk4eg3.jpg",h="/assets/xdoctest-8.BJQ47NZd.jpg",d="/assets/xdoctest-9.Abp2_MFf.jpg",c="/assets/xdoctest-10.C7e6x3bs.jpg",p="/assets/xdoctest-11.B_U6cpOH.jpg",u="/assets/xdoctest-12.6U1ca7Vv.jpg",f=r('

【将 xdoctest 引入飞桨工作流】的项目总结。

将 xdoctest 引入飞桨工作流】 是第六届“中国软件开源创新大赛”开源任务挑战赛赛道——飞桨框架任务挑战赛的赛题之一(赛题五),由社区开发者顺师傅@megemini)主导,是 Paddle 社区迄今为止影响范围最大的开源活动 🎊。该项目规模极其庞大,涉及一千多个 API 示例的整合和数十万行代码的优化,由超过 20 名社区开发者共同参与完成。

本篇博客主要依据顺师傅的赛题答辩内容进行编写,从过去现在未来三个角度,对项目进行分析、总结和展望。

01 - 关于任务

文档是用户了解项目最主要的方式,而 API 文档更是承担了用户了解每个 API 使用方式的重要入口。Paddle 为上千个公开 API 提供了详尽的 API 文档,每个 API 都有对应的示例代码,以便用户能够最直观的了解 API 的使用方式。

但由于历史原因,Paddle 的 API 文档中的示例代码是直接使用 Python 代码块形式编写的,这使得我们无法对示例代码的输出进行自动化检查,从而无法保证展示给用户的示例代码的有效性,导致经常出现用户发现文档中的输出与实际运行结果不一致的情况。

过去 API 文档示例代码格式

而本任务,则是要求将 xdoctest 工具引入到 Paddle CI 检查流水线中,利用 xdoctest 能够自动执行示例代码,并对示例代码的输出进行检查的特性,对 Paddle API 文档中的示例代码进行检查,确保示例代码的输出结果与实际运行结果一致,从而提高 Paddle API 文档的质量。

文档是开发者接触 Paddle 的第一手学习资料,需要保证用户能够 快速、正确 地上手 Paddle 框架,代码示例的重要程度也就不言而喻。

能够引导用户学习飞桨官方文档,并直接获得使用相应 API 接口的能力。

提供给用户正确运行、结果符合预期的示例代码。

02 - 现有方案

过去 Paddle 的 API 文档示例代码,对于普通 Python 语句没有提示符要求,对于输出则使用 # 进行注释。

xdoctest-02

  • 需要用户自己区分普通注释与代码输出
  • 不符合 Python 开源项目里对可交互示例的实践和习惯
  • 代码检查不严格,只保证运行,不保证正确

xdoctest-03

Python 标准库中内置了 doctest 可用于示例代码的自动执行和检查。但 doctest 是使用正则表达式来解析示例代码部分的,这使得示例代码的编写必须遵循严格的格式要求。

xdoctest 是一个基于 AST 的 Python 示例代码自动执行和检查工具,相比 doctest,xdoctest 的示例代码格式要求更加宽松,xdoctest 作者在博客 Extending Python Doctests – xdoctest 详细阐述了这一点。

显然后者是更适合 Paddle 的需求的,因此我们选择将 xdoctest 作为引入 Paddle CI 检查流水线的基础工具。这里为什么说是基础工具呢?是因为在后期迭代开发过程中发现 xdoctest 本身也有很多不足,因此我们在 xdoctest 的基础上进行了大量的二次开发,以满足 Paddle 的需求。

03 - 挑战

>>> 可以预见的挑战

  • 有 800 万开发者每天都在学习、使用 Paddle 框架,xdoctest 的引入需要无缝切换
  • Paddle 框架包含 1400+ API,还涉及到版本更迭、API 迭代,框架庞大复杂
  • 由于深度学习特殊性,同一示例代码在不同设备环境(CPU、GPU)会有差异性,需要区别验证

>>> 项目的三个大坑

  • 历史包袱重
  • 项目管理难
  • 工程量巨大

01 - 项目分解

一切源于一场对设计文档(RFC)的讨论。

RFC 设计文档

在顺师傅和我们的交流中,共同抛出了相当多的问题进行讨论。这个阶段也遇到了项目的第一个大坑——历史包袱重

设计文档(抛开可以预见的那些挑战不说)
  • Paddle 代码和 docs 都有代码检查逻辑
  • 代码检查逻辑还不尽相同
  • Paddle 与 PyTorch 很多实现方式不一样
  • PyTorch 的检查方式并不完整
后知后觉
  • 文档中的示例代码未及时随着框架的演进和接口的的变化更新
  • 接口变动、逻辑变动
  • 与单元测试关注点不同,测试方案不同

经过细致的讨论和顺师傅对上述问题的梳理,逐渐理清了项目设计思路,并最终完成设计文档,正式启动项目。

  • 各方参与几十轮的讨论
  • 11470
  • 36
  • 2 个大版本,3 个小版本

在顺师傅完成项目拆解后,开始着手开发。此时遇到第二个大坑——项目管理难

项目 milestones

xdoctest 并不适用如 Paddle 此类庞大复杂的框架。

  • 【接口遍历不全】 对于全局命名等情况无能为力
  • 【检查环境混用】 不能隔离多个示例检查的逻辑
  • 【无数据类型检查】 不能比对浮点数、复数等情况
  • 【无法进行全局控制】 如 timeout,错误语句等
  • 针对【接口遍历不全】 此次任务沿用飞桨原有的接口遍历逻辑,将原有的 xdoctest 的检查逻辑进行拆分
  • 针对【检查环境混用】 此次任务利用多进程技术对执行环境进行隔离,进而防止环境污染等情况
  • 针对【无数据类型检查】 此次任务对 xdoctest 的检查逻辑进行 patch,从而可以比对整数、浮点数、复数等情况
  • 针对【无法进行全局控制】 引入全局指令、全局语句检查机制

进行重构,优化迁移环境

  • 全局指令转换
  • 抽象示例检查类
  • 解耦示例检查流程与检查类
  • 解耦示例检查结果
  • 日志级别分离

由于 Paddle 的公开 API 数量众多,且需要全量的优化对应文档的示例代码,所以在该阶段遇到第三个大坑——工程量巨大

因此,我们选择相信开源的力量,号召 Paddle 社区的伙伴一起参与进来!

  • 代码到文档全流程
  • 上千个 API
  • 数百个源文件
  • 数十万行代码
  • 已有 24 位开发者近 3 个月的贡献

02 - 里程碑

xdoctest-06

03 - 开源社区

飞桨快乐开源活动旨在鼓励更多的开发者参与到飞桨社区的开源建设中,帮助社区修复 bug 或贡献 feature,加入开源、共建飞桨。

在本赛题中,顺师傅发起了 2 个衍生的快乐开源任务,借助社区的力量来一起全量优化 Paddle 文档的示例代码。

修改目前 Paddle docs 中仍使用 code-block 的示例代码为 COPY-FROM docs#5957

中文文档示例代码全部以 COPY-FROM 的形式和英文保持一致

[xdoctest] 分批次修改已有代码的示例 #55629

修改已有示例以符合 Google Style样式

在开源任务二中,由于需要把控示例代码的修改效果,顺师傅也从开发者的身份逐渐转变成 Reviewer

  • 更关注用户的体验
  • 更关注代码的质量
  • 更清楚开发者的诉求
  • 熟悉 review 工作流
  • 任务拆解
    • 第一批:简单,开发者熟悉环境与流程
    • 第二批:复杂,涉及 CPU/GPU 环境等情况
    • 第三批:困难,涉及 C++、并行、静态图等
  • 阶段总结,问题反馈
  • 开发、打磨工具 convert_doctest

为了方便社区开发者完成示例代码的修改,顺师傅开发了 convert_doctest 辅助工具,能够实现:

  • 对示例代码进行初步转换 :自动修改示例格式,节省大量人工修改的时间。
  • 对修改后的示例代码进行本地检查 :不用等待 CI 的运行结果,本地即可验证与修改。

极大提升了社区开发者完成任务的效率。

convert_doctest 效果
  • 共有 24 位 开源开发者参与。
  • 涉及约 450 个 文件。
  • 涉及 数十万行 代码。
  • 已有约 150 个 PR 被合入。

>>> 回顾三个大坑

在项目的开发过程中,前文提到的三个大坑,也被顺师傅逐一击破。

xdoctest-10xdoctest-11xdoctest-12

01 - 任务总结

>>> 整体贡献

主线 代码检查特性的迁移 >>> 主要由个人独立完成。
支线 新旧示例代码的修改 >>> 主要由开源社区完成。

  • RFC《将 xdoctest 引入到飞桨框架工作流中》。
  • 完成飞桨框架使用 xdoctest 进行示例代码检查的切换。
  • 退场飞桨文档原有的示例代码检查。
  • 完成飞桨框架全部示例代码对新格式的切换。
  • 完成飞桨文档遗留 COPY-FROM 的切换。
  • 完成飞桨文档《开发 API Python 端》与《API 文档书写规范》的更新。
  • 完成飞桨文档官网对于新格式示例代码的兼容。
  • 开源社区任务一:修改目前 Paddle docs 中仍使用 code-block 的示例代码为 COPY-FROM:
    • 涉及 PR:23 个
    • 涉及文件:82 个
    • 开源贡献者:7 人
  • 开源社区任务二:xdoctest 分批次修改已有代码的示例:
    • 涉及 PR:123 个
    • 涉及文件:364 个
    • 开源贡献者:19 人

>>> 个人贡献

  • 调研分析、任务拆解、项目开发、代码 review。
  • RFC《将 xdoctest 引入到飞桨框架工作流中》
  • 完成飞桨框架使用 xdoctest 进行示例代码检查的切换
  • 退场飞桨文档原有的示例代码检查
  • 完成飞桨文档《开发 API Python 端》与《API 文档书写规范》的更新
  • 提交 PR:20 个
  • 开源社区 Review PR:59 个
  • 开发辅助工具 convert_doctest

>>> 个人收获

  • 开源协作,开发者 与 Reviewer 身份的转换
  • 学习飞桨,更全面、更深入的学习;学习的越多,需要学习的更多
  • 编程能力,更直接的需求反馈与实现
  • 开拓视野,开源参与者之广,人外有人

02 - 未来规划

>>> CONVERT_DOCTEST

  • 合入 Paddle、发布到 PyPI,回馈开源社区
  • 思考是否有工具可以取代 xdoctest?是否单独开发 doctest 工具?

03 - 开源贡献

感谢以下参与开源任务的开发者们~

>>> 开源任务一:修改中英文示例一致

@Ainavo@Li-fAngyU@Liyulingyue@RedContritio@enkilee@gouzil@jjyaoao

>>> 开源任务二:修改旧的示例代码

@AndSonder@Candy2Tang@Difers@DrRyanHuang@Kaedeharai@KongAKun@Liyulingyue@PommesPeter@SigureMo@enkilee@gouzil@jinyouzhi@liyongchao911@longranger2@ooooo-create@sunzhongkai588@whisky-12@yoyoIcy@yuchen202

>>> 飞桨工作人员

@SigureMo@sunzhongkai588@luotao1@jzhang533

',106),b=[f],q=JSON.parse('{"title":"项目收官|将 xdoctest 引入到飞桨框架工作流中","description":"","frontmatter":{"title":"项目收官|将 xdoctest 引入到飞桨框架工作流中","date":"2023-12-27T00:00:00.000Z","author":{"name":"孙师傅","github":"sunzhongkai588"},"co_authors":[{"name":"顺师傅","github":"megemini"}]},"headers":[],"relativePath":"posts/xdoctest-project.md","filePath":"posts/xdoctest-project.md"}'),_={name:"posts/xdoctest-project.md"},y=Object.assign(_,{setup(m){return(P,k)=>(e(),t("div",null,b))}});export{q as __pageData,y as default}; diff --git a/assets/posts_xdoctest-project.md.DIdZvN6i.lean.js b/assets/posts_xdoctest-project.md.DIdZvN6i.lean.js new file mode 100644 index 0000000..7462120 --- /dev/null +++ b/assets/posts_xdoctest-project.md.DIdZvN6i.lean.js @@ -0,0 +1 @@ +import{c as t,o as e,l as r}from"./chunks/framework.CEb3mtFd.js";const a="/assets/xdoctest-1.twGhXbsV.jpg",i="/assets/xdoctest-2.aPhS1ooI.jpg",o="/assets/xdoctest-3.Bmde-M0u.jpg",l="/assets/xdoctest-4.CQRxEsNO.jpg",n="/assets/xdoctest-5.DMtIpjJh.jpg",s="/assets/xdoctest-6.4nJubk8N.jpg",g="/assets/xdoctest-7.Ddmk4eg3.jpg",h="/assets/xdoctest-8.BJQ47NZd.jpg",d="/assets/xdoctest-9.Abp2_MFf.jpg",c="/assets/xdoctest-10.C7e6x3bs.jpg",p="/assets/xdoctest-11.B_U6cpOH.jpg",u="/assets/xdoctest-12.6U1ca7Vv.jpg",f=r("",106),b=[f],q=JSON.parse('{"title":"项目收官|将 xdoctest 引入到飞桨框架工作流中","description":"","frontmatter":{"title":"项目收官|将 xdoctest 引入到飞桨框架工作流中","date":"2023-12-27T00:00:00.000Z","author":{"name":"孙师傅","github":"sunzhongkai588"},"co_authors":[{"name":"顺师傅","github":"megemini"}]},"headers":[],"relativePath":"posts/xdoctest-project.md","filePath":"posts/xdoctest-project.md"}'),_={name:"posts/xdoctest-project.md"},y=Object.assign(_,{setup(m){return(P,k)=>(e(),t("div",null,b))}});export{q as __pageData,y as default}; diff --git a/assets/posts_xian-event.md.CNEXSNi8.js b/assets/posts_xian-event.md.CNEXSNi8.js new file mode 100644 index 0000000..05c1587 --- /dev/null +++ b/assets/posts_xian-event.md.CNEXSNi8.js @@ -0,0 +1 @@ +import{_ as e,c as r,o as t,l as a}from"./chunks/framework.CEb3mtFd.js";const n="/assets/xian-event-01.Bl9tVA4M.jpg",o="/assets/xian-event-02.Bfoq75hH.jpg",i="/assets/xian-event-03.l1r9R8wK.jpg",s="/assets/xian-event-04.D7GNRoue.jpg",h="/assets/xian-event-05.CC4ZiPOX.jpg",l="/assets/xian-event-06.BRqk--wM.jpg",v=JSON.parse('{"title":"飞桨开源社区参加中国开源软件创新大赛剪影","description":"","frontmatter":{"title":"飞桨开源社区参加中国开源软件创新大赛剪影","date":"2023-10-25T00:00:00.000Z","author":{"name":"Jun","github":"jzhang533"}},"headers":[],"relativePath":"posts/xian-event.md","filePath":"posts/xian-event.md"}'),g={name:"posts/xian-event.md"},p=a('

在中国计算机学会组织的中国软件开源创新大赛上,飞桨开源社区的全部比赛已经完成。恭喜以下获奖的同学:

飞桨开源社区有四名同学参加了中国计算机学会组织的中国软件开源创新大赛决赛,这里记录一下在西安参加活动时候的一些照片。大赛的决赛的结果在这里:第六届 CCF 开源创新大赛决赛结果通知

活动签到处

xian-event-01

@megemini 在做《将 xdoctest 引入到飞桨框架工作流中》的项目答辩。

xian-event-02

@qiuwenbogdut在做《实现飞桨框架动态图反向图的可视化》的项目答辩。 xian-event-03

@co63oc在做《PaddleScience 领域前沿论文复现》的项目答辩(远程接入,遗憾没见到真人)。 xian-event-04

@zrr1999在做《实现飞桨框架的 python level jit compiler》的项目答辩。 xian-event-05

梦师傅在跟顺师傅和詹师傅交流。

xian-event-06

',12),c=[p];function _(f,m,u,b,k,d){return t(),r("div",null,c)}const z=e(g,[["render",_]]);export{v as __pageData,z as default}; diff --git a/assets/posts_xian-event.md.CNEXSNi8.lean.js b/assets/posts_xian-event.md.CNEXSNi8.lean.js new file mode 100644 index 0000000..e05e53a --- /dev/null +++ b/assets/posts_xian-event.md.CNEXSNi8.lean.js @@ -0,0 +1 @@ +import{_ as e,c as r,o as t,l as a}from"./chunks/framework.CEb3mtFd.js";const n="/assets/xian-event-01.Bl9tVA4M.jpg",o="/assets/xian-event-02.Bfoq75hH.jpg",i="/assets/xian-event-03.l1r9R8wK.jpg",s="/assets/xian-event-04.D7GNRoue.jpg",h="/assets/xian-event-05.CC4ZiPOX.jpg",l="/assets/xian-event-06.BRqk--wM.jpg",v=JSON.parse('{"title":"飞桨开源社区参加中国开源软件创新大赛剪影","description":"","frontmatter":{"title":"飞桨开源社区参加中国开源软件创新大赛剪影","date":"2023-10-25T00:00:00.000Z","author":{"name":"Jun","github":"jzhang533"}},"headers":[],"relativePath":"posts/xian-event.md","filePath":"posts/xian-event.md"}'),g={name:"posts/xian-event.md"},p=a("",12),c=[p];function _(f,m,u,b,k,d){return t(),r("div",null,c)}const z=e(g,[["render",_]]);export{v as __pageData,z as default}; diff --git a/assets/posts_zhangyiqiao-story.md.DNR0hYA-.js b/assets/posts_zhangyiqiao-story.md.DNR0hYA-.js new file mode 100644 index 0000000..2ad5e28 --- /dev/null +++ b/assets/posts_zhangyiqiao-story.md.DNR0hYA-.js @@ -0,0 +1 @@ +import{c as t,o as i,l as o}from"./chunks/framework.CEb3mtFd.js";const s="/assets/zhangyiqiao-01.CoqpsD_Z.jpeg",e="/assets/zhangyiqiao-02.CMu3F1pB.jpeg",n="/assets/zhangyiqiao-03.BdZmFXia.jpeg",r="/assets/zhangyiqiao-04.DdgZgJtk.jpeg",a="/assets/zhangyiqiao-05.7wTCyzPp.jpeg",g="/assets/zhangyiqiao-06.CaD7ITDx.jpeg",p="/assets/zhangyiqiao-07.rpQ_Tu3F.jpeg",l="/assets/zhangyiqiao-08.DpkvL9rZ.jpeg",c=o('

格子衬衫 👕,黑框眼镜 👓,他就是上天钦定的程序员!他狂卷技术,热爱开源;他喜欢摸鱼 🐟,疯狂水群;他“厨艺精湛”,堪称当代厨神。严寒冬日,别人有女朋友温暖手心,而他把 🥤 优乐美捧在手心!凌晨就寝,别人躺平酝酿睡意,他靠咖啡 ☕️ 进入梦境!工作一年半,至今单身汉!他就是来自安徽的吃辣小趴菜——张一乔 😆!

一、张一乔专属定制海报

张师傅专属定制海报

张师傅注:我不会吉他 🎸,但是有一把!

二、采访内容

  1. 先介绍一下自己吧,张师傅!

    张师傅: 我是 96 年的,快三十岁了。感觉自己就是一个普普通通的,人到中年也没有女朋友的,独自一人在北京,住在一个小房子里(连个大阳台都没有)的可怜巴巴 🥺 的年轻人。而且,自己做饭还没有特别好吃,但还得自己做饭 😭。买的都是超市里一包一包的菜 🥬,一做就是两个人的饭,根本吃不完,然后剩菜又吃不下去·····大概这么个样子吧!

    张师傅注:我就像一整片沙滩上的一粒沙子,就很普通。可能比起其他沙子,更加适合在浪头飘摇而已!

    左为张师傅的自信照片,右为张师傅一整柜的格子衬衫
  2. 现在你是在北京做全栈程序员,一个人在北京习惯吗?北京和你的家乡安徽相比,你更想留在哪?为什么?

    张师傅: 首先,在北京不一定是全栈程序员,也有可能是全方位打杂小工 😣。然后和家乡相比那肯定是家乡好,但是当时还是阴差阳错选择来北京!现在很后悔,很想回家。也不是说北京压力大(因为既不买房子,又没有女朋友。每个月生活也挺简单的,就是交个房租,然后吃饭上班睡觉·····钱肯定是够花的!),只是我自己比较思乡,不想离开家乡!家乡并没有给我留下什么糟糕的印象,父母也还不错。所以比起在外面晃悠,自己还是更加愿意回到家乡!

  3. 你觉得程序员是一个怎样的工作?这份职业对你的生活中产生了什么影响?

    张师傅: 首先我不知道我自己是不是程序员。在公司,有什么活干什么活!然后工作给我产生的影响大概就是:打工后眼里失去了光!

    张师傅名言:公司是用来创造价值的地方,不是学习的地方!

    打工人精神状态表情包集 1
    打工人精神状态表情包集 2
  4. 当初在武汉完成硕士学位后,你谈到过有读博的想法,为什么最终又决定直接工作?

    张师傅: 因为我太弱小了,所以没有导师要我!要是读了博选择可能会多一些,可以选择创业之类的。

  5. 是什么时候开始接触到 Paddle 的呢 😂😂?

    张师傅: 硕士期间接触到的,当时闲的没事,打开百度搜了个东西。然后百度搜索引擎就安利了飞桨。

  6. 在 Paddle 社区,很多人称张师傅为“002”,这是为什么呢?你对于这个称呼有什么想法 💡 呢?

    张师傅: 因为我是第二个拿 Committer 身份的,所以叫 “002”!对于这个称呼我没有什么看法,只是一个称呼罢了(高冷脸.jpg)

  7. 社区里的开发者都觉得你在技术上很卷,那可以和我们分享一下你忙碌卷技术的日常么?

    张师傅: 我大概是早上 5 点钟起床 🛏️,磨磨蹭蹭到 6 点钟,然后出门吃一碗香喷喷的豆腐脑!之后回到家里,打开电脑耍会儿游戏,然后去公司上班,开启一天辛苦的忙碌的工作!四点半下班,当然和大多数打工人一样,有时候会加班。一般回到家后开始做饭(黑暗料理):有时煎个饼,有时来个煎饺!差不多下午六点就打开游戏 🎮,并且下定决心打完这一把后就开始工作,结果打完一把又一把,最终打到八九点钟的样子,打开群水两句,水完洗个澡就去睡觉!

  8. 悄悄问下,张师傅花这么多时间做开源,你老板不会生气吗?

    张师傅: 首先我的开源工作都是在下班时间完成的,与工作没关系,这属于生活!第二点呢,如果我的本职工作没有做好,在其他方面大放异彩,那我的老板肯定会生气!所以不要让老板知道我在干什么 🤫。只要让老板知道我有自己的生活,跟工作不冲突就可以了。

  9. 我了解到你是“飞桨开源之星”,也是“AI Studio 杰出创作者”,那么张师傅肯定有自己的开源心得。你认为对于刚来到社区的小伙伴,应该怎样学习才能和你一样逐渐成为技术大佬?

    张师傅: 其实没有什么技术路线。可能很多人都在问:“我看你代码写这么好,我怎么样才能像你一样?”这个东西没有任何的窍门可言。就比如你在学 C 的时候,成日成夜的把时间耗费在机房里,然后照着书本或者其他东西一个代码一个代码的敲。可能最开始 Debug 工具不会用,IDE 也不会用,也没有那么多经验,但是得这样一步步走过来。当有了这个基础后,可以去做一些其他事情(eg:修改 Paddle 底层框架),你可能又会发现特别困难,但是我们 Paddle 的快乐开源活动已经把项目拆解好了,你可以凭这些先入入门,上个手,然后一点点进步。

  10. 你曾说在社区中你交到了很多开发者朋友,那么哪位开发者令你印象深刻,或者说社区里哪位大佬让你觉得最不像程序员?

    张师傅: 每位开发者都印象深刻,嘿嘿,开始端水了!最印象深刻的当然是笠雨聆月,顶着一个女性的头像,然后 GitHub 还没有地铁站努力。最不像程序员的那必然是 001(@SigureMo),虽然他很社恐,头发还很长,但他在我心中就是腼腆的邻家大男孩,他的气质就是腼腆的邻家大男孩。

  11. 你是如何定义开源社区的?你认为你在开源社区中收获最大的是什么呢?

    张师傅: 开源社区就是一个开放的用于交流的平台。其实开源社区的定义大家已经给了太多了,我想补充的就是:开源社区从最早的 Linux 到其他一些软件其实都可以接触到!大家在社区无偿贡献代码或者知识,大家一起交流进步。最大的特点可能是公益性!

  12. 你在 Paddle 社区做过让你最有成就感的项目是哪个呢?为什么?

    张师傅: 在 Paddle 社区里几乎没有做过什么有成就感的项目。一直在烂尾,一直在捡别人剩饭,一直在拾人牙慧。

    编者注:张师傅可真是认真努力且谦虚的男人!

  13. 在水群时经常看到你说想找个女朋友。那么张师傅想找一个什么类型的呢?给我们描述一下吧 😁😆😂!

    张师傅: 我喜欢温柔一点的,儒雅随和的,不说脏话 🤬 的,遵守交通规则的(过马路看红绿灯 🚥)女孩子。她可以不遵守规则,像我一样。但是交通规则得遵守!最好有一头乌黑的长发 😁!

    张师傅注:谁家好人三十岁还没有女朋友啊~ 哇哇哇

  14. 张师傅在做饭方面颇有造诣,那么你是如何突发奇思妙想用最简单的食材烹饪出这一道道高级的美食呢?

    张师傅: 做饭心得就是每天睡觉前坚持学习烹饪技巧,比如打开哔哩哔哩观看 「世界美食 official」 的最新视频!我们要谦虚学习别人是如何把这种简单的食材最终做成高级的糊状物的!日常就喜欢观看印度美食的制作过程~~

    张师傅经常观看的B站up主
  15. 马上 2024 年了,可以分享一下新的一年里你有什么计划么?

    张师傅: 2024 年计划就是 2023 年的计划。女朋友这一条还是可以不完成!

    张师傅 2023 和 2024 的计划

三、生活中的点点滴滴——张师傅篇

左图:张师傅日常
张师傅的日常
右图:黑暗料理
张师傅的精心制作的黑暗料理

写在最后 💡

【开源江湖闲聊录】 是一项专门为 Paddle 社区的开发者打造的特色访谈栏目 📚。在这里,我们邀请到每一位别具一格且富有热情的开发者,通过文字或语音的方式进行深入采访 🎙️,探索并展现他们背后独一无二的故事,将他们的经历、见解和创意整理成精彩内容,呈现给整个社区。


',12),d=[c],m=JSON.parse('{"title":"【开源江湖闲聊录】社区最强水群人——张师傅的酸甜苦辣生活说","description":"","frontmatter":{"title":"【开源江湖闲聊录】社区最强水群人——张师傅的酸甜苦辣生活说","date":"2024-1-25","author":{"name":"文潇","github":"wenxiaohahaha"},"co_authors":[{"name":"孙钟恺","github":"sunzhongkai588"},{"name":"张一乔(张师傅)","github":"liyulingyue"}]},"headers":[],"relativePath":"posts/zhangyiqiao-story.md","filePath":"posts/zhangyiqiao-story.md"}'),u={name:"posts/zhangyiqiao-story.md"},q=Object.assign(u,{setup(f){return(h,_)=>(i(),t("div",null,d))}});export{m as __pageData,q as default}; diff --git a/assets/posts_zhangyiqiao-story.md.DNR0hYA-.lean.js b/assets/posts_zhangyiqiao-story.md.DNR0hYA-.lean.js new file mode 100644 index 0000000..cd11470 --- /dev/null +++ b/assets/posts_zhangyiqiao-story.md.DNR0hYA-.lean.js @@ -0,0 +1 @@ +import{c as t,o as i,l as o}from"./chunks/framework.CEb3mtFd.js";const s="/assets/zhangyiqiao-01.CoqpsD_Z.jpeg",e="/assets/zhangyiqiao-02.CMu3F1pB.jpeg",n="/assets/zhangyiqiao-03.BdZmFXia.jpeg",r="/assets/zhangyiqiao-04.DdgZgJtk.jpeg",a="/assets/zhangyiqiao-05.7wTCyzPp.jpeg",g="/assets/zhangyiqiao-06.CaD7ITDx.jpeg",p="/assets/zhangyiqiao-07.rpQ_Tu3F.jpeg",l="/assets/zhangyiqiao-08.DpkvL9rZ.jpeg",c=o("",12),d=[c],m=JSON.parse('{"title":"【开源江湖闲聊录】社区最强水群人——张师傅的酸甜苦辣生活说","description":"","frontmatter":{"title":"【开源江湖闲聊录】社区最强水群人——张师傅的酸甜苦辣生活说","date":"2024-1-25","author":{"name":"文潇","github":"wenxiaohahaha"},"co_authors":[{"name":"孙钟恺","github":"sunzhongkai588"},{"name":"张一乔(张师傅)","github":"liyulingyue"}]},"headers":[],"relativePath":"posts/zhangyiqiao-story.md","filePath":"posts/zhangyiqiao-story.md"}'),u={name:"posts/zhangyiqiao-story.md"},q=Object.assign(u,{setup(f){return(h,_)=>(i(),t("div",null,d))}});export{m as __pageData,q as default}; diff --git a/assets/posts_zheng-story.md.Ck4Zn1Rf.js b/assets/posts_zheng-story.md.Ck4Zn1Rf.js new file mode 100644 index 0000000..42e6827 --- /dev/null +++ b/assets/posts_zheng-story.md.Ck4Zn1Rf.js @@ -0,0 +1 @@ +import{M as i,_ as o}from"./chunks/MessageBox.BjkmF0_f.js";import{c as s,i as e,v as a,l as r,o as l,x as t,a as n}from"./chunks/framework.CEb3mtFd.js";const g="/assets/Captain-01.gy7CxJts.jpg",h="/assets/Captain-03.D6Fwywaf.jpg",p="/assets/Captain-05.B2PP1fn2.jpeg",u="/assets/Captain-04.DSnRKHge.jpeg",c="/assets/Captain-02.oqPjuBMJ.jpg",d="/assets/Captain-06.B04Ukp-4.jpg",b=r('

​集百家之阴阳,合一家之糟粕。好消息!好消息!自称 Paddle 社区“最想当 PM 的程序员” 、“Paddle 首席阴阳家”—— Zheng-bicheng,闪亮登场 🥳🎉🎉🎉。你想掌握最前沿的阴阳技巧么?你想成为和他一样优秀的开发者吗?你想和他一样眼神 👀 中透露着睿智的光芒,小脑袋瓜里装满各种各样的知识么?那就快来看看这篇博客吧!🌹

一、个人名片

Captain-01

by 郑师傅(Zheng-Bicheng

',4),f=n("br",null,null,-1),m=n("br",null,null,-1),_=r('
郑师傅吧龄

郑师傅注:提一嘴,我玩了 13.4 年贴吧,臊皮能力不足梦师傅十分之一,鬼知道这姐妹经历了啥!

编者注✍️:提到的梦师傅(@Ligoml)是我们飞桨社区非常优秀的美女产品经理 ❤️!!

二、采访内容

  1. 先介绍一下自己吧,郑师傅!

    郑师傅: 各位大佬好,我是郑必城(@Zheng-Bicheng)🐶🐶,开源社区的菜鸟一枚,毕业于普普通通的闽江学院。

  2. 大学时你的专业是人工智能,为什么当时选择这个专业?

    郑师傅: 其实我最开始学的是电子信息与工程,无奈于电路天赋极其有限,通宵 4 个晚上做了 13 块板子才搞出一个 5 倍放大电路,与此同时身边的资源大多都开始向 AI 转型,于是随大流转专业到了比较热门的人工智能专业。

  3. 在大学的四年,你学习了些什么技术?又是怎么精进你的技术的呢?

    郑师傅: 鉴于闽江学院给我画了 4 年大饼,迟迟升不上本一,我仅代表个人将其本降专,将其简称“闽带”。在闽带的 4 年生活里,承蒙老师关爱,我得以同时加入了软件和硬件的实验室。我的两位指导老师又刚好都是系主任,这就意味着我能比较自由的使用各种电子元器件以及超算,这让我在学习上有了极大的探索空间。软硬都有所了解后,技术栈也从常见的后端研发慢慢转成了嵌入式部署。

  4. 听说郑师傅现在在导师公司底下工作,是在哪里工作呢?具体工作是关于哪方面的?

    郑师傅: 目前我在福州凌智电子工作,公司业务主要是仪器仪表(高速信号采集)以及各种 Sensor 的开发。工作内容就比较杂了,小公司没有产品,人手也不足,因此一个对外的产品,我的工作内容覆盖了软件端产品设计,研发,测试三个环节。我在公司主要负责的业务是高速采集卡的上位机,各种模块的对外 SDK 开发以及 AI 边缘端计算项目后端框架开发。

  5. 作为一个 01 年的小社畜,平时工作忙么?加班多么 😂😂?

    郑师傅: 忙的时候忙,不忙的时候不忙。加班多的时候多,加班不多的时候少。

    编者注✍️:郑师傅是会总结的!!🤭

  6. 你对 Paddle 社区的理解是什么样的?你在 Paddle 社区,做过最有影响力的项目是什么?

    郑师傅: Paddle 社区给我的感觉就是包容性强。

    ​从实力上,不管你的实力是强是弱,在社区里都有属于你的位置,各种任务任你挑,研发大哥人也都很好,即使很忙也愿意抽时间出来和你讲思路讲方法。

    ​在 Paddle 社区里,我比较活跃的项目其实就是 FastDeploy。FD 的定位是端到端的部署框架,希望让即使是 AI 初学者的用户也能用极少的代码量跑通模型部署。我主要负责的部分都是和移植相关,涉及到的部分包括 Rockchip 推理后端的移植,几个社区 CV 模型的移植,类似人脸对齐这种后端算法的移植。

    ​要是提到影响力,FastDeploy 的定位其实就比较尴尬了。由于适配了非常多的底层推理框架,FD 内部为了兼容性是牺牲了一部分的性能的。从公司的角度看,对于小公司来说,用 FD 基本上会做一些魔改,来达到最优的性能(这也是后期我维护 FD 次数慢慢变少的原因,在我们公司内部,我基于 FD 做了大量的魔改,已经和现在的 FD 主分支几乎不兼容了);大公司有自己的高水平研发工程师,也不会去用 FD,因此 FD 的使用场景还是有一定的局限性的。

    ​从用户的角度看,对于学生这类 AI 部署水平较差的用户来说,FD 是相当友好的,毕竟几行代码就能搞定深度学习部署,用来做毕业设计再合适不过了;对于编程水平较高的研发工程师来说,FD 更多的还是作为一个项目推理框架的模版代码,各个开发者可以在这个模版上快速定制自己所需要的代码。

  7. 可以和我们讲讲你的开源故事么?期待 😚 期待~~~~

    郑师傅: 我第一次接触到 Paddle 开源社区是在 2022 年 Q3 的黑客松第三期活动。

    ​刚开始参加开源时,第一个带我的师傅是 001。谁能想到晚上 11 点,001 这个内向萌骚怪搁那滔滔不绝的教我怎么同步远程仓库代码,我搁那嘎嘎猛困,他搁那嘎嘎猛教。没办法,不能辜负大佬的一番好意,我只能被迫学习。学着学着,把自己的知识用到了开源里,还真一不小心就做出了黑客松的两道题,从此入门了开源。

    编者注✍️:黑客松是百度飞桨举办的深度学习领域编程活动,鼓励开发者了解与参与飞桨深度学习开源项目,做出自己的代码贡献。
    PPDE(Paddle Paddle Developers Experts):飞桨开发者技术专家。
    PFCC(Paddle Framework Contributor Club):飞桨框架贡献者俱乐部。

    ​刚开始做适配时,RK3588 的工具链还不完善,我苦于没办法和 RK 官方的人沟通,效率一直很低。但青姐这人主打就是一个给力,我真敢提代码,她真敢拉群,直接给我这个开源菜鸟拉到了 RK 的适配群里和 RK 的研发工程师真人 1V1 大战。有了 RK 工程师的支持,项目也就慢慢开始推进了。

    在持续将近一年的贡献后,不知不觉的,我这么个一心向钱看齐的人莫名其妙的就成为了仓库的维护者,参与起了和 RK 相关的维护工作。在青姐的支持下,我甚至还参加了 RK 的开发者大会。要知道,在前一年,我还是坐在讲台下听着 RK 工作人员演讲的开发者,第二年就借着 Paddle 的风到 RK 开发者大会上给讲台下的嘉宾讲 FastDeploy 了。

    上图为 RK 开发者大会的合照

    ​随后就是参加了新的黑客松,认识了 Arm 的 Liliya 姐。Liliya 姐在 Arm 领域给了我很多的帮助,在她的支持下,我了解了很多 Arm 相关的最新技术,也参与到了 Paddle 模型 -> Arm 虚拟硬件部署链路的移植工作中。在她的帮助下,我移植了 Paddle 的多个模型到 Arm 虚拟硬件上,然后就是参加了 Arm 虚拟硬件的小发布会,一不小心成为了 Arm Ambassadors,顺便蹭了她一顿饭。 ​

    上图为郑师傅和上文的 Liliya 姐
  8. 郑师傅做开源这么久了,现在开源对你来说是一个什么感觉?你觉得你热爱它么?那又是怎么体现你的这种感觉的?

    郑师傅: 咱主打一个真实。读书的时候,开源是我装逼的方式;工作以后,开源对我来说是生活的调剂品,在心有余力的时候是我放松时的选项之一。我很爱开源,开源既让我拿到了很多 Title,也让我学到很多东西,面子里子都赚到了。

  9. 你自诩为“Paddle 社区阴阳怪气第一人”(和阿梦实力相当),那你是如何把阴阳怪气这种 🥰 贱贱的说话方式使用的如此炉火纯青的?可以教教我们么?

    郑师傅: 我这么正直的人怎么会阴阳怪气呢?比起阴阳怪气和口嗨,李梦柳和神可比我强多了。至于练习阴阳怪气嘛,多亏了啵啵姐。世上本没有阴阳师,阴阳啵啵姐多了,也便成了阴阳师。

    编者注✍️:啵啵姐是指飞桨社区优优优秀的美女运营花花(@Tulip-hua)。

    梦师傅本人注✍️:郑必城根本不会阴阳怪气!

  10. 你口中的“神”是谁? 为什么称他为神呢?

    郑师傅: 神是衍哥,第一次把衍哥叫做神是和梦师傅打嘴炮的时候没过脑子说出来的话。但是后面了解到神的事迹以后,衍哥我只能说比神还神。

  11. 你有谈到想成为一位 PM,那可以和我们简单分享一下你的职业规划么?或者说:你想未来一年在职业上取得什么进展?🆕🆕

    郑师傅: 我职业规划基本上是:先当研发广泛学习,再当产品经理输出价值!

    ​在我的认知里 PM 的知识面首先是广,然后是深。带一个产品,我得懂需求;和研发吵架,我得懂代码大致的底层逻辑;对外输出,我得懂基本商业逻辑;产品的迭代,我得懂客户的工作流程。

    对应我的工作,看上去干的事情和 AI 没啥关系,实际上是 AI 落地的一整套的流程。我的工作涵盖了数据采集,数据标注和数据清洗,模型调参和训练以及模型部署。这几乎覆盖了边缘端 AI 部署的全场景。而其他知识,一般靠和大佬沟通,取长补短搞定。在工作以后,我定期的会去拜访一些上游链路的大佬,如某开发板的硬件负责人,某芯片厂商的事务负责人以及某产商的视觉算法负责人。和大佬沟通是我拓展视野和补充知识面的手段之一,毕竟人能坐到那个位置上,对某个方向一定是有自己的理解的。

    前段时间和百度某个产品已经聊过了。某法师说:"真正要做的事,连神明都不要说,不要告诉别人你的计划,让他们看结果。”对于我要做的事,一般是不立 Flag 的,这里就埋个伏笔。

  12. 相信你也接触到很多飞桨以及其他的 PM,哪位 PM 给你留下来最深的印象?哪位 PM 是你未来职业的模板?

    郑师傅: Paddle 的 PM 大佬们其实都很有特色也都给我留下挺深的印象。比如梦柳不但能力很强,嘴炮也很厉害,看上去很渣,其实比谁都纯;雷青姐经常工作到深夜,非常努力;军哥专业素养很高,表面上话不多像是个糙汉子,接触了以后让我感觉居然像个小文青;衍神表面看上去吊儿郎当的,实际上很强,对各种问题看的很透彻;孙哥表面看上去很能嘴,其实我觉得还有点内敛;佳维姐姐人非常漂亮,普通话也超级标准;凯哥居然能用英语和阿三交流的好好的。

    谁是我职业模版的话,我感觉我这 🐶 脑能把大家的优点全学会是不太可能的,但是都学个 10% 当个及格的 PM 还是有可能的

    左图为参观百度时小度拍的合照,右图为郑师傅最喜欢的喵喵喵雪糕
  13. 最后,你想对和你一样努力 💪 开源的开源者说些什么呢?

    郑师傅: 和张师傅(@liyulingyue)这群开源奋斗逼相比,我实在太摸鱼了。希望大家都能向张师傅学习,在开源中贡献自己的力量。

三、从你的全世界路过——郑师傅篇

​前几篇博客上都有板块谈大家对被采访者的印象,但是今天郑师傅想来个板块单独谈谈他对社区大佬的印象 🤩🤩🤩。由于在 Paddle 社区,大佬实在太多了,郑师傅就抽一部分大佬讲讲他对他们的印象。

001(@SigureMo)

我对 001 的第一印象就是代码能力很强,但是有点闷骚。作为带我入门的大佬,肯定是要感谢 001 的,因为 001 人实在太好了 ❤️,不光带我开源还带我“开原”,属于是工作生活两不误了。

应晟大佬@yingshengBD

应晟大佬是个很帅的糙汉子,刚认识他的时候给我的第一感觉就是相当的程序员,但是他参加直播的时候打理了一下,卧槽,嘎嘎帅啊。在我第一次参加黑客松的时候他给了我非常多的帮助,帮我积极协调了项目的各种进度内容,也让我了解到了一些职场相关的内容。

啵啵姐@Tulip-hua

原谅我管百度唯一指定童工叫姐。刚开始认识她的时候,她说别人叫她“芋泥妹” 👧,我想着我一 00 后也这么叫不是显得我太老了?所以叫她“啵啵姐”,后来发现大家都挺爱这么叫的。这位更是重量级,又能给我开源资源又能带我玩。世界可以没有耶路撒冷,但开源不能没有啵啵姐。

雷青大佬@leiqing1

雷青大佬在我参与开源的初期给了我很大很大的帮助,没有她做为桥梁我就没办法认识到那么多的百度研发工程师。雷青姐人也超级好,还记得她来福州的时候我请她吃饭,结账的时候她觉得不能让我一学生请客,把我手机藏起来买单,这才是神仙姐姐 🙍🏻‍♀️ 啊。算起来已经欠她两顿饭了,有机会一定要还了。

佳军大佬@jiangjiajun

蒋大佬的代码我只能说,牛逼,真他妈牛逼。人跟人的差距真大,一个在我看来很难的问题,他总是能一下子就找到关键点。在我开源生涯中他是各种指点,牛逼,真的牛逼。说起来还画了好多的饼给这位大佬,但是这些饼的工作量都有点大,最后大部分都慢慢不了了之了,现在正在慢慢捡起来做。

延君大佬@DefTruth

延君大佬人很热情,帮我审核了很多的代码,他不但在 coding 上给了我很大的帮助,还对我的职业生涯规划起了很大作用,在我两难的时候给了我很正确的建议。

梦柳姐@Ligoml

这位也是重量级,Paddle 除了神以外的嘴炮王。她在我这 Title 太多,包括但不限于我的 Github 头像拥有者、最帅猫拥有者、最肥猫拥有者、最傻猫拥有者。

孙哥@sunzhongkai588

一见如故,和我一样惨。我是扑克牌里的小王那孙哥就是扑克牌里的大王 🤡。

军哥@jzhang533

很感谢军哥帮忙推动了 Paddle 框架在 Arm 上的 whl 包的适配,没有军哥,Arm 虚拟硬件在百度云上的部署就没办法推动了,就是啥时候能上线 Paddle 官网就更好了。

衍哥(@blazingsiyan)

就一个字,神!

四、郑师傅的名言集

上图为郑师傅经典语录集

写在最后 💡

【开源江湖闲聊录】 是一项专门为 Paddle 社区的开发者打造的特色访谈栏目 📚。在这里,我们邀请到每一位别具一格且富有热情的开发者,通过文字或语音的方式进行深入采访 🎙️,探索并展现他们背后独一无二的故事,将他们的经历、见解和创意整理成精彩内容,呈现给整个社区。


',33),D=JSON.parse('{"title":"【开源江湖闲聊录】产品经理?程序员?郑师傅教你如何双双拿下❗","description":"","frontmatter":{"title":"【开源江湖闲聊录】产品经理?程序员?郑师傅教你如何双双拿下❗","date":"2023-12-23T00:00:00.000Z","author":{"name":"文潇","github":"wenxiaohahaha"},"co_authors":[{"name":"孙钟恺","github":"sunzhongkai588"},{"name":"郑必城(郑师傅)","github":"Zheng-Bicheng"}]},"headers":[],"relativePath":"posts/zheng-story.md","filePath":"posts/zheng-story.md"}'),P={name:"posts/zheng-story.md"},T=Object.assign(P,{setup(k){return(q,y)=>(l(),s("div",null,[b,e(i,null,{default:a(()=>[e(o,{name:"郑师傅",github:"Zheng-Bicheng"},{default:a(()=>[t(" 网络上躁皮不用多说,臊皮领域涉及抖音、微博、小红书、贴吧、知乎、B 站等多个社交软件。你问我躁皮能力有多强,我得问问你懂不懂活了 23 年,吧龄有 13.4 年的含金量(如下图)。人家小学玩泥巴,我的小学玩贴吧,抽象要从小培养。 "),f,t(" ​我涉及的游戏领域的主要是 Steam 上的 RPG 游戏和 Switch 上的战旗游戏。我的游戏方式讲究一个另辟蹊径,例如玩神界原罪的时候,大多数人都忙着通主线,我主打一个小偷玩法,所到之处能偷的东西全给我偷光了。与之相反的是,我在游戏里大偷四方,现实里却被称为“电瓶侠”。截止至目前为止,已经被偷了 20 颗电瓶,快说谢谢电瓶侠 😭。 "),m,t(" 顺便有没有大佬带我玩《双人成行》的,一缺一现在~ ")]),_:1})]),_:1}),_]))}});export{D as __pageData,T as default}; diff --git a/assets/posts_zheng-story.md.Ck4Zn1Rf.lean.js b/assets/posts_zheng-story.md.Ck4Zn1Rf.lean.js new file mode 100644 index 0000000..717b3c9 --- /dev/null +++ b/assets/posts_zheng-story.md.Ck4Zn1Rf.lean.js @@ -0,0 +1 @@ +import{M as i,_ as o}from"./chunks/MessageBox.BjkmF0_f.js";import{c as s,i as e,v as a,l as r,o as l,x as t,a as n}from"./chunks/framework.CEb3mtFd.js";const g="/assets/Captain-01.gy7CxJts.jpg",h="/assets/Captain-03.D6Fwywaf.jpg",p="/assets/Captain-05.B2PP1fn2.jpeg",u="/assets/Captain-04.DSnRKHge.jpeg",c="/assets/Captain-02.oqPjuBMJ.jpg",d="/assets/Captain-06.B04Ukp-4.jpg",b=r("",4),f=n("br",null,null,-1),m=n("br",null,null,-1),_=r("",33),D=JSON.parse('{"title":"【开源江湖闲聊录】产品经理?程序员?郑师傅教你如何双双拿下❗","description":"","frontmatter":{"title":"【开源江湖闲聊录】产品经理?程序员?郑师傅教你如何双双拿下❗","date":"2023-12-23T00:00:00.000Z","author":{"name":"文潇","github":"wenxiaohahaha"},"co_authors":[{"name":"孙钟恺","github":"sunzhongkai588"},{"name":"郑必城(郑师傅)","github":"Zheng-Bicheng"}]},"headers":[],"relativePath":"posts/zheng-story.md","filePath":"posts/zheng-story.md"}'),P={name:"posts/zheng-story.md"},T=Object.assign(P,{setup(k){return(q,y)=>(l(),s("div",null,[b,e(i,null,{default:a(()=>[e(o,{name:"郑师傅",github:"Zheng-Bicheng"},{default:a(()=>[t(" 网络上躁皮不用多说,臊皮领域涉及抖音、微博、小红书、贴吧、知乎、B 站等多个社交软件。你问我躁皮能力有多强,我得问问你懂不懂活了 23 年,吧龄有 13.4 年的含金量(如下图)。人家小学玩泥巴,我的小学玩贴吧,抽象要从小培养。 "),f,t(" ​我涉及的游戏领域的主要是 Steam 上的 RPG 游戏和 Switch 上的战旗游戏。我的游戏方式讲究一个另辟蹊径,例如玩神界原罪的时候,大多数人都忙着通主线,我主打一个小偷玩法,所到之处能偷的东西全给我偷光了。与之相反的是,我在游戏里大偷四方,现实里却被称为“电瓶侠”。截止至目前为止,已经被偷了 20 颗电瓶,快说谢谢电瓶侠 😭。 "),m,t(" 顺便有没有大佬带我玩《双人成行》的,一缺一现在~ ")]),_:1})]),_:1}),_]))}});export{D as __pageData,T as default}; diff --git a/assets/pp-coffee.B6ybez7E.jpeg b/assets/pp-coffee.B6ybez7E.jpeg new file mode 100644 index 0000000..0888ae1 Binary files /dev/null and b/assets/pp-coffee.B6ybez7E.jpeg differ diff --git a/assets/round-table.Bj71g6wR.jpeg b/assets/round-table.Bj71g6wR.jpeg new file mode 100644 index 0000000..8f3dcc1 Binary files /dev/null and b/assets/round-table.Bj71g6wR.jpeg differ diff --git a/assets/sanbu-01.BmLwkxl7.jpg b/assets/sanbu-01.BmLwkxl7.jpg new file mode 100644 index 0000000..763f0ca Binary files /dev/null and b/assets/sanbu-01.BmLwkxl7.jpg differ diff --git a/assets/sanbu-02.CbmTx2S8.jpg b/assets/sanbu-02.CbmTx2S8.jpg new file mode 100644 index 0000000..db509a1 Binary files /dev/null and b/assets/sanbu-02.CbmTx2S8.jpg differ diff --git a/assets/sanbu-03.CN4yarz2.jpg b/assets/sanbu-03.CN4yarz2.jpg new file mode 100644 index 0000000..000eba7 Binary files /dev/null and b/assets/sanbu-03.CN4yarz2.jpg differ diff --git a/assets/sanbu-04.xtcdIdF6.jpg b/assets/sanbu-04.xtcdIdF6.jpg new file mode 100644 index 0000000..48f3fa0 Binary files /dev/null and b/assets/sanbu-04.xtcdIdF6.jpg differ diff --git a/assets/sanbu-05.DXN_Ieqp.jpg b/assets/sanbu-05.DXN_Ieqp.jpg new file mode 100644 index 0000000..f31d5e7 Binary files /dev/null and b/assets/sanbu-05.DXN_Ieqp.jpg differ diff --git a/assets/sanbu-06.UwhvCp2U.jpg b/assets/sanbu-06.UwhvCp2U.jpg new file mode 100644 index 0000000..92f9dd2 Binary files /dev/null and b/assets/sanbu-06.UwhvCp2U.jpg differ diff --git a/assets/sanbu-07.DmjkGGLp.jpg b/assets/sanbu-07.DmjkGGLp.jpg new file mode 100644 index 0000000..a72c627 Binary files /dev/null and b/assets/sanbu-07.DmjkGGLp.jpg differ diff --git a/assets/sanbu-08.Ck6rEVYm.jpg b/assets/sanbu-08.Ck6rEVYm.jpg new file mode 100644 index 0000000..6b02a5e Binary files /dev/null and b/assets/sanbu-08.Ck6rEVYm.jpg differ diff --git a/assets/sanbu-09.Dddg5DQv.jpg b/assets/sanbu-09.Dddg5DQv.jpg new file mode 100644 index 0000000..3513988 Binary files /dev/null and b/assets/sanbu-09.Dddg5DQv.jpg differ diff --git a/assets/sanbu-10.CLzscM3v.jpg b/assets/sanbu-10.CLzscM3v.jpg new file mode 100644 index 0000000..db25ee3 Binary files /dev/null and b/assets/sanbu-10.CLzscM3v.jpg differ diff --git a/assets/sanbu-11.zJPpyF50.jpg b/assets/sanbu-11.zJPpyF50.jpg new file mode 100644 index 0000000..b0fa283 Binary files /dev/null and b/assets/sanbu-11.zJPpyF50.jpg differ diff --git a/assets/sanbu-12.4-hUXVF8.jpg b/assets/sanbu-12.4-hUXVF8.jpg new file mode 100644 index 0000000..71e5a10 Binary files /dev/null and b/assets/sanbu-12.4-hUXVF8.jpg differ diff --git a/assets/shun-01.CWHiLdW6.jpg b/assets/shun-01.CWHiLdW6.jpg new file mode 100644 index 0000000..0aa3736 Binary files /dev/null and b/assets/shun-01.CWHiLdW6.jpg differ diff --git a/assets/shun-02.D_d2jXpo.jpg b/assets/shun-02.D_d2jXpo.jpg new file mode 100644 index 0000000..be46d7d Binary files /dev/null and b/assets/shun-02.D_d2jXpo.jpg differ diff --git a/assets/shun-03.DUtFi7rq.jpg b/assets/shun-03.DUtFi7rq.jpg new file mode 100644 index 0000000..41d3ca0 Binary files /dev/null and b/assets/shun-03.DUtFi7rq.jpg differ diff --git a/assets/shun-04.CQ3SJyp9.jpg b/assets/shun-04.CQ3SJyp9.jpg new file mode 100644 index 0000000..9c6f282 Binary files /dev/null and b/assets/shun-04.CQ3SJyp9.jpg differ diff --git a/assets/shun-05.BnKWAdLF.jpg b/assets/shun-05.BnKWAdLF.jpg new file mode 100644 index 0000000..609fe30 Binary files /dev/null and b/assets/shun-05.BnKWAdLF.jpg differ diff --git a/assets/starter-01.BQhXy2TN.png b/assets/starter-01.BQhXy2TN.png new file mode 100644 index 0000000..bb7d0be Binary files /dev/null and b/assets/starter-01.BQhXy2TN.png differ diff --git a/assets/starter-02.Bf2WfiHX.png b/assets/starter-02.Bf2WfiHX.png new file mode 100644 index 0000000..b38da10 Binary files /dev/null and b/assets/starter-02.Bf2WfiHX.png differ diff --git a/assets/starter-03.BOZeuzfN.png b/assets/starter-03.BOZeuzfN.png new file mode 100644 index 0000000..4dbf4a2 Binary files /dev/null and b/assets/starter-03.BOZeuzfN.png differ diff --git a/assets/starter-04.zLBRTWXy.png b/assets/starter-04.zLBRTWXy.png new file mode 100644 index 0000000..11299d8 Binary files /dev/null and b/assets/starter-04.zLBRTWXy.png differ diff --git a/assets/starter-05.B8V6TaI0.png b/assets/starter-05.B8V6TaI0.png new file mode 100644 index 0000000..dfdca45 Binary files /dev/null and b/assets/starter-05.B8V6TaI0.png differ diff --git a/assets/starter-06.CtTR9ub7.png b/assets/starter-06.CtTR9ub7.png new file mode 100644 index 0000000..5c6de61 Binary files /dev/null and b/assets/starter-06.CtTR9ub7.png differ diff --git a/assets/starter-07.CmzgjHu_.png b/assets/starter-07.CmzgjHu_.png new file mode 100644 index 0000000..25f98de Binary files /dev/null and b/assets/starter-07.CmzgjHu_.png differ diff --git a/assets/starter-08.BWHELzJ3.png b/assets/starter-08.BWHELzJ3.png new file mode 100644 index 0000000..33506d5 Binary files /dev/null and b/assets/starter-08.BWHELzJ3.png differ diff --git a/assets/starter-11.jq6tV3JA.png b/assets/starter-11.jq6tV3JA.png new file mode 100644 index 0000000..85b3a3d Binary files /dev/null and b/assets/starter-11.jq6tV3JA.png differ diff --git a/assets/style.CY_1Pjyc.css b/assets/style.CY_1Pjyc.css new file mode 100644 index 0000000..64180b0 --- /dev/null +++ b/assets/style.CY_1Pjyc.css @@ -0,0 +1 @@ +*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]{display:none}*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }.prose{color:var(--tw-prose-body);max-width:65ch}.prose :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em}.prose :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-lead);font-size:1.25em;line-height:1.6;margin-top:1.2em;margin-bottom:1.2em}.prose :where(a):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-links);text-decoration:underline;font-weight:500}.prose :where(strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-bold);font-weight:600}.prose :where(a strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(blockquote strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(thead th strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal;margin-top:1.25em;margin-bottom:1.25em;padding-left:1.625em}.prose :where(ol[type=A]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=A s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=I]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type=I s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type="1"]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal}.prose :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:disc;margin-top:1.25em;margin-bottom:1.25em;padding-left:1.625em}.prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{font-weight:400;color:var(--tw-prose-counters)}.prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{color:var(--tw-prose-bullets)}.prose :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;margin-top:1.25em}.prose :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){border-color:var(--tw-prose-hr);border-top-width:1px;margin-top:3em;margin-bottom:3em}.prose :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:500;font-style:italic;color:var(--tw-prose-quotes);border-left-width:.25rem;border-left-color:var(--tw-prose-quote-borders);quotes:"“""”""‘""’";margin-top:1.6em;margin-bottom:1.6em;padding-left:1em}.prose :where(blockquote p:first-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:open-quote}.prose :where(blockquote p:last-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:close-quote}.prose :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:800;font-size:2.25em;margin-top:0;margin-bottom:.8888889em;line-height:1.1111111}.prose :where(h1 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:900;color:inherit}.prose :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:700;font-size:1.5em;margin-top:2em;margin-bottom:1em;line-height:1.3333333}.prose :where(h2 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:800;color:inherit}.prose :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;font-size:1.25em;margin-top:1.6em;margin-bottom:.6em;line-height:1.6}.prose :where(h3 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:700;color:inherit}.prose :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;margin-top:1.5em;margin-bottom:.5em;line-height:1.5}.prose :where(h4 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:700;color:inherit}.prose :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){display:block;margin-top:2em;margin-bottom:2em}.prose :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:500;font-family:inherit;color:var(--tw-prose-kbd);box-shadow:0 0 0 1px rgb(var(--tw-prose-kbd-shadows) / 10%),0 3px rgb(var(--tw-prose-kbd-shadows) / 10%);font-size:.875em;border-radius:.3125rem;padding:.1875em .375em}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-code);font-weight:600;font-size:.875em}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:"`"}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:"`"}.prose :where(a code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(h1 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.875em}.prose :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.9em}.prose :where(h4 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(blockquote code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(thead th code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-pre-code);background-color:var(--tw-prose-pre-bg);overflow-x:auto;font-weight:400;font-size:.875em;line-height:1.7142857;margin-top:1.7142857em;margin-bottom:1.7142857em;border-radius:.375rem;padding:.8571429em 1.1428571em}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)){background-color:transparent;border-width:0;border-radius:0;padding:0;font-weight:inherit;color:inherit;font-size:inherit;font-family:inherit;line-height:inherit}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:none}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:none}.prose :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){width:100%;table-layout:auto;text-align:left;margin-top:2em;margin-bottom:2em;font-size:.875em;line-height:1.7142857}.prose :where(thead):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-th-borders)}.prose :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;vertical-align:bottom;padding-right:.5714286em;padding-bottom:.5714286em;padding-left:.5714286em}.prose :where(tbody tr):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-td-borders)}.prose :where(tbody tr:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:0}.prose :where(tbody td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:baseline}.prose :where(tfoot):not(:where([class~=not-prose],[class~=not-prose] *)){border-top-width:1px;border-top-color:var(--tw-prose-th-borders)}.prose :where(tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:top}.prose :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-captions);font-size:.875em;line-height:1.4285714;margin-top:.8571429em}.prose{--tw-prose-body: #374151;--tw-prose-headings: #111827;--tw-prose-lead: #4b5563;--tw-prose-links: #111827;--tw-prose-bold: #111827;--tw-prose-counters: #6b7280;--tw-prose-bullets: #d1d5db;--tw-prose-hr: #e5e7eb;--tw-prose-quotes: #111827;--tw-prose-quote-borders: #e5e7eb;--tw-prose-captions: #6b7280;--tw-prose-kbd: #111827;--tw-prose-kbd-shadows: 17 24 39;--tw-prose-code: #111827;--tw-prose-pre-code: #e5e7eb;--tw-prose-pre-bg: #1f2937;--tw-prose-th-borders: #d1d5db;--tw-prose-td-borders: #e5e7eb;--tw-prose-invert-body: #d1d5db;--tw-prose-invert-headings: #fff;--tw-prose-invert-lead: #9ca3af;--tw-prose-invert-links: #fff;--tw-prose-invert-bold: #fff;--tw-prose-invert-counters: #9ca3af;--tw-prose-invert-bullets: #4b5563;--tw-prose-invert-hr: #374151;--tw-prose-invert-quotes: #f3f4f6;--tw-prose-invert-quote-borders: #374151;--tw-prose-invert-captions: #9ca3af;--tw-prose-invert-kbd: #fff;--tw-prose-invert-kbd-shadows: 255 255 255;--tw-prose-invert-code: #fff;--tw-prose-invert-pre-code: #d1d5db;--tw-prose-invert-pre-bg: rgb(0 0 0 / 50%);--tw-prose-invert-th-borders: #4b5563;--tw-prose-invert-td-borders: #374151;font-size:1rem;line-height:1.75}.prose :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;margin-bottom:.5em}.prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-left:.375em}.prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-left:.375em}.prose :where(.prose>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.prose :where(.prose>ul>li>*:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ul>li>*:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose :where(.prose>ol>li>*:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ol>li>*:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.prose :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em}.prose :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;padding-left:1.625em}.prose :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-left:0}.prose :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-right:0}.prose :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding:.5714286em}.prose :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-left:0}.prose :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-right:0}.prose :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(.prose>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(.prose>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.fixed{position:fixed}.m-0{margin:0}.mx-auto{margin-left:auto;margin-right:auto}.\!mt-0{margin-top:0!important}.mb-3{margin-bottom:.75rem}.ml-10{margin-left:2.5rem}.ml-2{margin-left:.5rem}.mr-10{margin-right:2.5rem}.mr-2{margin-right:.5rem}.block{display:block}.inline-block{display:inline-block}.flex{display:flex}.table{display:table}.hidden{display:none}.h-10{height:2.5rem}.min-h-screen{min-height:100vh}.w-10{width:2.5rem}.max-w-3xl{max-width:48rem}.max-w-none{max-width:none}.flex-row-reverse{flex-direction:row-reverse}.flex-col{flex-direction:column}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(.5rem * var(--tw-space-x-reverse));margin-left:calc(.5rem * calc(1 - var(--tw-space-x-reverse)))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.25rem * var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem * var(--tw-space-y-reverse))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse: 0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse))}.divide-gray-200>:not([hidden])~:not([hidden]){--tw-divide-opacity: 1;border-color:rgb(229 231 235 / var(--tw-divide-opacity))}.whitespace-nowrap{white-space:nowrap}.rounded-full{border-radius:9999px}.rounded-md{border-radius:.375rem}.border{border-width:1px}.bg-green-200{--tw-bg-opacity: 1;background-color:rgb(187 247 208 / var(--tw-bg-opacity))}.bg-green-700{--tw-bg-opacity: 1;background-color:rgb(21 128 61 / var(--tw-bg-opacity))}.bg-slate-200{--tw-bg-opacity: 1;background-color:rgb(226 232 240 / var(--tw-bg-opacity))}.p-0{padding:0}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.py-10{padding-top:2.5rem;padding-bottom:2.5rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-8{padding-top:2rem;padding-bottom:2rem}.pb-10{padding-bottom:2.5rem}.pb-16{padding-bottom:4rem}.pb-8{padding-bottom:2rem}.pl-10{padding-left:2.5rem}.pt-10{padding-top:2.5rem}.pt-6{padding-top:1.5rem}.pt-8{padding-top:2rem}.text-center{text-align:center}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-extrabold{font-weight:800}.font-medium{font-weight:500}.uppercase{text-transform:uppercase}.leading-5{line-height:1.25rem}.leading-6{line-height:1.5rem}.leading-7{line-height:1.75rem}.leading-8{line-height:2rem}.leading-9{line-height:2.25rem}.tracking-tight{letter-spacing:-.025em}.tracking-wide{letter-spacing:.025em}.text-gray-500{--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity))}.text-gray-900{--tw-text-opacity: 1;color:rgb(17 24 39 / var(--tw-text-opacity))}.text-green-300{--tw-text-opacity: 1;color:rgb(134 239 172 / var(--tw-text-opacity))}.text-green-700{--tw-text-opacity: 1;color:rgb(21 128 61 / var(--tw-text-opacity))}.text-neutral-500{--tw-text-opacity: 1;color:rgb(115 115 115 / var(--tw-text-opacity))}.text-red-600{--tw-text-opacity: 1;color:rgb(220 38 38 / var(--tw-text-opacity))}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.outline{outline-style:solid}.outline-green-700{outline-color:#15803d}:root{--c-brand: #3eaf7c;--c-brand-light: #4abf8a}nav img{vertical-align:middle}p img{margin:0 auto}.prose hr{border-top:1px solid #e5e7eb}.link{color:var(--c-brand)}.link:hover{color:var(--c-brand-light)}.header-anchor{display:none}.token.comment,.token.block-comment,.token.prolog,.token.doctype,.token.cdata{color:#999}.token.punctuation{color:#ccc}.token.tag,.token.attr-name,.token.namespace,.token.deleted{color:#e2777a}.token.function-name{color:#6196cc}.token.boolean,.token.number,.token.function{color:#f08d49}.token.property,.token.class-name,.token.constant,.token.symbol{color:#f8c555}.token.selector,.token.important,.token.atrule,.token.keyword,.token.builtin{color:#cc99cd}.token.string,.token.char,.token.attr-value,.token.regex,.token.variable{color:#7ec699}.token.operator,.token.entity,.token.url{color:#67cdcc}.token.important,.token.bold{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.token.inserted{color:#67cdcc}button.copy{display:none}span.lang{position:absolute;right:.5em;font-size:.75em;color:#999;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.custom-block{margin:28px 0;padding:0 24px 2px;border-radius:8px;overflow-x:auto;position:relative;font-size:14px;line-height:1.3;font-weight:500;color:#444;background-color:#f9f9f9}.custom-block .custom-block-title{margin-bottom:8px;font-size:15px;font-weight:700}.custom-block.tip{border:1px solid #42b883}.custom-block.tip:before{color:#42b883}@media (prefers-color-scheme: dark){.dark\:prose-invert{--tw-prose-body: var(--tw-prose-invert-body);--tw-prose-headings: var(--tw-prose-invert-headings);--tw-prose-lead: var(--tw-prose-invert-lead);--tw-prose-links: var(--tw-prose-invert-links);--tw-prose-bold: var(--tw-prose-invert-bold);--tw-prose-counters: var(--tw-prose-invert-counters);--tw-prose-bullets: var(--tw-prose-invert-bullets);--tw-prose-hr: var(--tw-prose-invert-hr);--tw-prose-quotes: var(--tw-prose-invert-quotes);--tw-prose-quote-borders: var(--tw-prose-invert-quote-borders);--tw-prose-captions: var(--tw-prose-invert-captions);--tw-prose-kbd: var(--tw-prose-invert-kbd);--tw-prose-kbd-shadows: var(--tw-prose-invert-kbd-shadows);--tw-prose-code: var(--tw-prose-invert-code);--tw-prose-pre-code: var(--tw-prose-invert-pre-code);--tw-prose-pre-bg: var(--tw-prose-invert-pre-bg);--tw-prose-th-borders: var(--tw-prose-invert-th-borders);--tw-prose-td-borders: var(--tw-prose-invert-td-borders)}}.hover\:text-gray-700:hover{--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity))}.hover\:outline:hover{outline-style:solid}@media (min-width: 640px){.sm\:inline{display:inline}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:text-4xl{font-size:2.25rem;line-height:2.5rem}.sm\:leading-10{line-height:2.5rem}}@media (min-width: 768px){.md\:inline{display:inline}.md\:flex-row{flex-direction:row}.md\:justify-center{justify-content:center}.md\:space-x-12>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(3rem * var(--tw-space-x-reverse));margin-left:calc(3rem * calc(1 - var(--tw-space-x-reverse)))}.md\:space-y-0>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(0px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0px * var(--tw-space-y-reverse))}.md\:space-y-5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.25rem * var(--tw-space-y-reverse))}.md\:pl-0{padding-left:0}.md\:text-5xl{font-size:3rem;line-height:1}.md\:text-6xl{font-size:3.75rem;line-height:1}}@media (min-width: 1280px){.xl\:col-span-3{grid-column:span 3 / span 3}.xl\:col-start-1{grid-column-start:1}.xl\:row-span-2{grid-row:span 2 / span 2}.xl\:row-start-2{grid-row-start:2}.xl\:block{display:block}.xl\:grid{display:grid}.xl\:max-w-5xl{max-width:64rem}.xl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.xl\:items-baseline{align-items:baseline}.xl\:gap-x-10{column-gap:2.5rem}.xl\:space-x-0>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(0px * var(--tw-space-x-reverse));margin-left:calc(0px * calc(1 - var(--tw-space-x-reverse)))}.xl\:space-y-0>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(0px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0px * var(--tw-space-y-reverse))}.xl\:space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(2rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2rem * var(--tw-space-y-reverse))}.xl\:divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse: 0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse))}.xl\:divide-y-0>:not([hidden])~:not([hidden]){--tw-divide-y-reverse: 0;border-top-width:calc(0px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(0px * var(--tw-divide-y-reverse))}.xl\:divide-gray-200>:not([hidden])~:not([hidden]){--tw-divide-opacity: 1;border-color:rgb(229 231 235 / var(--tw-divide-opacity))}.xl\:border-b{border-bottom-width:1px}.xl\:border-gray-200{--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity))}.xl\:px-0{padding-left:0;padding-right:0}.xl\:pb-0{padding-bottom:0}.xl\:pb-10{padding-bottom:2.5rem}.xl\:pb-20{padding-bottom:5rem}.xl\:pt-11{padding-top:2.75rem}}@media (prefers-color-scheme: dark){.dark\:divide-slate-200\/5>:not([hidden])~:not([hidden]){border-color:#e2e8f00d}.dark\:bg-green-700{--tw-bg-opacity: 1;background-color:rgb(21 128 61 / var(--tw-bg-opacity))}.dark\:bg-neutral-900{--tw-bg-opacity: 1;background-color:rgb(23 23 23 / var(--tw-bg-opacity))}.dark\:bg-zinc-700{--tw-bg-opacity: 1;background-color:rgb(63 63 70 / var(--tw-bg-opacity))}.dark\:text-gray-300{--tw-text-opacity: 1;color:rgb(209 213 219 / var(--tw-text-opacity))}.dark\:text-green-300{--tw-text-opacity: 1;color:rgb(134 239 172 / var(--tw-text-opacity))}.dark\:text-neutral-400{--tw-text-opacity: 1;color:rgb(163 163 163 / var(--tw-text-opacity))}.dark\:text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity))}.dark\:hover\:text-gray-200:hover{--tw-text-opacity: 1;color:rgb(229 231 235 / var(--tw-text-opacity))}@media (min-width: 1280px){.dark\:xl\:divide-slate-200\/5>:not([hidden])~:not([hidden]){border-color:#e2e8f00d}.dark\:xl\:border-slate-200\/5{border-color:#e2e8f00d}}}table{display:block;width:100%;width:max-content;max-width:100%;overflow:auto}div{word-wrap:break-word}.pwa-toast{position:fixed;right:0;bottom:0;margin:16px;padding:12px;border:1px solid #8885;border-radius:4px;z-index:100;text-align:left;box-shadow:3px 4px 5px #8885;background-color:#fff}.pwa-toast #pwa-message{margin-bottom:8px}.pwa-toast button{border:1px solid #8885;outline:none;margin-right:5px;border-radius:2px;padding:3px 10px}figure{text-align:center}figcaption{color:orange;border-bottom:1px solid #d9d9d9;display:inline-block;color:#999;padding:2px} diff --git a/assets/sun_host.BI4VmHmn.jpg b/assets/sun_host.BI4VmHmn.jpg new file mode 100644 index 0000000..2642302 Binary files /dev/null and b/assets/sun_host.BI4VmHmn.jpg differ diff --git a/assets/tao-01.BX6ijUAN.jpeg b/assets/tao-01.BX6ijUAN.jpeg new file mode 100644 index 0000000..587f2f3 Binary files /dev/null and b/assets/tao-01.BX6ijUAN.jpeg differ diff --git a/assets/tao-02.BUnT8yba.jpeg b/assets/tao-02.BUnT8yba.jpeg new file mode 100644 index 0000000..b430796 Binary files /dev/null and b/assets/tao-02.BUnT8yba.jpeg differ diff --git a/assets/tao-03.CuBFfcLy.jpeg b/assets/tao-03.CuBFfcLy.jpeg new file mode 100644 index 0000000..c0767e6 Binary files /dev/null and b/assets/tao-03.CuBFfcLy.jpeg differ diff --git a/assets/tao-04.V71B6Cdn.jpeg b/assets/tao-04.V71B6Cdn.jpeg new file mode 100644 index 0000000..7653d13 Binary files /dev/null and b/assets/tao-04.V71B6Cdn.jpeg differ diff --git a/assets/tao-05.P2XMQFEu.jpeg b/assets/tao-05.P2XMQFEu.jpeg new file mode 100644 index 0000000..26dcad2 Binary files /dev/null and b/assets/tao-05.P2XMQFEu.jpeg differ diff --git a/assets/tao-06.CAhJU0ix.jpeg b/assets/tao-06.CAhJU0ix.jpeg new file mode 100644 index 0000000..ba8554d Binary files /dev/null and b/assets/tao-06.CAhJU0ix.jpeg differ diff --git a/assets/tao-07.TWwMfHJ4.jpeg b/assets/tao-07.TWwMfHJ4.jpeg new file mode 100644 index 0000000..717d32f Binary files /dev/null and b/assets/tao-07.TWwMfHJ4.jpeg differ diff --git a/assets/tao-08.BKQPDZFR.jpeg b/assets/tao-08.BKQPDZFR.jpeg new file mode 100644 index 0000000..8e6598f Binary files /dev/null and b/assets/tao-08.BKQPDZFR.jpeg differ diff --git a/assets/tao-09.DHjwEJQm.jpeg b/assets/tao-09.DHjwEJQm.jpeg new file mode 100644 index 0000000..dfc6a5f Binary files /dev/null and b/assets/tao-09.DHjwEJQm.jpeg differ diff --git a/assets/tao-10.D1eqPGHg.jpeg b/assets/tao-10.D1eqPGHg.jpeg new file mode 100644 index 0000000..7e5e8f0 Binary files /dev/null and b/assets/tao-10.D1eqPGHg.jpeg differ diff --git a/assets/tao-11.Bt1BpI2J.jpeg b/assets/tao-11.Bt1BpI2J.jpeg new file mode 100644 index 0000000..0971641 Binary files /dev/null and b/assets/tao-11.Bt1BpI2J.jpeg differ diff --git a/assets/tao-12.CqVYWYYD.jpeg b/assets/tao-12.CqVYWYYD.jpeg new file mode 100644 index 0000000..2b9fd01 Binary files /dev/null and b/assets/tao-12.CqVYWYYD.jpeg differ diff --git a/assets/tao-13.Bm_8HEqz.jpeg b/assets/tao-13.Bm_8HEqz.jpeg new file mode 100644 index 0000000..eb74b49 Binary files /dev/null and b/assets/tao-13.Bm_8HEqz.jpeg differ diff --git a/assets/tao-14.LNcnxsAv.jpeg b/assets/tao-14.LNcnxsAv.jpeg new file mode 100644 index 0000000..efd55e7 Binary files /dev/null and b/assets/tao-14.LNcnxsAv.jpeg differ diff --git a/assets/tianshuishifan.DkDfK8bz.jpg b/assets/tianshuishifan.DkDfK8bz.jpg new file mode 100644 index 0000000..bfe385b Binary files /dev/null and b/assets/tianshuishifan.DkDfK8bz.jpg differ diff --git a/assets/track-1.92wc2X0b.jpg b/assets/track-1.92wc2X0b.jpg new file mode 100644 index 0000000..7f41784 Binary files /dev/null and b/assets/track-1.92wc2X0b.jpg differ diff --git a/assets/track-2.CNxDMruG.jpg b/assets/track-2.CNxDMruG.jpg new file mode 100644 index 0000000..f6a14b3 Binary files /dev/null and b/assets/track-2.CNxDMruG.jpg differ diff --git a/assets/track-3.B0IR02Ux.jpg b/assets/track-3.B0IR02Ux.jpg new file mode 100644 index 0000000..661a352 Binary files /dev/null and b/assets/track-3.B0IR02Ux.jpg differ diff --git a/assets/wangxin-01.Hz-UX5vs.jpeg b/assets/wangxin-01.Hz-UX5vs.jpeg new file mode 100644 index 0000000..2072cf0 Binary files /dev/null and b/assets/wangxin-01.Hz-UX5vs.jpeg differ diff --git a/assets/wangxin-02.BGcXQipn.jpeg b/assets/wangxin-02.BGcXQipn.jpeg new file mode 100644 index 0000000..5960a35 Binary files /dev/null and b/assets/wangxin-02.BGcXQipn.jpeg differ diff --git a/assets/wangxin-03.CAFEHiKf.jpeg b/assets/wangxin-03.CAFEHiKf.jpeg new file mode 100644 index 0000000..3ece174 Binary files /dev/null and b/assets/wangxin-03.CAFEHiKf.jpeg differ diff --git a/assets/wangxin-04.DPt9W4dS.jpeg b/assets/wangxin-04.DPt9W4dS.jpeg new file mode 100644 index 0000000..1d5622f Binary files /dev/null and b/assets/wangxin-04.DPt9W4dS.jpeg differ diff --git a/assets/wangxin-05.U63PCqJk.jpeg b/assets/wangxin-05.U63PCqJk.jpeg new file mode 100644 index 0000000..218e0f2 Binary files /dev/null and b/assets/wangxin-05.U63PCqJk.jpeg differ diff --git a/assets/wangxin-06.muvimoV2.jpeg b/assets/wangxin-06.muvimoV2.jpeg new file mode 100644 index 0000000..5324135 Binary files /dev/null and b/assets/wangxin-06.muvimoV2.jpeg differ diff --git a/assets/wangxin-07.CNOKyk_u.jpeg b/assets/wangxin-07.CNOKyk_u.jpeg new file mode 100644 index 0000000..4f960fc Binary files /dev/null and b/assets/wangxin-07.CNOKyk_u.jpeg differ diff --git a/assets/wangxin-08.qkTnZ9Mk.jpeg b/assets/wangxin-08.qkTnZ9Mk.jpeg new file mode 100644 index 0000000..c72c810 Binary files /dev/null and b/assets/wangxin-08.qkTnZ9Mk.jpeg differ diff --git a/assets/wangxin-09.0-vCbkph.jpeg b/assets/wangxin-09.0-vCbkph.jpeg new file mode 100644 index 0000000..08d1b75 Binary files /dev/null and b/assets/wangxin-09.0-vCbkph.jpeg differ diff --git a/assets/wangxin-10.CRRtNptg.jpeg b/assets/wangxin-10.CRRtNptg.jpeg new file mode 100644 index 0000000..84b012c Binary files /dev/null and b/assets/wangxin-10.CRRtNptg.jpeg differ diff --git a/assets/wangxin-11.R5oNZCsm.jpeg b/assets/wangxin-11.R5oNZCsm.jpeg new file mode 100644 index 0000000..251ca8e Binary files /dev/null and b/assets/wangxin-11.R5oNZCsm.jpeg differ diff --git a/assets/wangxin-12.BsgnfET_.jpeg b/assets/wangxin-12.BsgnfET_.jpeg new file mode 100644 index 0000000..beec438 Binary files /dev/null and b/assets/wangxin-12.BsgnfET_.jpeg differ diff --git a/assets/xdoctest-1.twGhXbsV.jpg b/assets/xdoctest-1.twGhXbsV.jpg new file mode 100644 index 0000000..b0b154e Binary files /dev/null and b/assets/xdoctest-1.twGhXbsV.jpg differ diff --git a/assets/xdoctest-10.C7e6x3bs.jpg b/assets/xdoctest-10.C7e6x3bs.jpg new file mode 100644 index 0000000..692865f Binary files /dev/null and b/assets/xdoctest-10.C7e6x3bs.jpg differ diff --git a/assets/xdoctest-11.B_U6cpOH.jpg b/assets/xdoctest-11.B_U6cpOH.jpg new file mode 100644 index 0000000..ed543fb Binary files /dev/null and b/assets/xdoctest-11.B_U6cpOH.jpg differ diff --git a/assets/xdoctest-12.6U1ca7Vv.jpg b/assets/xdoctest-12.6U1ca7Vv.jpg new file mode 100644 index 0000000..78b982c Binary files /dev/null and b/assets/xdoctest-12.6U1ca7Vv.jpg differ diff --git a/assets/xdoctest-2.aPhS1ooI.jpg b/assets/xdoctest-2.aPhS1ooI.jpg new file mode 100644 index 0000000..ea27540 Binary files /dev/null and b/assets/xdoctest-2.aPhS1ooI.jpg differ diff --git a/assets/xdoctest-3.Bmde-M0u.jpg b/assets/xdoctest-3.Bmde-M0u.jpg new file mode 100644 index 0000000..9c66b25 Binary files /dev/null and b/assets/xdoctest-3.Bmde-M0u.jpg differ diff --git a/assets/xdoctest-4.CQRxEsNO.jpg b/assets/xdoctest-4.CQRxEsNO.jpg new file mode 100644 index 0000000..25c2113 Binary files /dev/null and b/assets/xdoctest-4.CQRxEsNO.jpg differ diff --git a/assets/xdoctest-5.DMtIpjJh.jpg b/assets/xdoctest-5.DMtIpjJh.jpg new file mode 100644 index 0000000..5b18872 Binary files /dev/null and b/assets/xdoctest-5.DMtIpjJh.jpg differ diff --git a/assets/xdoctest-6.4nJubk8N.jpg b/assets/xdoctest-6.4nJubk8N.jpg new file mode 100644 index 0000000..5d0a125 Binary files /dev/null and b/assets/xdoctest-6.4nJubk8N.jpg differ diff --git a/assets/xdoctest-7.Ddmk4eg3.jpg b/assets/xdoctest-7.Ddmk4eg3.jpg new file mode 100644 index 0000000..f448501 Binary files /dev/null and b/assets/xdoctest-7.Ddmk4eg3.jpg differ diff --git a/assets/xdoctest-8.BJQ47NZd.jpg b/assets/xdoctest-8.BJQ47NZd.jpg new file mode 100644 index 0000000..9d6130c Binary files /dev/null and b/assets/xdoctest-8.BJQ47NZd.jpg differ diff --git a/assets/xdoctest-9.Abp2_MFf.jpg b/assets/xdoctest-9.Abp2_MFf.jpg new file mode 100644 index 0000000..601b200 Binary files /dev/null and b/assets/xdoctest-9.Abp2_MFf.jpg differ diff --git a/assets/xian-event-01.Bl9tVA4M.jpg b/assets/xian-event-01.Bl9tVA4M.jpg new file mode 100644 index 0000000..6a74a88 Binary files /dev/null and b/assets/xian-event-01.Bl9tVA4M.jpg differ diff --git a/assets/xian-event-02.Bfoq75hH.jpg b/assets/xian-event-02.Bfoq75hH.jpg new file mode 100644 index 0000000..c3085d5 Binary files /dev/null and b/assets/xian-event-02.Bfoq75hH.jpg differ diff --git a/assets/xian-event-03.l1r9R8wK.jpg b/assets/xian-event-03.l1r9R8wK.jpg new file mode 100644 index 0000000..c363d3a Binary files /dev/null and b/assets/xian-event-03.l1r9R8wK.jpg differ diff --git a/assets/xian-event-04.D7GNRoue.jpg b/assets/xian-event-04.D7GNRoue.jpg new file mode 100644 index 0000000..9cd59bd Binary files /dev/null and b/assets/xian-event-04.D7GNRoue.jpg differ diff --git a/assets/xian-event-05.CC4ZiPOX.jpg b/assets/xian-event-05.CC4ZiPOX.jpg new file mode 100644 index 0000000..af018e6 Binary files /dev/null and b/assets/xian-event-05.CC4ZiPOX.jpg differ diff --git a/assets/xian-event-06.BRqk--wM.jpg b/assets/xian-event-06.BRqk--wM.jpg new file mode 100644 index 0000000..4438a7c Binary files /dev/null and b/assets/xian-event-06.BRqk--wM.jpg differ diff --git a/assets/zhangyiqiao-01.CoqpsD_Z.jpeg b/assets/zhangyiqiao-01.CoqpsD_Z.jpeg new file mode 100644 index 0000000..6f8b238 Binary files /dev/null and b/assets/zhangyiqiao-01.CoqpsD_Z.jpeg differ diff --git a/assets/zhangyiqiao-02.CMu3F1pB.jpeg b/assets/zhangyiqiao-02.CMu3F1pB.jpeg new file mode 100644 index 0000000..527b24c Binary files /dev/null and b/assets/zhangyiqiao-02.CMu3F1pB.jpeg differ diff --git a/assets/zhangyiqiao-03.BdZmFXia.jpeg b/assets/zhangyiqiao-03.BdZmFXia.jpeg new file mode 100644 index 0000000..92a1b63 Binary files /dev/null and b/assets/zhangyiqiao-03.BdZmFXia.jpeg differ diff --git a/assets/zhangyiqiao-04.DdgZgJtk.jpeg b/assets/zhangyiqiao-04.DdgZgJtk.jpeg new file mode 100644 index 0000000..719cd77 Binary files /dev/null and b/assets/zhangyiqiao-04.DdgZgJtk.jpeg differ diff --git a/assets/zhangyiqiao-05.7wTCyzPp.jpeg b/assets/zhangyiqiao-05.7wTCyzPp.jpeg new file mode 100644 index 0000000..1a26583 Binary files /dev/null and b/assets/zhangyiqiao-05.7wTCyzPp.jpeg differ diff --git a/assets/zhangyiqiao-06.CaD7ITDx.jpeg b/assets/zhangyiqiao-06.CaD7ITDx.jpeg new file mode 100644 index 0000000..9dccd19 Binary files /dev/null and b/assets/zhangyiqiao-06.CaD7ITDx.jpeg differ diff --git a/assets/zhangyiqiao-07.rpQ_Tu3F.jpeg b/assets/zhangyiqiao-07.rpQ_Tu3F.jpeg new file mode 100644 index 0000000..abe42df Binary files /dev/null and b/assets/zhangyiqiao-07.rpQ_Tu3F.jpeg differ diff --git a/assets/zhangyiqiao-08.DpkvL9rZ.jpeg b/assets/zhangyiqiao-08.DpkvL9rZ.jpeg new file mode 100644 index 0000000..c9f579e Binary files /dev/null and b/assets/zhangyiqiao-08.DpkvL9rZ.jpeg differ diff --git a/assets/zhaomiaomiao.dXx6awBl.jpg b/assets/zhaomiaomiao.dXx6awBl.jpg new file mode 100644 index 0000000..c655b67 Binary files /dev/null and b/assets/zhaomiaomiao.dXx6awBl.jpg differ diff --git a/favicon.ico b/favicon.ico new file mode 100644 index 0000000..84ad3cf Binary files /dev/null and b/favicon.ico differ diff --git a/hashmap.json b/hashmap.json new file mode 100644 index 0000000..65a020e --- /dev/null +++ b/hashmap.json @@ -0,0 +1 @@ +{"posts_wuxi-kaifangyuanzi.md":"BjTDfesd","pages_1.md":"z66ZHE3n","posts_wangxin-story.md":"bHMq97Rw","posts_suzhou-kaifangyuanzi.md":"BWTb1jy6","posts_tao-story.md":"DPMbREGv","posts_loaf-sharing.md":"CLynDrU1","posts_pfcc-36th.md":"DYTL3ikw","posts_first-post.md":"BETAI2jl","pages_3.md":"C-RcCS0h","posts_pytorch-conference-01.md":"BBNDYGg1","index.md":"Bv6JB4-c","posts_chuan-story.md":"CznaerLd","posts_nknan-story.md":"C0DqNXs8","posts_zhangyiqiao-story.md":"DNR0hYA-","posts_starter-camp.md":"Db9PfhHS","posts_2023-os-report.md":"CA_G4PCe","posts_shun-story.md":"uWHLiez7","posts_hackathon-5th-episode03.md":"25C8UpHA","about.md":"CffTn8Vs","posts_chengdu-kaiyuanshe.md":"DFP35aMk","posts_hackathon-5th-episode01.md":"CxQNsjlT","posts_zheng-story.md":"Ck4Zn1Rf","posts_paddleocr-release.md":"B0ViGL7p","posts_hackathon-5th-episode02.md":"BhLuUEr6","posts_xian-event.md":"CNEXSNi8","posts_huanggua-story.md":"vbJ2Gjxx","posts_sanbu-story.md":"Bbv7dzA3","posts_huangjiyi-story.md":"Bdyh1PqX","pages_2.md":"CX191mJd","posts_pku-course.md":"BIsX0K5j","posts_limin-story.md":"CtGmBrw5","posts_xdoctest-project.md":"DIdZvN6i"} diff --git a/icons/apple-touch-icon-180x180.png b/icons/apple-touch-icon-180x180.png new file mode 100644 index 0000000..addeb1f Binary files /dev/null and b/icons/apple-touch-icon-180x180.png differ diff --git a/icons/maskable-icon-512x512.png b/icons/maskable-icon-512x512.png new file mode 100644 index 0000000..d89daa2 Binary files /dev/null and b/icons/maskable-icon-512x512.png differ diff --git a/icons/pwa-192x192.png b/icons/pwa-192x192.png new file mode 100644 index 0000000..2bf7c9b Binary files /dev/null and b/icons/pwa-192x192.png differ diff --git a/icons/pwa-512x512.png b/icons/pwa-512x512.png new file mode 100644 index 0000000..59aff23 Binary files /dev/null and b/icons/pwa-512x512.png differ diff --git a/icons/pwa-64x64.png b/icons/pwa-64x64.png new file mode 100644 index 0000000..9be60b2 Binary files /dev/null and b/icons/pwa-64x64.png differ diff --git a/index.html b/index.html new file mode 100644 index 0000000..e10881f --- /dev/null +++ b/index.html @@ -0,0 +1,42 @@ + + + + + + 飞桨开源社区博客 + + + + + + + + + + + + + + + + + + + + +

飞桨开源社区博客

Wonderful stories from PaddlePaddle contributors

  • Published on

    终于等到你!PaddleOCR 新版本发布!

    在开源社区的热烈期待与共同努力下,PaddleOCR 迎来了里程碑式的版本更新——v2.8.0!本次更新不仅引入了前沿的 OCR 技术成果,还对项目结构进行了深度优化解决了若干历史疑难问题,旨在为广大开发者提供更加高效、便捷的 OCR 解决方案。让我们一同探索 PaddleOCR v2.8.0 带来的全新体验与无限可能!

    +
  • Published on

    【开源江湖闲聊录】从代码到键盘外的世界,走进 NKNaN 的日常

    大家好!这次我们有幸采访到社区中的一位特别的朋友——NKNaN。她不仅是飞桨社区中的佼佼者,对于开发中的难题总能迎刃而解,也是一位才华横溢且性格随和的女性开发者。通过这次的对话,我们将一起走进李睿文的日常生活,了解她在社区背后充满转折和惊喜的个人故事~

    +
  • Published on

    PaddleOCR 算法模型挑战赛圆满落幕 & 杭州开发者线下 Meetup

    2024 年 4 月 12 日,开放原子开源大赛 PaddleOCR 算法模型挑战赛 决赛路演在苏州工业园区人工智能产业园 G1 栋 3 楼会议中心顺利举行,并取得圆满成功!🎉价值 15 万元的大奖花落谁家?选手们的技术方案有多硬核?快来看看吧~

    +

    BTW,在 4 月 14 日 我们飞桨开源社区的工作人员也顺路来到杭州,在西子湖畔的一家餐厅里举办了杭州开发者线下 Meetup,和众多熟悉又陌生的“网友”成功面基 😊。

    +
  • Published on

    【开源江湖闲聊录】Paddle 六边形战士?揭开汪师傅的神秘面纱~

    无论是工作还是生活,他都认真对待!无论是开源世界还是家庭亲情他都怀抱深沉热爱!从一开始提修改文档 PR 的边缘者到如今横扫各大开源任务的 Paddle 扫地僧!汪师傅一直在开源界默默努力💪深耕~今天,就让我们一起揭开这位神秘大佬的面纱,探寻他的故事吧!✨✨✨

    +
  • Published on

    【睁眼看世界 🌍】|PyTorch Conference 2023 - State of PyTorch

    本文是对 PyTorch Conference 2023 中的《State of PyTorch》部分进行了精准的中文翻译和详细的文字总结,旨在向读者介绍 PyTorch 社区的 2023 年动态。同时也特别参考了散步大佬的《PyTorch Conference 2023 翻译系列文章》,在此基础上,进行了细致的校对和优化,确保翻译准确无误。对散步大佬之前的辛勤翻译和对开源社区的贡献,表示衷心的感谢和敬意。

    +
  • Published on

    新征程 ⛵️ |飞桨「启航计划」集训营圆满落幕

    在 2023 年的 11 月 14 日,飞桨开源社区开启了一个新项目(新坑)—— 启航计划集训营。经过为期两个月紧张而充实的集训后,启航计划集训营于 1 月 30 日 正式圆满完成所有集训计划。在集训期间,大家出色地完成了三项热身打卡任务,并且有 19 位营员合入了超过 110 个 PR。衷心感谢各位营员的积极参与和卓越贡献!在这里,也向开源社区的各位 “汇报” 一下活动情况~

    +
  • Published on

    【开源江湖闲聊录】飞桨的见证者:涛姐的风风雨雨传奇之旅

    嘿,你知道飞桨社区里的 DDL 战士是谁么?嘿,你知道大家心中的 Paddle 社区妈妈是谁么?那你又知道谁是(仓库管理员)飞桨仓库的实际控制人?谁是飞桨仓库的守护者?谁是飞桨从闭源到开源的见证者?是的,本期要采访的就是我们 Paddle 的资深研发女神——涛姐!

    +
  • Published on

    【开源江湖闲聊录】社区最强水群人——张师傅的酸甜苦辣生活说

    格子衬衫 👕,黑框眼镜 👓,他就是上天钦定的程序员!他狂卷技术,热爱开源;他喜欢摸鱼 🐟,疯狂水群;他“厨艺精湛”,堪称当代厨神。严寒冬日,别人有女朋友温暖手心,而他把 🥤 优乐美捧在手心!凌晨就寝,别人躺平酝酿睡意,他靠咖啡 ☕️ 进入梦境!工作一年半,至今单身汉!他就是来自安徽的吃辣小趴菜——张一乔 😆!

    +
+ + + + \ No newline at end of file diff --git a/logo.png b/logo.png new file mode 100644 index 0000000..4240632 Binary files /dev/null and b/logo.png differ diff --git a/manifest.webmanifest b/manifest.webmanifest new file mode 100644 index 0000000..7adec54 --- /dev/null +++ b/manifest.webmanifest @@ -0,0 +1 @@ +{"name":"飞桨开源社区博客","short_name":"飞桨开源社区博客","start_url":"/","display":"standalone","background_color":"#ffffff","lang":"zh-CN","scope":"/","id":"/","description":"Wonderful stories from PaddlePaddle contributors","theme_color":"#ffffff","icons":[{"src":"icons/pwa-64x64.png","sizes":"64x64","type":"image/png"},{"src":"icons/pwa-192x192.png","sizes":"192x192","type":"image/png"},{"src":"icons/pwa-512x512.png","sizes":"512x512","type":"image/png"},{"src":"icons/maskable-icon-512x512.png","sizes":"512x512","type":"image/png","purpose":"maskable"}]} diff --git a/pages/1.html b/pages/1.html new file mode 100644 index 0000000..b362e32 --- /dev/null +++ b/pages/1.html @@ -0,0 +1,42 @@ + + + + + + 飞桨开源社区博客 + + + + + + + + + + + + + + + + + + + + +

飞桨开源社区博客

Wonderful stories from PaddlePaddle contributors

  • Published on

    终于等到你!PaddleOCR 新版本发布!

    在开源社区的热烈期待与共同努力下,PaddleOCR 迎来了里程碑式的版本更新——v2.8.0!本次更新不仅引入了前沿的 OCR 技术成果,还对项目结构进行了深度优化解决了若干历史疑难问题,旨在为广大开发者提供更加高效、便捷的 OCR 解决方案。让我们一同探索 PaddleOCR v2.8.0 带来的全新体验与无限可能!

    +
  • Published on

    【开源江湖闲聊录】从代码到键盘外的世界,走进 NKNaN 的日常

    大家好!这次我们有幸采访到社区中的一位特别的朋友——NKNaN。她不仅是飞桨社区中的佼佼者,对于开发中的难题总能迎刃而解,也是一位才华横溢且性格随和的女性开发者。通过这次的对话,我们将一起走进李睿文的日常生活,了解她在社区背后充满转折和惊喜的个人故事~

    +
  • Published on

    PaddleOCR 算法模型挑战赛圆满落幕 & 杭州开发者线下 Meetup

    2024 年 4 月 12 日,开放原子开源大赛 PaddleOCR 算法模型挑战赛 决赛路演在苏州工业园区人工智能产业园 G1 栋 3 楼会议中心顺利举行,并取得圆满成功!🎉价值 15 万元的大奖花落谁家?选手们的技术方案有多硬核?快来看看吧~

    +

    BTW,在 4 月 14 日 我们飞桨开源社区的工作人员也顺路来到杭州,在西子湖畔的一家餐厅里举办了杭州开发者线下 Meetup,和众多熟悉又陌生的“网友”成功面基 😊。

    +
  • Published on

    【开源江湖闲聊录】Paddle 六边形战士?揭开汪师傅的神秘面纱~

    无论是工作还是生活,他都认真对待!无论是开源世界还是家庭亲情他都怀抱深沉热爱!从一开始提修改文档 PR 的边缘者到如今横扫各大开源任务的 Paddle 扫地僧!汪师傅一直在开源界默默努力💪深耕~今天,就让我们一起揭开这位神秘大佬的面纱,探寻他的故事吧!✨✨✨

    +
  • Published on

    【睁眼看世界 🌍】|PyTorch Conference 2023 - State of PyTorch

    本文是对 PyTorch Conference 2023 中的《State of PyTorch》部分进行了精准的中文翻译和详细的文字总结,旨在向读者介绍 PyTorch 社区的 2023 年动态。同时也特别参考了散步大佬的《PyTorch Conference 2023 翻译系列文章》,在此基础上,进行了细致的校对和优化,确保翻译准确无误。对散步大佬之前的辛勤翻译和对开源社区的贡献,表示衷心的感谢和敬意。

    +
  • Published on

    新征程 ⛵️ |飞桨「启航计划」集训营圆满落幕

    在 2023 年的 11 月 14 日,飞桨开源社区开启了一个新项目(新坑)—— 启航计划集训营。经过为期两个月紧张而充实的集训后,启航计划集训营于 1 月 30 日 正式圆满完成所有集训计划。在集训期间,大家出色地完成了三项热身打卡任务,并且有 19 位营员合入了超过 110 个 PR。衷心感谢各位营员的积极参与和卓越贡献!在这里,也向开源社区的各位 “汇报” 一下活动情况~

    +
  • Published on

    【开源江湖闲聊录】飞桨的见证者:涛姐的风风雨雨传奇之旅

    嘿,你知道飞桨社区里的 DDL 战士是谁么?嘿,你知道大家心中的 Paddle 社区妈妈是谁么?那你又知道谁是(仓库管理员)飞桨仓库的实际控制人?谁是飞桨仓库的守护者?谁是飞桨从闭源到开源的见证者?是的,本期要采访的就是我们 Paddle 的资深研发女神——涛姐!

    +
  • Published on

    【开源江湖闲聊录】社区最强水群人——张师傅的酸甜苦辣生活说

    格子衬衫 👕,黑框眼镜 👓,他就是上天钦定的程序员!他狂卷技术,热爱开源;他喜欢摸鱼 🐟,疯狂水群;他“厨艺精湛”,堪称当代厨神。严寒冬日,别人有女朋友温暖手心,而他把 🥤 优乐美捧在手心!凌晨就寝,别人躺平酝酿睡意,他靠咖啡 ☕️ 进入梦境!工作一年半,至今单身汉!他就是来自安徽的吃辣小趴菜——张一乔 😆!

    +
+ + + + \ No newline at end of file diff --git a/pages/2.html b/pages/2.html new file mode 100644 index 0000000..09d010e --- /dev/null +++ b/pages/2.html @@ -0,0 +1,41 @@ + + + + + + 飞桨开源社区博客 + + + + + + + + + + + + + + + + + + + + +

飞桨开源社区博客

Wonderful stories from PaddlePaddle contributors

+ + + + \ No newline at end of file diff --git a/pages/3.html b/pages/3.html new file mode 100644 index 0000000..e6fa8f9 --- /dev/null +++ b/pages/3.html @@ -0,0 +1,35 @@ + + + + + + 飞桨开源社区博客 + + + + + + + + + + + + + + + + + + + + +

飞桨开源社区博客

Wonderful stories from PaddlePaddle contributors

+ + + + \ No newline at end of file diff --git a/posts/2023-os-report.html b/posts/2023-os-report.html new file mode 100644 index 0000000..ba1329b --- /dev/null +++ b/posts/2023-os-report.html @@ -0,0 +1,31 @@ + + + + + + 飞桨开源社区成为国内 Top,我们做对了什么? | 飞桨开源社区博客 + + + + + + + + + + + + + + + + + + + + +
Published on

飞桨开源社区成为国内 Top,我们做对了什么?

Authors

什么是开源项目和开源社区?国内活跃度 Top 的开源社区,都有哪些有趣的人和事?开源社区之于开源项目有何重要意义?

开源项目(Open Source Project),顾名思义是指开放源代码的可以被公众使用的软件项目,在开源合规的基础上,其他开发者可以对软件进行使用、修改和发行。基于「共建共治共享」的开源理念,许多开源项目汇聚了一批拥有共同兴趣爱好的开发者,形成了一个个独特的开源社区(Open Source Community)。据第三方数据显示,飞桨开源社区已成为国内 Top 的开源社区,作为社区维护者,我们做对了什么?

1. 飞桨开源数据一览

2. 整体飞桨平台的情况

来一段官方介绍:

飞桨(PaddlePaddle)以百度多年的深度学习技术研究和业务应用为基础,集核心框架、基础模型库、端到端开发套件、丰富的工具组件、星河社区于一体,是中国首个自主研发、功能丰富、开源开放的产业级深度学习平台。飞桨在业内率先实现了动静统一的框架设计,兼顾科研和产业需求,在开发便捷的深度学习框架、大规模分布式训练、高性能推理引擎、产业级模型库等技术上处于国际领先水平。

飞桨端到端自适应混合并行训练技术以及压缩、推理、服务部署的协同优化,高效支撑以文心一言为代表的文心大模型的生产与应用。

IDC 发布的 2022 年中国深度学习框架和平台市场份额报告显示,百度稳居中国深度学习平台市场综合份额第一。中国信息通信研究院《深度学习平台发展报告(2022)》指出,飞桨已经成为中国深度学习市场应用规模第一的深度学习框架和赋能平台。

当前飞桨已凝聚 800 万开发者,基于飞桨创建 80 万个模型,服务 22 万家企事业单位,广泛服务于金融、能源、制造、交通等领域。

截至 2023 年 8 月,飞桨开源社区累计提交 Commits 超过 93 万次,以 PR 或 ISSUE 提交形式的开源贡献者超过 18000 人。

3. 谁开发了飞桨

BAIDU Contributors:专职的研发部门(深度学习技术平台部),及非专职的其他部门的工程师。

尽管并没有一种特定的方法来识别某位 contributor 是否是百度的雇员,但你依然可以从 github profile 或者 author email 中来找到大量活跃的百度工程师的身影。

Corporate Contributors:NVIDIA、INTEL、昆仑芯、寒武纪,等等多家硬件公司的专职工程师。

翻看AUTHORS.md文件,或者查看飞桨的代码仓库的 commits log,你总能看到来自于这些硬件公司的优秀的工程师的贡献。(小彩蛋:你甚至能找到 intel 工程师们的一张合照)

Individual Contributors:来自高校的学生及来自企业的工程师在业余时间的贡献。

individual-contributors

我们今天对开源社区及开发者的讨论,会聚焦到 Individual Contributors 群体。当前,个人贡献者群体已经成为飞桨开源社区必不可少的研发力量,在提升开源项目影响力、社区活跃度、扩大开源声量方面,更是有着十分重要的意义。

4. 社区开源贡献为飞桨带来了什么

这是一些 2023 年至今社区开发者为飞桨核心框架做出的代码贡献合辑,可以看到从工程效能优化、文档体验提升,到飞桨内核十分重要的 PHI 算子库独立编译,社区开发者都做出了非常重要的贡献。值得一提的是,飞桨 2.4 版本中发布的 API 有三分之一是由社区开发者完成的,到飞桨 2.5 版本,新增的 API 贡献几乎都来自社区开发者。

projects

除此之外,在飞桨的端到端开发套件 PaddleOCR、PaddleClas、PaddleDetection、PaddleSeg,以及大模型套件 PaddleNLP、PaddleMIX 中,社区开发者贡献了许多 SOTA 的算法模型、训推一体 pipeline、tutorials&demo,与飞桨团队共同打磨易用的深度学习框架与工具组件。

这里可以查看更多进行中和已结项的项目:https://github.com/orgs/PaddlePaddle/projects/7

5. 参与飞桨社区的开源贡献会获得什么

技术实力与开源影响力提升

  • 飞桨社区开源项目覆盖深度学习框架、模型、应用全领域,你想提升的技术,这里全都有;
  • 与飞桨产研团队紧密沟通协作,和飞桨共同成长;
  • 开源贡献行为全部公开可查,飞桨社区丰富的开源贡献活动助你树立个人开源影响力;
  • 鼓励社区孵化项目,你可以在这里找到志同道合的小伙伴,把想法变成现实。

荣誉证书、现金激励与工作机会

  • 颁发开源贡献证书、社区曝光度、奖状徽章等,致敬每一位贡献者;
  • 举办丰富社区赛事,提供奖金/奖品激励与权威机构认证;
  • 开源社区贡献者在招聘中会被优先考虑。

硬件支持

  • 提供线上 V100 开发环境,随时可以开发与编译。

honours

6. 飞桨快乐开源:Grow Together, and Have Fun

先来讲一个故事。

大概在 2022 年 12 月份的时候,通过代码扫描工具发现了飞桨框架的 100 多个小 bug 🐛。说是 bug,但是问题真的很小,诸如堆栈溢出(stack overflow)、UFA 非法地址访问(UFA illegal address access)、Python IndexError、空指针(Null pointer)、除 0 错误(divide by 0),大部分 bug 可以被很少的一行或几行代码 fix。

issues

bug 发现了不能不修,怎么修呢?我们把目光放到了开源社区。这是一批极易上手的开发任务,开发者可以在不熟悉框架的情况下完成 bug 修复任务,获得满满成就感;时间上来看,刚好赶上高校学生们放寒假,有大量的空闲时间参与开源活动;研发人力方面,我们协调到 1 个完整人力来支持 code review,保障 bug 修复质量。天时地利人和,我们把这一批 bug 修复任务包装成了一个社区活动 —— 飞桨快乐开源:提 PR 领取新年礼物 🎁。

这个活动一经推出,立马受到了社区开发者的广泛关注和参与,出乎我们意料的是,看到了很多老朋友和新面孔的 PR 提交,有些人(点名 DrRyanHuang)嘴上说着「年后再说」,表情包做了不少,背地里 PR 也提了不少。

nianhouzaishuo

更为经典的是一名社区开发者 RedContritio 在除夕夜连着提了 18 个 PR,因为那个时间点大家都在欢度春节,没有人和他抢,导致他的 PR 编号都是连号的,由于 PR 质量过高,最后也顺利的全部完成了合入 ✅,给了我们一点小小的开源震撼

pullrequests

后来,快乐开源活动就顺理成章的成为了飞桨开源社区长期有效的日常活动,旨在通过简单易上手的开发任务,帮助开发者渐进的了解飞桨、参与开源。我们会按季度更新礼品清单、统计参与活动的开发者信息,并完成礼品邮寄。随着开发者参与热情越来越高,礼品也从游戏键盘、无线耳机升级到了 PS5、iPad、Apple Watch 等。

在 2023 年 Q4,快乐开源活动完成了一次全新升级 🔥,任务范围从 Paddle 框架扩展到科学计算 PaddleScience、大模型套件(PaddleMIX、PaddleNLP)、端到端开发套件(PaddleOCR、PaddleSeg、PaddleClas、PaddleDetection)、动转静孵化项目 PaddleSOT 等更多飞桨生态开源项目,上线「✨ 热身任务」、「🎯 命题任务」与「💡 开放任务」,使用「HappyOpenSource」 标签追踪相关的 issue 与 pr,我们确立了「 Grow Together, and Have Fun!」为口号,快乐开源活动逐渐做大做强~

更多信息可访问活动 issue 了解:https://github.com/PaddlePaddle/Paddle/issues/56689

7. 社区主导项目:Community over Code

Community over Code 是 Apache 软件基金会的项目中最广为人知的理念。尽管在社区的沟通方式上,跟 ASF 所鼓励的用邮件组来沟通不一样,飞桨社区的绝大部分沟通方式是在大家熟悉的微信群里,但从解决 「Good First Issue」 加入进来的社区开发者们, 在熟悉了社区之后,同样可以迸发更大的能量。

再来讲一个故事。

作为源自百度的开源项目,飞桨的运营团队通常可以接触到一些第三方办赛的邀请,这次找到我们的是第六届『中国软件开源创新大赛』,这是一个由中国计算机学会(CCF)主办,西北工业大学、绿色计算产业联盟、CCF 开源发展委员会联合承办的大型赛事,联合百度、清华大学等企业单位以及多所高校共同设置赛题,飞桨参与了『开源任务挑战赛』赛道,发布了 16 道具有一定难度的、需要参赛选手自行拆解与项目管理的开源任务。我们称其为 「HappyOpenSource Pro」 ,快乐开源进阶版。任务详情:飞桨框架任务挑战赛(上)飞桨框架任务挑战赛(下)

让我们惊喜的是,这些即使是内部研发团队都觉得棘手的开发任务,被一批高水平的开发者完美的解决了。以飞桨赛道一等奖项目:赛题五:将 xdoctest 引入到飞桨框架工作流中 为例,项目涉及修改 1400+ API,数十万行代码,24 位开发者近 3 个月协同工作,队长 megemini 成长为 Reviewer,800 万飞桨用户从中受益。

xdoctest-project

更多顺师傅的专访可以查看往期 blog:https://pfcc.blog/posts/shun-story

这件事情让我们愈发相信开源的力量,即使是如此历史包袱重、项目管理难、工程量巨大的开源任务,在找到合适的 owner,提供足够资源支持的情况下,都是有可能被社区开发者们联合解决的。

正在进行中的第五期飞桨黑客马拉松 PaddlePaddle Hackathon 5th,是飞桨开源社区一年两度的大型编程活动。

第五期活动发布三大赛道:开源贡献个人挑战赛、大模型应用与创意赛、飞桨护航计划集训营,上线当天即获得了开发者的广泛报名和参与,目前总体任务认领率 100%,核心框架任务提交率接近 90%,许多开发者直呼「卷出新高度」。

paddlepaddle-hackathon

由社区开发者 Tomoko-hjf 开发黑客松小助手,自动更新任务榜单与看板,极大提升了社区活动的自动管理水平。在护航计划集训营中,学员 MarioLulab 兼任助教,搭建开源项目用于管理开发进度与周报提交,欢迎大家前往围观 ➡️ PFCCLab/Camp

与此同时,配套直播课程经过多期打磨,已形成完整的飞桨开源贡献视频资料,并发布在星河社区课程专区 深度学习开发指南——黑客松 5.0 - 飞桨 AI Studio 星河社区-人工智能学习与实训社区,跟着飞桨导师,从这里开始你的黑客松之旅吧 💕

更多黑客松活动情况,可查看 blog:PaddlePaddle Hackathon Episode01PaddlePaddle Hackathon Episode02

8. 飞桨开源社区有哪些玩法

如果你正在寻找一个开源项目做贡献,或有意向加入一个开源组织 or 社区,我们非常欢迎你来飞桨开源社区玩,与我们一起执桨破浪,让深度学习技术的创新与应用更简单

你可以 follow 这样的路径:

社区活动

入门:快乐开源、启航计划

「快乐开源活动」 旨在鼓励更多的开发者参与到飞桨社区的开源建设中,帮助社区修复 bug 或贡献 feature,加入开源、共建飞桨。如果你是刚接触飞桨 or 开源社区的小白,我们十分推荐你从打卡任务开始:

  • 任务一:修改飞桨文档,完成你的第一个 PR,练习 git 操作,熟悉 GitHub 开源协作方式
  • 任务二:拉取 Paddle 代码,完成本地编译,让你对 Paddle 代码有更深入的理解,便于参与后续的框架开发任务
  • 任务三:在 PaddleMIX 中跑通 Stable-Diffusion 训练推理,你会快速掌握飞桨开发套件的使用,便于参与后续的套件开发任务

详情可查看 issue:https://github.com/PaddlePaddle/Paddle/issues/56689

「启航计划」飞桨社区 发起的远程项目,也是「护航计划」的前置活动(不了解护航计划请看这里 ➡️ 护航计划说明)。我们以集训营的形式,鼓励开发者积极参与快乐开源活动,以此提升自己的代码实践能力。你可以把它当做【HACKATHON 预备营】,在这里找到志同道合的小伙伴,一起开发,一起成长。

详情可查看 issue:https://github.com/PaddlePaddle/Paddle/issues/58497

进阶:黑客松、护航计划

「PaddlePaddle Hackathon 飞桨黑客马拉松」 是飞桨社区的大型编程活动,鼓励社区开发者了解与参与飞桨深度学习开源项目与文心大模型开发实践,为飞桨框架、套件、大模型、合作伙伴等生态进行开源贡献。适合具备一定开源贡献基础和代码基础的朋友前来挑战自我~~

第五期黑客松活动火热进行中,详情可查看 issue:

社区组织

技术交流组织:飞桨核心框架贡献者俱乐部 PFCC

PFCC,全称 Paddle Framework Contributor Club,飞桨核心框架贡献者俱乐部,是一个有兴趣、正在、或者已经为飞桨开源框架做开源贡献的贡献者成立的虚拟组织,在这里,飞桨开源框架的贡献者进行讨论、交流和分享,并为飞桨框架做出持续的贡献。

目前,PFCC 已汇聚 100+ Contributor,6 名贡献者成长为 Committer,维持双周一次技术分享会,累计召开 30+ 次,产生上百个议题(详见会议纪要),与飞桨产研团队探讨飞桨框架硬核技术难题,发起联合开发项目。

更多信息可前往社区查看:https://github.com/PaddlePaddle/community/tree/master/pfcc

社区治理组织:飞桨社区开源发展工作组 PPOSDWG

PPOSDWG,全称 PaddlePaddle OpenSource Development Working Group,飞桨社区开源发展工作组,为加强飞桨开源社区的透明治理,提升社区成员的参与感和社区认同,决策飞桨社区的关键事项与治理策略而成立。

2023 年 11 月 16 日,飞桨开源社区举行线上投票选举与成立仪式,39 名合格投票人完成投票,选举产生第一届工作组成员。

更多信息可前往社区查看:https://github.com/PaddlePaddle/community/tree/master/pposdwg

9. 写在最后

我们始终相信,开源社区因为人的汇聚而变得有意义。在这一年中,我们参与和见证了许许多多社区故事,为每一个精彩的 PR 鼓掌喝彩,为每一次「我们 paddle 如何如何」的句式感动,向每一位热爱开源的开发者和研发工程师致敬。

在飞桨开源社区,我们结识了许多有趣可爱的人,程序员不再是一个标签化 🏷 的群体。他们中,有「摸资本主义的鱼,建设社会主义框架」的 Intel 工程师 jinyouzhi,有社区 Committer 手搓框架入职百度的全栈 001 喵喵喵 SigureMo,有「水遍」所有开发任务群强势进入贡献者排行榜的 002 张师傅 Liyulingyue,有获得硬件伙伴高度称赞的 3w+ 部署代码贡献达人 Zheng-Bicheng,...,甚至还有五年级的小朋友 zhiheng-liu 刷新飞桨 Contributor 最小年龄记录。

因此我们萌生了创建这个 blog 网站的想法,由全栈工程师 001 搭建,代码开源在 GitHub,记录飞桨开源社区的故事,欢迎各位开发者投稿呀~~ https://pfcc.blog/

funny-memes

👆一些流传度很广的开发者自制表情包👆

「Shaping PaddlePaddle Future with You,与你一起定义飞桨的未来!」 从来不只是一句口号,就是在这日复一日的平凡生活中,在一行行代码的设计与运行里,在一次次前沿技术的交流与碰撞下,一些改变正在悄然发生。期待飞桨与你共同成长,让我们一起打造易用的深度学习框架与工具组件,在开源的世界走得更远!

+ + + + \ No newline at end of file diff --git a/posts/chengdu-kaiyuanshe.html b/posts/chengdu-kaiyuanshe.html new file mode 100644 index 0000000..50bc37a --- /dev/null +++ b/posts/chengdu-kaiyuanshe.html @@ -0,0 +1,31 @@ + + + + + + 飞桨社区成都行:开源社活动与开发者线下 Meetup | 飞桨开源社区博客 + + + + + + + + + + + + + + + + + + + + +
Published on

飞桨社区成都行:开源社活动与开发者线下 Meetup

Authors

2023 年 10 月 28 日、29 日参加开源社举办的「第八届中国开源年会」的精彩瞬间,以及与咱 Paddle 社区成都开发者们的线下见面~

第八届中国开源年会

飞桨开源社区受邀参加第八届中国开源年会,梦师傅和我(孙师傅)都贡献了两场精彩的演讲 🎉。

28 日的活动中,梦师傅在青少年开源与开源教育分论坛上,分享了主题为「走进开源社区」的演讲,向祖国的仙人掌们 🌵 宣传咱们充满趣味和活力的飞桨开源社区。

图片1

图片2

梦师傅还鼓励了很多青年开发者加入飞桨开源社区,其中甚至有一名刚年满 15 岁的初中学生,在活动后提交了 PR 并成功合入,成为了 Paddle 的 contributor @BernieHuang2008

29 日的主论坛上,孙师傅进行了闪电演讲,分享了「如何在开源社区摸 🐟」,介绍了孙师傅工作 0.5kun 年🐔 里总结的摸鱼心得。

图片3

演讲的详细内容将在后续的博客中分享,敬请期待~

飞桨社区成都开发者 Meetup

在 29 日,我们还相约飞桨社区成都的开发者们线下面基,以下是痛失真名的成都开发者(网友):

图片4

梦师傅还很贴心的给每位开发者赠送了 PaddlePaddle contributor 专属徽章 🥳。

图片5

期待未来与成都的伙伴们再次见面!

彩蛋 🎊

最后,我们还一起跟随军哥 @jzhang533 观看了一场外国小姐姐的 livehouse,很精彩哟!

图片6

+ + + + \ No newline at end of file diff --git a/posts/chuan-story.html b/posts/chuan-story.html new file mode 100644 index 0000000..3db8468 --- /dev/null +++ b/posts/chuan-story.html @@ -0,0 +1,32 @@ + + + + + + 【开源江湖闲聊录】英雄不问出处:川师傅的逆袭之路 | 飞桨开源社区博客 + + + + + + + + + + + + + + + + + + + + + +
Published on

【开源江湖闲聊录】英雄不问出处:川师傅的逆袭之路

Authors

“桨声川水悠悠过,长路漫漫风光留”,这次我们要采访的是小伙伴们都熟悉的励志富哥儿——川川师傅

一、前言

按川川要求,以下均以 🍢🍢 代称川川。

川川目前是一名平平无奇的大学生🧑‍🎓,也是 Paddle 社区里的一名资深开发者。他精通(🍢🍢: 我没有,不是,别瞎说🐶)Java、Python、C++ 等多门编程语言,还掌握 Flutter、Android、Vue 等工具,可谓多才多艺!

川川加入 Paddle 社区后,从最简单的文档修改任务开始,到参与快乐开源、熟悉 paddle 框架,到参与充满难度和挑战的护航计划,到最终自己能够独立的拆解问题、发起社区项目(ruff 升级),我们亲眼见证了他一步步的成长 (怎么有种养成系的感觉)

chuan-01

在提升自我外,川师傅也多次热心地帮助新伙伴们解决 bug、回答问题。(所以大家如果有问题,可以随时在群里骚扰他哦

chuan-02

然而当抛开“Paddle 社区开发者”“学生”等形象标签后,单独地看川师傅自身的人生经历,可谓是非常的励志。你敢相信,川师傅是从中专、大专一路读上来的吗?川师傅的经历像是一本精彩绝伦的探险故事集。接下来让我们来读读他的探险之旅吧!

chuan-03

!!!注意!!!上图为川川师傅の帅照,小伙伴们可以截图保存哦!😝😝😝😝

二、采访内容

  1. 介绍一下自己吧,川川师傅 o(_ ̄3 ̄)o !

    🍢🍢: 我的 AI Studio 账号是 gouzi,GitHub 的账号是 gouzil!o( ̄ε ̄_)o

  2. 作为一个 21 岁青春男大,平时有什么兴趣爱好?听说你喜欢出去玩,你在福建有什么推荐给大家打卡的景点么?哈哈~

    🍢🍢: 爱好当然是出去走走玩玩,感受一下人间烟火气。打卡的话当然是福建的省会厦门啦🐶,在十里长堤跟着男女朋友看看夕阳,鼓浪屿的小巷子。平潭岛也挺不错的(🍢🍢没去过但是朋友圈已经发爆了,图中为蓝眼泪时期,需要特定的季节,且肉眼看不出来这种效果,需要相机长曝光,大家别跑空咯)。

    厦门杏林大桥(来源: 川川相册)
    厦门杏林大桥(来源: 川川相册)
    十里长堤(来源: 川川相册)
    十里长堤(来源: 川川相册)
    鼓浪屿(来源:厦门文旅公众号)
    鼓浪屿(来源:厦门文旅公众号)
    平潭(来源: 新华社 2023/04/29 )
    平潭(来源: 新华社 2023/04/29 )
  3. 据我了解,你在初中时就用易语言写了个安卓 APP 给奶奶使用,你能详细讲讲这个 APP 的设计目的和功能么?你当时学习了些什么技术才把这个 APP 做成?那又是通过哪种方式(看书?上网学习?视频?)学习的呢?

    🍢🍢: 1️⃣ 其实设计这个 APP 是因为奶奶不识字,但是又需要使用手机(而正常手机打电话都是看人的名字进行拨打)。这个 APP 可以理解为一个默认桌面,手机解锁后 APP 就打开,打开后是像下图一样的手机联系人的照片,其实就是把联系人名字变成对应的他们的图片,这样尽管奶奶不识字,也可以看照片进行操作了!🐶 2️⃣ 当时学了啥技术: 其实也没具体的学,因为易语言是中文,有一定的思维逻辑就能实现啦。3️⃣ 通过哪种方式: 翻翻编译器自带的易语言说明(那时候 bilibili 还没有那么火,也没有啥书,只有一台能跑安卓模拟器的电脑)。

    chuan-08
  4. 在 16 岁左右,你就陆陆续续自学了 Python、Java、C,后来又自学了 Go、Android 等等,在这个自学过程中你遇到了那些困难,又有想过放弃么?

    🍢🍢: 遇到困难当然是有的,很难想象 C 我看了半年视频才学会的(有部分原因是我比较拖, 学习一门新的语言时长最好不要超过两周, 因为后续的项目会慢慢的补上来的)。每次接触一门新的语言都会对计算机有更深的理解,理解不同语言为什么要这么做,这么做的优缺点,这也是不断学习的动力吧。想过放弃么: 没有,我还挺感兴趣的,兴趣是最好的老师。

  5. 能简单聊聊你的这几年的学习经历么?

    🍢🍢: 下图最右侧那一列就是学习的顺序啦(学那么多真没啥用,学好一个精通它就行)。也没啥经验,顺其自然就好啦,等学完技术应该也更新了。最快的方式就是跟着项目走,不断的优化它 (最后就会发现:我写的什么玩意,要不要重构🐶) 。不过倒是有几个提升比较大的时间段,一个是去参加了云计算比赛,让我会了 linux 和 docker 这些。一个是实习的那一年,让我整明白了网站这一套(B/S,C/S)。

    chuan-09

  6. 现在社区开发者都认为你的编程能力很强,和学历形成了很大反差,能透露一下当时是为什么会上中专呢?是因为偏科吗?

    🍢🍢: 不是偏科啦,我差的很平均🐶。顺带说一下厦门的初升高录取率为 45%,现在好些了 50%,卷不动卷不动,当然更多是因为我比较菜。

  7. 事实上在目前的舆论环境里,“专科生”是一个很遭受非议的标签😮‍💨,而作为一个亲历者,你内心的是怎么面对的呢?你当时又做了哪些方面的努力?

    🍢🍢: 关于这个标签的话,我只想说:你说的对。没啥必要在乎别人的看法,做自己热爱的事情就好啦。

  8. 作为目前考上本科的计算机应用技术专业的学生,你对未来的职业发展有怎样的规划和期望✊✊✊?

    🍢🍢: 我更喜欢做一些底层的工作,不太喜欢做应用层。规划:入职百度,重构 paddle

  9. 作为厦门领航团的一员,你当时是什么契机接触 Paddle 社区的?在 Paddle 社区做的第一个开源项目是什么?

    🍢🍢: 说到这个契机啊,非常简单,你的上司是厦门领航团团长就行。第一个开源项目当然是我们孙师傅(@sunzhongkai588)的 docs 啦,当然非常感谢佳维姐姐(@dingjiaweiww)和梦师傅(@Ligoml)的鼓励和协助我完成了在 paddle 的第一个 pr。

  10. 在社区里如何和其他开发者进行互动的?有没有什么特别有意思的经历或故事?

    🍢🍢: 我一般有碰上问题就出来回答啦,或者一些技术讨论。特别的故事:五年级的小朋友叫我叔叔算嘛

    chuan-10

  11. 对于 Paddle 框架护航计划,可以分享一下你的面试经历和感受吗?你觉得到达什么水平可以通过护航计划的面试?

    🍢🍢: 经历的话,放心研发大哥不会难为你的,真诚就行。感受 emmm,大家一定要提前准备啊,刷刷算法什么的。什么水平 emmm,我也不太清楚,但是最好是熟悉 padlle,或者你的能力超级无敌强。

    编者注✍️:「护航计划」可以简单理解为飞桨的远程实习项目,可参考 护航计划集训营说明

  12. 参与护航计划时,有什么不一样的感受吗?实际开发过程有没有遇到困难,是怎么解决的?

    🍢🍢: 最大的感受就是,终于从应用层转向了框架层。困难是肯定有的,也有非常多不会的,但是这没关系,问研发大哥就行。就像昆昆(@2742195759)说的: 你尽管问,我就是你的文档。

  13. 在 Paddle 社区中,你参与的哪个项目(或活动)你印象最深刻,能简单描述一下这个项目么?这个项目让你收获了什么?

    🍢🍢: 印象最深的项目是下一个项目,下一个项目可以把之前项目的经验集结起来,也可以学到一些新的知识。当然 PaddleSOT 印象也挺深的,这也是我护航计划的项目。收获更多的是技术的进步吧。有时候看看喵喵(@SigureMo)的修改会发现,噢原来还能这么写。

    chuan-11

  14. 对于深度学习领域,你有哪些想法和研究方向?目前有没有感兴趣的方向?

    🍢🍢: 我其实更多的还是喜欢框架层,怎样才能让整个框架跑的更快,占用更低,更加的易用化。

  15. 发挥一下想象力,如果将深度学习比作一种食物,你觉得它会是什么?为什么?

    🍢🍢: 可能是米饭吧,喂的越多越有力气,跑的越快,力大砖飞。

  16. 听说你使用飞桨解决过很多企业实际问题时,你遇到过最有趣的案例是什么?那么你是如何应用深度学习技术解决这个问题的?

    🍢🍢: 我实习这个企业吧,他刚尝试深度学习,所以一般调调 API 就行了,更多的是怎样去分配资源,做到效率最大化 (我司全是 1050 的卡,我能咋办,我也很绝望啊)

  17. 除了深度学习,你还对其他领域感兴趣吗?有没有想过将深度学习与其他领域结合,创造出一些令人惊喜的应用?

    🍢🍢: 其他领域其实有的,比如摄影和游戏,结合的话有想过,但是还没新建文件夹就不说了🐶

  18. 如果你有机会和 Paddle 社区 or 深度学习领域 or 计算机领域 的一位顶级专家进行合作,你希望和他/她一起研究什么问题?为什么?

    🍢🍢: 这可就太多了,比如:不同语言的通信,怎么做到程序的相对安全,怎样去减少硬件之间的瓶颈。为什么 emmm,可能是因为自己对这方面感兴趣吧。

  19. 如果让你形容一下你和 Paddle 社区的关系,你会怎么说?

    🍢🍢: 相互促进,互相成就(更多还是 paddle 社区的大佬单方面带着我)

  20. 最后,作为一个热情、励志的年轻人,你想对 Paddle 社区里的开源者们说些什么呢?

    🍢🍢: 放开那道题,让我来🐶

三、“鲁迅之我确实说过这话”专区

同样我们也邀请了一些和川川很熟悉的、有过合作经历的朋友们,贡献一下和川师傅相关的故事,或者他们对川师傅的评价~以下均为真心话,请放心看!

chuan-12

by 散步(sanbuphy

  • author image
    散佬
    和川川交流还算比较多,川川基本上有空都会帮你解决任何疑问,甚至是看代码。虽然是年轻的富哥,但很努力上进,甚至比孙师傅还努力🐶;总体来说算很善良的小哥,教过我很多东西。希望能和他一起学习成长,向他多学习请教一些代码之道,早日都一起为中国开源社区多做一些更有价值的事情。 在我无数个老师中,他肯定是我印象深刻的老师之一。

by 卢师傅(AndSonder

  • author image
    卢畅
    有幸在今年暑期上海 meetup 上认识了川师傅,很低调的技术大佬。在川师傅身上能看到对开源活动的热情,各大活动上都能看到川师傅的身影。希望以后还有机会和川师傅线下面基,迪迪小组再次出发!

编者注✍️:迪迪小组是上海 meetup 期间,相约去迪士尼玩的小分队

by 一师傅(SigureMo

  • author image
    喵喵
    自川子参与第一期护航计划开始已经马上就要 6 个月了,我和川子也算是深度交流了 6 个月。从护航计划来看,川子始终保持十足的热情,在 PaddleSOT 那时候还是以开源任务的形式发放,但每次有任务川子都会第一时间认领。之后到现在动转静单测推全,我的 review 速度都赶不上川子提 PR 的速度了……此外川子涉猎甚广,在交流的过程中我也学到了很多东西,川子也会参加各种开源任务,你基本上可以在任何「角落」里看到川子的身影~
    川子这 6 个月也是成长了很多,从早期每个任务都需要细致沟通到现在发完任务基本就心照不宣了,也能独立完成很多任务了。比如 Ruff 的升级优化,目前川子对 Ruff 的了解程度已经仅次于我了,再比如 OpResult 方法的 patch 补全,以及动转静单测机制,基本都是川子独立完成的。对于大多数任务,现在我已经能放心地说:「川子,这个就交给你了」
    另外,「提前」说一下,川子贼有钱~

by 花花(Tulip-hua

  • author image
    花花
    我愿称川川为飞桨开源社区小天使

四、特别栏目——爱在何方之川川相亲帖

接下来,有请男嘉宾——小富哥儿川川来进行一段自我介绍✨。

  • author image
    🍢🍢
    报菜名环节,身高179cm,体重65kg(±5kg),来自福建厦门,2002年出生,目前在福州读书,不抽烟,不喝酒。性格有点太温柔了,不太凶得起来。对陌生人有点社恐,熟悉了之后就好很多。有一点点宅,但不会非常宅,还是会出去走走(不然咋拍照片🐶)。有一点点强迫症,比如下面这张798的照片好像有点歪了。喔对了川川不会做饭。期望伴侣,可以稍微e一点,拉着我出去玩🐶。(🍢🍢: 咱就是说还有几个月才到22,也不至于这么着急吧🐶)

有意者,请扫码加入快乐开源群,联系川川师傅(找头像即可)。

chuan-13

彩蛋 🥚

最后让我们欣赏一下川大摄影师的大作吧 📷

北京 798 艺术区
北京 798 艺术区
福州三江口大桥
福州三江口大桥
福州烟台山
福州烟台山
厦门中医院附近
厦门中医院附近

写在最后 💡

【开源江湖闲聊录】 是一项专门为 Paddle 社区的开发者打造的特色访谈栏目📚。在这里,我们邀请到每一位别具一格且富有热情的开发者,通过文字或语音的方式进行深入采访 🎙️,探索并展现他们背后独一无二的故事,将他们的经历、见解和创意整理成精彩内容,呈现给整个社区。


+ + + + \ No newline at end of file diff --git a/posts/first-post.html b/posts/first-post.html new file mode 100644 index 0000000..fdee652 --- /dev/null +++ b/posts/first-post.html @@ -0,0 +1,32 @@ + + + + + + 在这里,记录有趣的飞桨开源社区故事! | 飞桨开源社区博客 + + + + + + + + + + + + + + + + + + + + + +
Published on

在这里,记录有趣的飞桨开源社区故事!

Authors

这是一个半官方的飞桨开源社区博客,由社区成员自发维护,记录社区的有趣的故事,欢迎大家投稿。投稿方式:在 blog 代码仓库里提交 PullRequest 即可,Pull Request 会自动触发 CI,CI 通过后,你的文章就会被自动发布到这里。

感谢 001 @SigureMo 帮忙搭建了这个博客。

first-blog

+ + + + \ No newline at end of file diff --git a/posts/hackathon-5th-episode01.html b/posts/hackathon-5th-episode01.html new file mode 100644 index 0000000..201897b --- /dev/null +++ b/posts/hackathon-5th-episode01.html @@ -0,0 +1,31 @@ + + + + + + PaddlePaddle Hackathon Episode 01 | 第五期活动上线 4 周,直播圆满收官,三大赛道进展顺利 | 飞桨开源社区博客 + + + + + + + + + + + + + + + + + + + + +
Published on

PaddlePaddle Hackathon Episode 01 | 第五期活动上线 4 周,直播圆满收官,三大赛道进展顺利

Authors

向大家快速介绍飞桨黑客松第五期活动上线以来的进展(9.25-11.3)

为了吸引社区开发者了解与参与飞桨深度学习开源项目与文心大模型开发实践,为飞桨框架、套件、大模型、合作伙伴等生态进行开源贡献,进一步扩大飞桨开源生态与文心大模型应用生态,我们组织了 PaddlePaddle Hackathon 飞桨黑客松第五期活动。活动开展 4 周的进展速览如下:

  • 开源贡献个人挑战赛:发布 111 个开源贡献任务,包括框架、科学计算、套件和合作伙伴方向,与 OpenVINO™、海光、Arm、高通、Zilliz、开放麒麟社区、9#AISoft 等合作项目共同出品,109 个任务完成认领,60 个任务提交作品,13 个任务已经完成,感谢各位开发者的积极参与,感谢各位导师的及时 review。
  • 大模型应用与创意赛:作为飞桨星河社区五周年预热活动,目标挖掘优质文心一言应用,共发布趣味创意与生产力工具 2 个方向的任务,已有 12 名开发者产出基于 EB SDK 的应用 18 个,均已部署至飞桨星河社区
  • 飞桨护航计划集训营:发布 18 个框架与套件开发项目,1 对 1 带教形式,已完成 18 名学员招募,并提交第一期周报,是飞桨开源社区首次 Code Camp 形式的开源活动,由开发者担任助教

赛道一:开源贡献个人挑战赛

进度看板

任务方向任务数量提交作品 / 任务认领提交率完成完成率
热身赛117 / 1163.64%218.18%
框架 API 开发任务3122 / 3170.97%13.23%
框架其他开发任务1614 / 1687.5%637.5%
科学计算模型复现117 / 1163.64%19.09%
套件开发任务245 / 2320.83%28.33%
合作伙伴任务185 / 1727.78%15.56%

赛道亮点

  • 社区开发者参与热情高,活动发布 1 周认领率接近 100%,提交率 50%+;
  • Tomoko-hjf 开发黑客松小助手,自动更新任务榜单与看板,提升社区活动自动化水平;
  • 直播活动圆满收官,已形成完整的飞桨开源贡献视频资料,详见 issues#58125
  • 本次活动英特尔作为赞助方,并与 OpenVINO™、海光、Arm、高通、Zilliz、开放麒麟社区、9#AISoft 等合作项目共同出品。

参与提示

  • 在上面的看板中能看出来,套件开发任务和合作伙伴开发任务,提交率相对较低,欢迎社区的开发者选择这些任务来挑战~~

更多详情请查看 issue:https://github.com/PaddlePaddle/Paddle/issues/57262

赛道二: 大模型应用与创意赛

我们收到了 127 人报名,提交了 18 个应用,加精项目 10 个。

赛道亮点

  • 全新赛道,作为飞桨星河社区五周年预热活动,推广重点产品星河社区 ERNIE Bot SDK;
  • 完成情况符合预期,上线 4 周即提交 18 个 EB SDK 应用,作品种类多样,涵盖游戏娱乐、办公助手、知识科普等多领域,符合赛道初衷;
  • 社群气氛活跃,新老选手积极交流,且建立了沟通产研的 EB SDK 反馈文档。

参与提示

  • 欢迎大家继续发挥创意,提交更多有趣的应用。

更多详情请查看 issue:https://github.com/PaddlePaddle/Paddle/issues/57585

赛道三:飞桨护航计划集训营

18 个任务已全部完成招募,名单公示如下:

项目编号开源贡献 repo项目标题&介绍(点击链接跳转)导师学员
1Paddle算子规范和 ProgramTranslator 功能优化@kangguangli@xingmingyyj
2Paddle新 IR Pass 建设和依赖的核心组件完善@zyfncg@zhangyuqin1998
3Paddle新 IR API + 自动微分推全和核心组件完善@Aurelius84@MarioLulab
4Paddle组合机制前反向架构统一@cyber-pioneer@kevincheng2
5Paddle算子支持复数计算专项@GGBond8488@zyt1024
6Paddle量化算子集成@RichardWooSJTU@Wanglongzhi2001
7Paddle开源模型加速复现@xiaoxiaohehe001@DanGuge
8PaddleCPU 融合算子 / GPU 算子融合 pass@yuanlehome@Xinyu302
9Paddle动态图半自动并行架构研发@LiYuRio@HermitSun
10Paddle静态图半自动并行执行架构升级@From00@AndSonder
11Paddle分布式能力矩阵建设@zhangting2020@SecretXV
12Paddle全自动并行架构升级@Caozhou1995@Corle-hyz
13PaddleScience科学计算领域拓展专项@HydrogenSulfate@xusuyong
14PaddleClasClas 套件全流程建设@cuicheng01@psky1111
15Paddle3D3D 方向模型全流程建设@juncaipeng@kongdebug
16PaddleOCRNougat 复现及优化@tink2123@Frida-a
17PaddleNLPNLP 大模型复现@w5688414@rampage0303
18PaddleSlim套件压缩能力建设@shiyutang@ranchongzhi

集训营亮点

  • 飞桨社区首次以 Code Camp 的形式招募远程开发者,吸引到很多新人,2 周时间迅速完成学员招募与开营仪式;
  • 学员 MarioLulab 兼任助教,搭建开源项目 PFCCLab/Camp 管理开发进度与周报提交,已完成第一期,周报详见 [WeeklyReports] 2023.10.10~2023.10.24
  • 搭建技术分享平台:每周一次源码解读,顺利完成第一期,分享人 DrRyanHuang

参与提示

  • 欢迎大家到代码仓库: Camp 里围观集训营的同学们的工作。

更多详情请查看 issue:https://github.com/PaddlePaddle/Paddle/issues/57264

活动运营与推广

联合宣传

与开源中国、启智、OpenVINO、思否、开源社、示说、InfoQ、白玉兰开源、开源之夏等合作伙伴以及海光、Arm、高通、Zilliz、开放麒麟社区、9#AISoft 等合作项目联合宣传。

直播

多平台同步直播,10 场直播共计约 1.4 万人次观看,直播信息与学习资料已发布在开源社区,并整理成 AI Studio 专题课程: 深度学习开发指南——黑客松 5.0 - 飞桨 AI Studio 星河社区-人工智能学习与实训社区

日期主题观看总人次
10.16(周一)第五期飞桨黑客松来啦!1956
10.17(周二)新 IR Python API 适配升级967
10.18(周三)模型复现和贡献指南975
10.19(周四)OpenVINO 开源生态建设与贡献任务解析884
10.20(周五)动转静全套件适配任务989
10.23(周一)Arm 虚拟硬件助力边缘人工智能软件开发1887
10.27(周五)跨平台推理框架 InfiniTensor2049
10.30(周一)拓展 LLM 边界:使用向量数据库构建知识库2193
10.31(周二)Paddle 框架在昇腾平台上的推理优化分享1097
11.1(周三)飞桨硬件生态伙伴任务介绍420
+ + + + \ No newline at end of file diff --git a/posts/hackathon-5th-episode02.html b/posts/hackathon-5th-episode02.html new file mode 100644 index 0000000..be76734 --- /dev/null +++ b/posts/hackathon-5th-episode02.html @@ -0,0 +1,31 @@ + + + + + + PaddlePaddle Hackathon Episode 02 | 第五期活动上线 8 周,框架赛道提交率近 90% | 飞桨开源社区博客 + + + + + + + + + + + + + + + + + + + + +
Published on

PaddlePaddle Hackathon Episode 02 | 第五期活动上线 8 周,框架赛道提交率近 90%

Authors

向大家快速介绍飞桨黑客松第五期开展以来的进展(11.4-12.1)

为了吸引社区开发者了解与参与飞桨深度学习开源项目与文心大模型开发实践,为飞桨框架、套件、大模型、合作伙伴等生态进行开源贡献,进一步扩大飞桨开源生态与文心大模型应用生态,我们组织了 PaddlePaddle Hackathon 飞桨黑客松第五期活动。活动开展 8 周的进展速览如下:

  • 开源贡献个人挑战赛:发布 110 个开源贡献任务,包括框架、科学计算、套件和合作伙伴方向,与 OpenVINO™、海光、Arm、高通、Zilliz、开放麒麟社区、9#AISoft 等合作项目共同出品,全部任务完成认领,72 个任务提交作品,32 个任务已经完成,框架方向提交率近 90%,科学计算方向提交率 70%+,进展超出预期,感谢各位开发者的积极参与,感谢各位导师的及时 review。
  • 大模型应用与创意赛:作为飞桨星河社区五周年预热活动,目标挖掘优质文心一言应用,共发布趣味创意与生产力工具 2 个方向的任务,已有 22 名开发者产出基于 EB SDK 的应用 34 个,均已部署至应用中心
  • 飞桨护航计划集训营:共有 22 名社区开源开发者在社区导师的指导下,进行飞桨开源项目开发。 按期完成了两期双周报提交,完成了 3 期技术分享,成果全部沉淀到开源社区

赛道一:开源贡献个人挑战赛

进度看板

任务方向任务数量提交作品 / 任务认领提交率完成完成率
热身赛1110 / 1190.91%436.36%
框架 API 开发任务3128 / 3190.32%619.35%
框架其他开发任务1615 / 1693.75%1381.25%
科学计算模型复现118 / 1172.73%436.36%
套件开发任务246 / 2425.0%312.5%
合作伙伴任务175 / 1729.41%211.76%

赛道亮点

  • 尽管本期黑客松整体难度较往期提升,但社区开发者表现出了极大的专业能力和热情,任务已经 100% 被大家认领;
  • 框架方向提交率近 90%,科学计算方向提交率 70%+,均高于往期黑客松。

参与提示

  • 在上面的看板中能看出来,套件开发任务和合作伙伴开发任务,提交率依然较低,欢迎社区的开发者选择这些任务来挑战。

更多详情请查看 issue:https://github.com/PaddlePaddle/Paddle/issues/57262

赛道二: 大模型应用与创意赛

部分应用展示

我们收到了 270 人报名,提交了 34 个应用,在这里节选部分有趣的应用,欢迎大家在线体验。

赛道亮点

  • 社区开发者们基于文心大模型的 SDK: ERNIE Bot SDK,提交了种类多样,涵盖多领域作品,充分探索了使用文心大模型能做到的创意和创新。

参与提示

  • 欢迎大家继续发挥创意,提交更多有趣的应用。

更多详情请查看 issue:https://github.com/PaddlePaddle/Paddle/issues/57585

赛道三:飞桨护航计划集训营

活动进展

集训营的同学已经完成了两次开源开发的双周报: WeeklyReports 2023.10.25~2023.11.07WeeklyReports 2023.11.08~2023.11.21 和三次技术分享

集训营亮点

  • 集训营将整个过程以开源的方式公开和协作,学员和导师在线研讨和互相促进。
  • 社区开发者展现了极高的专业性和热情,详见导师点评:@Aurelius84@From00@RichardWooSJTU@Caozhou1995

参与提示

  • 欢迎大家到代码仓库: Camp 里围观集训营的同学们的工作。

更多详情请查看 issue:https://github.com/PaddlePaddle/Paddle/issues/57264

彩蛋 🎊: 欢迎大家线下来见面

本周六(12 月 2 日)14:00 - 17:00 在 北京 798 举行飞桨开源社区 meetup,报名问卷:https://paddle.wjx.cn/vm/m1OLk4E.aspx# ,欢迎大家来聊天,飞桨定制咖啡等你打卡,梦师傅和花花在咖啡厅等着大家~

hackathon-5th-pp-coffee

+ + + + \ No newline at end of file diff --git a/posts/hackathon-5th-episode03.html b/posts/hackathon-5th-episode03.html new file mode 100644 index 0000000..e9febb9 --- /dev/null +++ b/posts/hackathon-5th-episode03.html @@ -0,0 +1,31 @@ + + + + + + PaddlePaddle Hackathon Episode 03 | 创新碰撞,技术狂欢,飞桨黑客马拉松第五期活动圆满收官! | 飞桨开源社区博客 + + + + + + + + + + + + + + + + + + + + +
Published on

PaddlePaddle Hackathon Episode 03 | 创新碰撞,技术狂欢,飞桨黑客马拉松第五期活动圆满收官!

Authors

让我们看看哪些最强“Hacker”脱颖而出!

这是一次好奇心的远航,也是一场创作激情与团队协作的较量。

你懂技术,有想法,在这里可以尽情发挥!

我们希望你,不只埋头创造,一起享受不确定的乐趣,才能涌现意想不到的灵感和收获。

在这里,不止精益求精的竞技,去结识志同道合的小伙伴,去和研发导师 1V1 深度交流。

在飞桨黑客松的舞台上,创造力释放,“码”上见真章!

经过激烈的角逐,让我们看看哪些最强“Hacker”脱颖而出!

01 - 高手云集的飞桨黑客松活动

PaddlePaddle Hackathon 飞桨黑客马拉松(以下简称为“飞桨黑客松”)第五期活动自 2023 年 9 月中旬发布后,开发者热情响应,比赛历经三个月完美收官!

本次活动任务难度持续升级,飞桨联合 OpenVINO™ 等生态伙伴发布 100+ 开源贡献任务。赛制全新升级,本期黑客松活动在延续开源贡献个人挑战赛的基础上,首次探索以 Code Camp 形式组织开源活动,1 对 1 带教形式,并由开发者担任助教。并发布全新赛道——大模型应用与创意赛,基于文心大模型,创意无限,打开想象力,开发 AI 原生应用。

共有 800+ 位社区开发者参与到飞桨黑客松中,160+ 支队伍进行任务认领,本期黑客松活动在任务完成数量、参与团队规模、项目类型丰富度等方面均有提升,足可见开发者们建设飞桨和文心生态的热情。 我们期待这些开发者团队持续在飞桨开源生态中迸发出光彩和力量,与飞桨一路同行,一起建设更优雅的飞桨开源社区。

02 - 三大赛道 开源贡献

飞桨与生态伙伴携手,发布了三大赛道共计 26 个方向的开源贡献任务,从框架开发、模型套件开发、论文复现、硬件部署到产业应用任务应有尽有。开发者们结合自己的兴趣与能力在不同方向为飞桨做出重要贡献,感谢你们!

开源贡献个人挑战赛

发布 124 个开源贡献任务,包括框架、科学计算、套件和合作伙伴方向,与 OpenVINO™、海光、Arm、高通、Zilliz、开放麒麟社区、9#AISoft 等合作项目共同出品,120 个任务完成认领,96 个任务提交作品,85 个任务顺利完成,完成率 70%,感谢各位开发者的积极参与,致敬每一个开源贡献!

在第五期飞桨黑客松个人挑战赛中,开发者们码力全开,共计为飞桨新增 50+ API,增加 6 组共计 120+ API 转换规则,15 个 PHI 算子迁移、4 个分布式切分推导规则和 3 个转换函数,完成 9 篇 AI4S 领域论文代码复现,为大模型套件 PaddleMIX、PaddleNLP 及计算机视觉套件 PaddleSeg、PaddleClas、PaddleDetection 新增 10 个重要模型或新功能,为全套件模型接入动转静训练功能,为飞桨开源社区伙伴 OpenVINO™、Arm、InfiniTensor 新增 12 个新功能。

注:部分任务还有细节需要沟通,暂未完成 PR 合入,请锁定任务的开发者尽快完成 PR 合入哦~

更多详情请查看 issue:https://github.com/PaddlePaddle/Paddle/issues/57262

大模型应用与创意赛

作为飞桨星河社区五周年预热活动,共发布趣味创意与生产力工具 2 个方向的任务,鼓励开发者发挥想象力和创新精神,构思基于文心大模型的创意方案,开发创新应用,从技术创新到应用实践,共有 37 名开发者产出基于 EB SDK 的应用 60+ 个,作品种类多样,涵盖多领域,欢迎大家进入飞桨星河社区应用中心体验。

趣味创意赛道一等奖作品:AI 数字人 | 数字诗人&数字发言人&数字人聊天

生产力工具赛道一等奖作品:【Hackathon 5th】基于文心一言的日报系统

更多详情请查看 issue:https://github.com/PaddlePaddle/Paddle/issues/57585

飞桨护航计划集训营

发布 18 个框架与套件开发项目,1 对 1 带教形式,完成 18 名学员招募,共计提交 4 期周报,组织 5 期技术分享会,9 名学员进行技术分享,15 名学员通过考核。这是飞桨开源社区首次 Code Camp 形式的开源活动,所有学习笔记与周报记录留存在开源项目 PFCCLab/Camp 中,欢迎大家围观交流

集训营开源项目地址:https://github.com/PFCCLab/Camp

本期飞桨护航计划集训营开发项目内容硬核,既包括自动微分、新 IR Pass、自动混合精度、组合机制前反向统一、量化推理、算子类型扩展到复数、分布式能力建设与架构升级等核心组件开发工作,还有科学计算领域拓展专项、套件压缩能力建设、多模态大模型全流程建设等重要套件能力建设工作,营员们的开发能力、开源热情与丰富成果不仅得到了各位导师的高度认可,也获得了研发经理的肯定,3 名同学获得百度正式实习生 Offer。

更多详情请查看 issue:https://github.com/PaddlePaddle/Paddle/issues/57264

03 - 飞桨黑客松完成榜单

2023 PaddlePaddle Hackathon 飞桨黑客马拉松第五期由深度学习技术及应用国家工程研究中心主办,飞桨承办,英特尔作为顶级赞助方,OpenVINO™、华为、海光、Arm、高通、Zilliz、开放麒麟社区等共同出品,以线上认领任务的形式进行。 本次共有三大赛道:开源贡献个人挑战赛、大模型应用与创意赛、飞桨护航计划集训营。根据开发难度分为基础任务和进阶任务,为大家提供丰富的深度学习开发体验。对飞桨黑客松第五期公示榜单如有异议,请于 2023 年 12 月 25 日 24 点前反馈至 paddle-hack@baidu.com ,我们将在 12 月 26 日前对您的异议进行复核反馈。

hackathon-5th-track-1

hackathon-5th-track-2

hackathon-5th-track-3

恭喜完成开发任务的团队,将获得任务对应奖金以及飞桨黑客松结项证书,同时也可以获得百度招聘绿色通道。

04 - 新的身份等你点亮

在参与飞桨黑客松活动时,部分开发者们向飞桨框架提交 PR(Pull Request)参与开源贡献,成为飞桨框架的贡献者,并且有意愿为飞桨框架做出持续的贡献。他们接受了来自 PFCC 的邀请,正在用自己的方式参与飞桨框架建设,与飞桨共同成长。如果你也热爱开源、如果你有意愿成为飞桨开源社区的 Contributor,就快加入 PFCC 吧!

关于 PFCC

PFCC 全称 Paddle Framework Contributor Club ,意为飞桨框架贡献者俱乐部,是一个有兴趣、正在或者已经为飞桨开源框架做开源贡献的贡献者成立的虚拟组织。在这里,飞桨开源框架的贡献者进行讨论、交流和分享,并为飞桨框架做出持续的贡献。如果你有意愿加入我们,请发邮件到 ext_paddle_oss@baidu.com,在邮件中附上自己的 GitHub ID、贡献详情与联系方式,会有工作人员邀请你加入。

加入 PFCC,与我们一起参与到飞桨框架的开发中吧!

戳这里看飞桨开源社区故事 ➡️ https://pfcc.blog/

原文链接:https://mp.weixin.qq.com/s/Yjvwj8br84sPard1lLoNOQ

+ + + + \ No newline at end of file diff --git a/posts/huanggua-story.html b/posts/huanggua-story.html new file mode 100644 index 0000000..98cc53e --- /dev/null +++ b/posts/huanggua-story.html @@ -0,0 +1,32 @@ + + + + + + 【开源江湖闲聊录】初中生也能当开发者❓少年黄瓜的开源奇遇记 | 飞桨开源社区博客 + + + + + + + + + + + + + + + + + + + + + +
Published on

【开源江湖闲聊录】初中生也能当开发者❓少年黄瓜的开源奇遇记

Authors

他来了,他来了,他带着满满的故事,迈着自信的步伐向我们走来了!虽然刚满 15 岁,但小小黄瓜的开源史却已有好几年!学校趣事?开源经历?迷人帅照?成山作业?你都能在本篇博客看到!

一、前言

Berniehuang2008(人送外号:黄瓜),是深圳一位 15 岁的初中生,同时也是 OpenTeens(全国甚至全世界第一个青少年开源社区)创始人之一。黄瓜曾贡献过开源项目 SearXNG 和 GestureX 等,是一位优秀的青少年开发者。他在 10 月加入 Paddle 社区,并且以迅雷不及掩耳之势合入 PR,成为 Paddle 社区的 contributor。现在,他正在准备参加 Paddle 黑客松,让我们一起看看他的故事吧😀~

二、采访内容

  1. 简单介绍一下自己吧!

    • author image
      黄瓜🥒
      我叫黄锦源,外号黄瓜,是深圳的一个初三学生。
  2. 现在是一名初三学生,课程学习忙么?有什么喜欢的科目没有?😁😁

    • author image
      黄瓜🥒
      忙啊,当然忙。每天周考,从四点半考到六点,放学回家一堆卷子烦的要死。最喜欢的是数学,没有原因,就是喜欢😳。
  3. 学校最近有什么有趣的事情可以和大家分享一下!

    • author image
      黄瓜🥒
      emmm,有趣的事情?没啥,天天考试有啥有趣的。。。不过昨天我还骑车来着,扫了一辆小黄车就一路骑到深圳湾,14 公里,挺开心的。我们几个朋友还去烧纸,哇塞,烧数学书真解气!(黄瓜自注:我们数学课从来不用书)
  4. 当初你是如何被编程和开源世界吸引的?是什么驱使你成为了一名青少年开发者和开源社区创始人呢?

    • author image
      黄瓜🥒
      我是从 Scratch 学起的,一开始就感觉 Scratch 这玩意很有意思,想让他干啥他就干啥,有一种掌控世界的感觉。后来,Scratch 写了一百多个游戏之后玩无聊了,转行 Python,才发现这玩意比 Scratch 好玩 10086 倍!
      初一的时候,被我们学校信竞老师征召入伍,但我对竞赛类的东西不感冒,学了一年就退坑了。
  5. 之前看你的 GitHub 主页里,有对 SearXNG 提交过 PR,这是一个怎样的项目?你在 SearXNG 项目中的具体贡献是什么?你最喜欢的部分是什么?这个经历让你有什么样的收获?

    • author image
      黄瓜🥒
      SearXNG 是一个开源的搜索引擎,我当时对搜索引擎算法特别着迷,就找了一个,最后发现这玩意就是从 Google、Bing 上面爬数据然后整理!
      不过既然点进去了,索性就帮他们修个 bug 吧,结果这就成为了我第一个参与的开源项目。现在越做越深入,跟 Maintainer 已经算得上认识了 hhh

    编者注✍️:现在初中生都已经开始接触算法了吗!

  6. 除了在 SearXNG 项目中的贡献,我发现你还设计了一些开源小程序(eg:Dairy APP),能否分享一下你最引以为傲的作品是什么?你觉得这个作品的意义是什么?

    • author image
      黄瓜🥒
      addd,Diary app 确实是我前几周的重点。我比较喜欢创新新功能,比如说一打开就弹出一篇以往的日记,配上符合当时心情的音乐,让你朝花夕拾一下。
      现在嘛,我写了一个 Python 库,叫做 MercurySQLite,提供了一个高级的接口,能不用写 SQL 语句就能操作数据库,贼方便告诉你。
APP
Dairy APP 部分截图
  1. 你如何了解到 Paddle 社区的,是什么吸引你加入这个社区并开始贡献?可以分享一下你和 Paddle 社区的小故事么?

    • author image
      黄瓜🥒
      我也忘了第一次看 Paddle 是哪年了。。。不过当时我应该处于“AI 发烧友”阶段。后来,一年前?文心不是火了吗?我就想再看看 AI,就算是对 Paddle 有了一个大概的了解吧。
      直到今年的中国开源年会,我不是办青少年分论坛吗?我们接下来就是教育分论坛,然后我听了梦老师的演讲,觉得“快乐开源”这档子活动挺有意思的。
      其实我几个月前看过黑客松,那玩意儿实在是太难了做不来,但是快乐开源就挺好的啊,又不难,改文档也能学到很多,比如说文档的语法之类的,我的那个 SQL 项目文档就是受到了这个的启发。。
  2. 加入 Paddle 社区后的第一次合并 PR 经历如何?有没有什么有趣的插曲或者教训🤓🤓🤓🤓?

    • author image
      黄瓜🥒
      哈哈哈,第一次我故意挑了一个最简单的任务做,只有几行代码,属于是投机取巧摸鱼了。。不过第二次——也就是现在正在进行的 PR——没那么轻松了。原文档的格式超级乱,我都不理解他是什么意思。然后又是 CI 的报错看不懂。。。现在差不多改完了,还有亿点点小问题,也快了

    编者注✍️:文档任务很适合刚接触 Paddle 的开发者们,而相关的 PR 也很可能是大家在 Paddle 的第一个 PR。感兴趣可查看 ➡️文档 Docathon 系列任务

  3. 你觉得今后 Paddle 社区对你的个人成长和技术发展有何影响?

    • author image
      黄瓜🥒
      Paddle 社区的技术实力肯定是没得说的。能跟这么多大佬在一起,我觉得不管是现在还是未来,都会对我有很大的影响。就比如说吧,虽然我现在还没有深入地接触到 Paddle 的技术层面,但是我只是在 PFCC 那个群里面苟着,就能学到很多东西,比如说 Paddle 的 CI 啊、代码规范啊之类的。
      然后我准备试着,只是试着哈,参加下一次的黑客松,或者是黑客松简单版。我相信,只需要一次任务,就可以把那一块的相关知识掌握熟练,然后社交技能也可以上来,这绝对是一举两得。
  4. 作为一名青少年开发者,你一般是如何学习技术的,听说你曾经以 AI 学 AI?哈哈哈~~

    • author image
      黄瓜🥒
      以 AI 学 AI?试过,但是效果真的不咋地。那时候 GPT3.5 才刚出来,我问他啥都是乱答的。所以我还是觉得以前的学习方式比较好。我喜欢那种“在实际应用里学习”。也就是说,给我一个应用场景,或者是项目,然后我先想该怎么实现,遇到哪里有不懂的技术问题,再去搜,再去问别人(当然,嫌麻烦的话就问 AI /doge)
      我觉得这样的学习效率是最高的。
  5. 在你的同龄人中,有多少人对编程和开发感兴趣?你是如何看待青少年参与开源的?

    • author image
      黄瓜🥒
      我的同龄人。。。如果你指的是我们学校的话。。。那么应该不多,应该不超过五个。所有学计算机的,基本上都是为了信竞。剩下的为数不多的四五个人,也只是用 GitHub 找找东西,玩玩游戏而已。
  6. 你对于即将参加 Paddle 黑客松有什么样的期待和目标?你希望在黑客松中取得什么样的成绩?

    • author image
      黄瓜🥒
      我的目标就是试一下,看看自己的水平在哪,然后顺便学一些知识。所以?只能期待题目不要太难了 hhh
      至于成绩嘛,我也不奢求,能得一颗星就算是重大成就了,如果我是“有技术的”,也许可以尝试 may be 多弄一点星???
  7. 那么在整个开源学习中,对你影响最深的是谁?为什么?(🤔🤔🤔)

    • author image
      黄瓜🥒
      这个问题很难答啊 hhh,说谁都不太好。
      但是如果要说真话,这就必须提到 SearXNG 那个搜索引擎的 Maintainer。他特别有耐心,还跟我闲聊,那段时间我初出茅庐啥也不懂,要不是他,我到现在还没入门呢!
      当然啦,我必须希望以后能有更多影响我的人,超越他,对吧?
  8. 对于其他年轻开发者来说,你有什么建议?或者你想鼓励他们参与到开源社区,特别是 Paddle 社区中么?

    • author image
      黄瓜🥒
      我觉得开源社区的一大魅力就在于“社区”——你永远可以找到帮助,永远可以与志同道合的人一起 coding,Paddle 社区更是一个典型。
      在 Paddle,如果你有什么问题——无论白痴问题还是神级难度——都会有人来看,都会有人来帮助你解决。
      我觉得 Paddle 的一大优点就是他是任务式的这种贡献机制。你可以选择各种不同难度的任务,循序渐进,慢慢提升自己。任务式贡献也可以让你有一个明确的目标,甚至是一个明确的思路,该怎么解决这个问题。

三、生活中的点点滴滴——黄瓜篇

life
黄锦源同学的日常
homework
黄瓜的作业
cat
黄瓜的猫🐱
+ + + + \ No newline at end of file diff --git a/posts/huangjiyi-story.html b/posts/huangjiyi-story.html new file mode 100644 index 0000000..41ef1ef --- /dev/null +++ b/posts/huangjiyi-story.html @@ -0,0 +1,32 @@ + + + + + + 【开源江湖闲聊录】从入门到入职(入土):黄师傅的校招 offer 指南! | 飞桨开源社区博客 + + + + + + + + + + + + + + + + + + + + + +
Published on

【开源江湖闲聊录】从入门到入职(入土):黄师傅的校招 offer 指南!

Authors

从积极参与社区开源任务,到加入飞桨成为 (练习生) 实习生,到最终正式成为飞桨研发团队的一员。以兴趣为起点, 黄济懿师傅 将我们展示了一条通往职业的道路,希望他的故事能够激励所有对开源充满热情的开发者们。接下来,原神启动 🚀!

一、前言

黄师傅是一个地地道道的江西人,喜欢吃辣🌶️🌶️🌶️。他本科研究生都就读于广州的华南理工大学,现为电子信息专业,即将毕业前往 Paddle 工作。作为一名研究僧,他在空余时间喜欢吃吃美食或者玩玩游戏,像是原神/LOL/金铲铲之战(各位要是也在玩,可以找黄师傅哦~黄师傅求大佬带带!!)。

偷偷告诉你们:黄师傅最近的主线任务就是毕设,请务必多找他打游戏让他延毕(不是)

去年 11 月,他出于对深度学习框架的底层实现的兴趣,联系花花加入了快乐开源群。在这一年里,他陆续完成社区里各项开源任务以熟悉 Paddle 框架,期间他也把握住了来飞桨实习的机会,他不断积累开发经验,不断加深对 Paddle 的理解,最终,他通过了飞桨团队的面试,成功拿下了飞桨校招 offer!

黄师傅曾说:"我将继续在飞桨开源活动完成一些任务,希望能够学到更多的同时也能为飞桨的建设做出小小的贡献"。事实上,黄师傅曾分别参与了 PHI 算子库独立编译算子定义自动生成Fluid Kernel 函数式改造等多个快乐开源活动项目以及飞桨框架护航计划,到目前为 Paddle 贡献了 100 多个 PR。抛开实习生和正式员工的身份,黄师傅自身也是飞桨社区的自发贡献者和推动者。接下来,就让我们来瞅瞅黄师傅的精彩 Paddle 之旅吧!!

原神,启动!!(请读者自行脑补 BGM)

huangjiyi-01

二、采访内容

  1. 介绍一下自己吧,黄师傅!(●'◡'●)

    黄师傅: 我的 AI Studio 和 GitHub 的账号是 huangjiyi,也是我名字的全拼(黄济懿)。

  2. 可以简单和大家分享一下你生活中有什么兴趣爱好吗⊙o⊙(游戏、旅游、运动等等)?

    黄师傅: 我就是个死宅,平时就是打打游戏,刷刷 B 站,出门也就是找点好吃的。

  3. 听说你本科研究生都在华南理工大学,你们学校周围有什么好吃的啊?🍔🍟🍿🥯🥪🥗🎂🍬🍹🍉

    黄师傅: 因为在华工太久学校食堂已经吃腻了,我会经常出校找点吃的,但活动范围有限,学校周边我吃过比较好吃的不多,就川菜小炒、麻辣香锅、鸡公煲、螺狮粉、泰国菜这些。

  4. 我了解到你平时有在玩 LOL,那么如果把 Paddle 比作一个英雄🦸,你觉得它最像谁?为什么嘞?

    黄师傅: 我的答案是维克托,我的想象力有限,我只是觉得维克托的技能是会进化的,而 Paddle 也是在不断进化(更新)和扩展的,另外在维克托的背景故事里,他发明了很多具有智能的机械,比如蒸汽机器人,这和我们用 Paddle 来做的事比较相关,我只能想到这么多了。

维克托形象
维克托
  1. 你在加入飞桨开源群之前对 Paddle 的了解是什么样的?有没有听说过一些关于 Paddle 的传闻或者故事?

    黄师傅: 我在加入飞桨开源社区之前,我主要是一个用 PyTorch 跑深度学习实验的研究牲,对 Paddle 的了解也是和 PyTorch 类似的深度学习框架。关于 Paddle 的传闻的话像是国内最早开源的深度学习框架,以及国内最好的深度学习框架。

  2. 你第一个在 GitHub 上完成的 PR 是关于什么的呢?在 PR 的过程中你遇到了什么难题吗?

    黄师傅: 我第一个在 GitHub 上完成的 PR 是 PHI 算子库独立编译开源活动的一个子任务,只需要进行简单的代码替换,没有遇到什么难题,只是第一次改这么大项目的代码有点担心会不会改出什么问题。

    编者注✍️:【PHI 算子库独立编译】是飞桨开源社区的快乐开源活动之一~我们社区有很多类似的、名字听起来很高大上但实际上难度不大的开源活动

  3. 你觉得 Paddle 相比其他深度学习框架有什么优势?可以举个例子么?

    黄师傅: 其他深度学习框架我主要使用过 PyTorch,从用户的视角来比较的话,Paddle 具有丰富的中文文档,包括一些 API 文档和框架开发的技术文档,同时在 AI Studio 上有很多开发者分享的基于 Paddle 实现的项目和以及开发心得可以参考,这些对于国内用户十分友好。另外 Paddle 还有很多开源的套件,用户能够使用这些套件更快地完成一些深度学习应用任务。

  4. 飞桨的开源活动中,你完成的任务中有没有什么特别有趣或者有挑战性的项目?有没有什么技术难题让你觉得很兴奋或者很有成就感?

    黄师傅: 我参加过的很多关于框架开发的开源活动都比较有挑战性,期间遇到的一些困难主要是一些编译问题,然后在通过调试定位问题所在代码、弄清楚问题原因、最后解决问题的时候会比较有成就感。

  5. 据了解,你接触 Paddle 已经有一年多,那么你最欣赏 Paddle 团队中的哪些特点或价值观?为什么?

    黄师傅: 我比较欣赏的一点是 Paddle 团队非常重视开源社区生态,这一点从丰富的社区活动可以看出来,社区开发者可以从中学习到很多东西同时能够获得丰厚的奖励。

  6. 我记得你说过花花和涛姐给了你很多帮助,你觉得他们是怎样的人呢(分别说说🫶🫶)?为什么?

    黄师傅: 花花:飞桨最美运营,关键人家还很努力。 涛姐:为了让开发者能一直有新鲜热乎的开源任务做操碎了心。

    编者注✍️:花花是飞桨社区顶尖运营,涛姐是飞桨社区顶尖研发。

  7. 你是怎么获得去 Paddle 实习的机会的呢?

    黄师傅: 关于我如何获得去 Paddle 实习的机会,当时我刚开始做了一些开源任务,然后在和花花交流的时候以一种半开玩笑的语气问花花能不能去实习,结果没想到花花真的和涛姐提了,然后涛姐真的申请了,飞桨真的给我面试了,然后我面试也真的通过了,然后我就去实习了,一切都是这么突然。

    编者注✍️:其实目前已经有相当多的社区开发者,通过参与开源活动接触到 Paddle,并最终获得实习机会。另外,对于不方便线下实习的同学,我们也提供了远程实习的方案,可以了解往期【护航计划】。

  8. 在 Paddle 实习的时候,你是否参与了某个具体项目的开发?可以分享一下你在项目中的具体角色和贡献吗?

    黄师傅: 我在实习期间刚开始是接着之前在社区参加的 PHI 算子库独立编译开源项目,完成剩下的一些比较困难的任务,花了一个多月的时间完成,剩下的大部分时间参与了结构体 Kernel 注册统一这个项目,期间也会接到一些其他小任务,一共实习了 3 个月吧,基本状态是要我干啥干啥,不会的就问。

  9. 你认为实习那段时间你最大的收获是什么?你认为这段实习经历对你以后的职业生涯规划有起到什么影响?

    黄师傅: 收获很多,体验到了与在学校实验室不同的工作氛围,认识了一些研发大佬,深入了解了 Paddle 的一些机制,积累了一些编译调试和解决问题的经验。在 Paddle 的开源经历和实习经历让我找工作的目标从算法工程师转向了开发工程师,相比于具有不确定性同时很多时候凭借直觉的深度学习算法研究或者应用工作,我发现我更喜欢逻辑性更强且大多数问题都能找到原因的开发工作。

  10. 最后也恭喜你拿到 Paddle 的 offer 🎉,对于同样有志加入 Paddle 团队的学生党,你可以分享一些建议议、经验或者成功路径吗?

    黄师傅: 我感觉我能拿到飞桨 offer 很大一部分原因是我在飞桨的实习经历和参加了一些开源活动,所以我的建议是在学习技术的同时多参加飞桨的开源活动,或者有机会去飞桨实习。

offer
黄师傅的校招 offer 部分截图

三、“著名平台——虎扑评论”专区

这次,我们邀请了一些和黄师傅有过合作经历的朋友们(以及实习期间的导师🐶),贡献一下和黄师傅相关的故事,或者他们对黄师傅的评价~以下均为真心话,请放心看!

编者注✍️:黄师傅有些社恐,所以认识的社区朋友不多,大家正好可以借此机会认识一下。

by 涛姐(luotao1

  • author image
    骆涛
    我觉得黄师傅是运气真好,类似张无忌,各种捡到宝,当然实力也是重要的。他刚来的时候其实对深度学习框架基本上不了解,然后我们快乐开源刚好放了第一个大任务-phi算子库(解决 CMake 依赖不需要懂深度学习框架)。然后他做啊做,问我们有没有机会来实习,当时 hc 太太太少了,但我们刚做起来,就给他申请,然后他就开挂了

by 日升(YuanRisheng

  • author image
    元日升
    这位同学的工程素养很高,学习能力很强,经常超预期推进项目,最近独立完成高难度项目:飞桨 Flags 工具库建设,开源成果丰硕。另外也是原神大佬,工作累了还能带你打游戏,梦幻队友。

by 花花(Tulip-hua

  • author image
    花花
    原神60级大佬!还欠我一次开源社区分享,请记得!
花花的证据
黄师傅欠花花一次分享的证据(花花强烈要求贴上来的)

四、生活中的点点滴滴——黄师傅篇

  • author image
    黄师傅
    一张螺狮粉照片,一张游戏截图,这两张图片就代表我大部分的生活了,我也就是个喜欢吃点美食、打打游戏、敲敲代码的普通人。
螺狮粉
黄师傅力荐的他认为广州最好吃的《周成芝螺蛳粉》!
原神抽卡
谁懂十连双黄的概念?黄师傅玩几年原神了就这一次

写在最后 💡

【开源江湖闲聊录】 是一项专门为 Paddle 社区的开发者打造的特色访谈栏目📚。在这里,我们邀请到每一位别具一格且富有热情的开发者,通过文字或语音的方式进行深入采访 🎙️,探索并展现他们背后独一无二的故事,将他们的经历、见解和创意整理成精彩内容,呈现给整个社区。


+ + + + \ No newline at end of file diff --git a/posts/limin-story.html b/posts/limin-story.html new file mode 100644 index 0000000..372a507 --- /dev/null +++ b/posts/limin-story.html @@ -0,0 +1,32 @@ + + + + + + 【开源江湖闲聊录】躺平健身搞开源:敏师傅的三十而立 | 飞桨开源社区博客 + + + + + + + + + + + + + + + + + + + + + +
Published on

【开源江湖闲聊录】躺平健身搞开源:敏师傅的三十而立

Authors

从对 Git 一窍不通到如今能够丝滑完成黑客松赛题,从曾经历鬼门关的生死挣扎到现在能够轻松跑几公里不喘气,从毕业于武大国软学的有志青年到佛系养生的新时代躺平中年,敏师傅 的人生经历就像是那瓶经年陈酿的老酒,醇厚细腻、回味无穷。

一、前言

是谁,天天说自己是 “老咸鱼” ?是谁,戏称自己是 “快奔 4️⃣的老头子”?又是谁,自诩为 “摸🐟王者“?是他、是他、就是他~我们的朋友——敏师傅!!!

limin-01

匿名回复: 我没有,假的,都是假的

敏师傅毕业于武汉大学,目前在珠海某甲方企业工作。作为新时代中年人,敏师傅和许多开源者一样,喜欢躺平、宅家、吃吃吃!但敏师傅不仅喜欢吃,还喜欢做。不仅喜欢做,还擅长烹饪各式各样的美味佳肴,堪称“当代好男人”(敏:“相对的,比群里其他大佬差距还很大!”)、“顶级家庭煮夫”、“万千少女的理想老公🫰❤️(敏:“不是不是,我有主的,理想厨子是真!”)连米国五星上将麦克阿瑟见了都评价道:“不是米其林大厨请不起,而是李敏更具性价比!”

后文有敏师傅的厨艺展示哦~

在健身养身方面,李敏师傅也颇有经验。给他一根杠铃杆,他能撬动整个亚欧大陆!给他一套跑步装备,他能漫步宇宙!著名物理学家阿基米德曾说:“李敏所创造出来的物理奇迹足以改写人类此前所有的力学研究!”无论是极限深蹲、恐怖硬拉还是痛苦卧推,在李敏的面前都不过是老八进厕所手到擒来!

匿名回复: 没有没有,都是瞎说的,手无缚鸡之力!

而在开源方面,作为一个非专业的开源开发者,敏师傅从学习如何提交 PR 做起,到加入 Paddle 的 API 文档修改组,再到后面又积极参加一系列快乐开源活动和更具挑战性的黑客松。正如敏师傅所说:“自己在 Paddle 就像打怪升级一样做各种任务”。在这段 Paddle 的这段旅程中,他一点点精进了自己的技术,也结识了许多热爱开源的小伙伴。接下来让我们去瞧瞧这位多才多艺的“摸🐟老头子”(just kidding😉😉😉)!

左图:李敏师傅
左图:李敏师傅
右图:水群摸鱼日常
右图:水群摸鱼日常

二、采访内容

  1. 介绍一下自己吧,敏师傅!

    敏师傅: 各位大佬好,专业摸鱼,日常躺平晒太阳的咸鱼就是我了。身高 183,体重 170。老胖鱼一条。

  2. 敏师傅说个人爱好之一是宅,那么平时宅在家干什么呢?

    敏师傅: 宅家追剧,鉴于囊中羞涩,又秉持开源,所以都是看免费的(大家不要学我,要支持正版,知识产权法在头顶)。有时会神经质发现地脏,就做个简单的扫除;有时就去公园跑跑步、做做拉伸,尽量让自己活的久点,要不然养老金白交了;要么小主想逛苍蝇馆子,就祭出地图精准定位去吃,吃完回家。

  3. 你曾经有提到在机器学习的过程中自己差点 “见了太祖”,请给大家分享一下这次惊险的经历😮

    匿名回复:不是学习中,是那会刚好在学基础,我出事跟学习无关啊~

    敏师傅: 某年,我在工作中,可能因为淋雨作业、感冒,加上伙食里有沙吧...多种原因叠加在一起,一天上午在办公室突然感到头昏。一开始估摸自己是低血压了,就去卫生队让值班人员量了个血压,结果 40/20。我估计自己身体出了大问题,赶忙让他们打了针 NE,然后喊队长把我送医院。

    到了医院迷迷糊糊的,不敢让自己睡着。一天下了 3 张病危,好像是急性胆囊炎合并肺炎,附加胸腔积液。指标各种超标,医生也不敢手术,一直发烧,让医生给打了丙球续命,中间因为升压药泵注射漏了,整个胳膊肿得不像样,让护士帮忙买土豆切片敷那吸收了才完事,同为三甲,简直了。

    过了 5 天医生估计受不了了,让转广州医院,还好领导派了个人跟着,就整了个车把我送到广总。那边直接说割胆囊,我怕,就说保守治疗,主任也同意了,就在广总住了一个多月。抽血都抽了三四十管,也没查出来病因,多科会诊好几次,像实验体一样躺着被几十人围观好几次。最后我看化验单,连非洲的传染病都查了,结果全是阴性。也就不了了之保守治疗了。先住传染科,然后呼吸内科,然后心内科。反正躺床上被推来推去,哈哈哈。

    那一个多月禁食,每天就是打营养针。就记得那脂肪乳,一瓶能打几个小时,每天从上午 8 点打到晚上 8 点。最后几天,医生才让吃流食,粥都不能喝,只能喝粥上面的米汤,唉。然后回到单位吃了半年的过汤菜(就是把所有菜都放水里洗洗尽量没有油),肚子上的肉都没了,皮都耷拉下来了😂

    编者注✍️:真・大难不死,必有后福啊。不过咱们社区开发者怎么什么离奇的经历都有...?

  4. 听说敏师傅的工作经历也非常曲折有趣,能具体说说么?

    敏师傅: 这个,也没啥。毕业稀里糊涂进了某集团,一开始说干计算机的事,结果一点不沾边,各种其他技能点点了个遍。架设卫星锅,招待上级,液压系统维修,汽车机油液压油更换,气路维修,强电弱电架设,挖坑种树等各种。

    全国各地的沙漠,森林,海岛跑了大半,格尔木睡沙漠,半夜帐篷被吹飞去追帐篷,靖宇睡森林,半夜下暴雨水淹帐篷急忙转移,跟着护林工逛森林,吃野果,挖人参,烧松子,反正东北比西北好玩的多。海岛就懵了,坐船就吐的昏天暗地,然后各种晒脱皮,最难受的地儿。

    后面几年总算是接触计算机,做了个仿真训练系统,抄了一堆网站,各种借调打黑工。然后就想着赶紧滚蛋啥都不想干了,躺平。后面就是学机器学习,接着住院,接着佛系养生。

  5. 你最早接触开源是在什么时候?

    敏师傅: 大学吧,那会为了看越狱、迷失、危机边缘那些。好用的播放器不多,关键是字幕。射手网开源了个播放器,就 SVN 拿下来看了看,支持各种制式视频,最大的特点是可以在线搜索字幕源并选择,在那个 RealPlayer 的年代,真的是非常的优秀。

  6. 那你又是怎么加入到 Paddle 社区的?您对于开源社区的价值和意义是怎样理解的?你认为这些价值和意义在 Paddle 社区又是如何体现的?

    敏师傅: 好像是查飞桨文档学习时,梦师傅的文档修改任务,然后就上了大船。 我觉得在国内做开源真的挺不容易,毕竟开源在绝大部分人认为就是免费,其实也就是免费,而且大家都信奉拿来主义,开源协议那块也不关心。开源需要投入的人力物力财力都是不小的,投入少了,社区和维护不够,BUG 就多了。但绝大多数软件,都是从开源起家的,操作系统、中间件、数据库、应用软件等等,所有层面都有开源的身影,是开源让计算机发展的更迅速,微软都不得不妥协进行开源,可想开源的力量。

    价值和意义的话,就用我接触的几个大佬概括下吧:

    • 涛姐,我所接触到飞桨负责开源的最高级别人物。涛姐从研发那割下来的开源任务,要考虑到我们的能力,不能太难,适众面又要广泛,对应负责的研发还要 Review,都是增加飞桨内部的工作量。然后做黑客松题目时发现,题目所需的,可以把开源题目串起来。这时才发现涛姐选题的前瞻性、系统性、大局观。对整体框架的全局把握才能轻车熟路深入浅出的发布出我们能做的题目。可想而知涛姐的能力有多强 👍。

    • 梦师傅花花,运营的核心 CP,原文档负责人,从任务发布、统计信息、数据到对接第三方,做过统计上报的都能懂,那就是个磨人想砸键盘的活,我们一堆人是一个个点,她们那是一整个面,但凡报上去的信息不对,就是反复的核实修改,线下的活动也组织的有声有色,从历次活动照片能看出参与者欢快的笑容,也反映出组织者的能力有多强。

    • 孙师傅,现 Docathon 发起人和文档总负责任。虽然他总是潜水,而且使用者总说文档有错误。但反过来看,那还不是因为 API 更新快,参数修复多。孙师傅负责的是很庞大的费眼睛的项目,代码嘛,能跑就行,有的使用者只关心 API 怎么用。但文档,是所有人必须要看的,严谨系数其实比代码要高的多,孙师傅劳心劳力确实不容易。

    编者注✍️:梦师傅是产品经理,不是运营哈哈哈。另外,我潜水是因为沉迷工作

  7. 作为一个非专业的开发者,一开始接触 Paddle 的时候你遇了过什么困难或者问题,是怎么解决的?

    敏师傅: 刚开始,对流行的开发是一窍不通。对于 Git,只会把代码下下来自己用,从来没有提过 PR。那会在群里啥也不懂,连 PR 是啥也不知道,Git 其他命令也不会,只会 clone,后来在梦师傅和张师傅的帮助下,看教程。但是那会儿,前面几个 PR 只会在 GitHub 打开单文件修改提交,CI 流程过不去。后来看了张师傅的 PR 教程,才学会了命令提交。

  8. 你有提到最初是看教程学习 Paddle 的,你觉得飞桨的文档和教程怎么样?

    敏师傅: 飞桨文档和教程,在主线这块是维护的很及时的,就是对于分支一些,教程和代码的不同步还是很明显的,记得有个给黑白视频上色的教程,怎么都跑不下来,最后才知道,得用老的仓库代码才行。但教程里的代码,clone 下来必然是最新的。

  9. 你参加过哪些飞桨的开源项目?你最喜欢哪个项目,为什么?

    敏师傅: 参加的挺多,都是摸鱼做做边缘任务,最喜欢的应该是 001 带的任务,因为他基本 724 在线,改 PR 的速度赶不上他 Comment 的速度,哈哈哈哈哈哈。

    编者注✍️:001 (SigureMo)是 Paddle 社区出了名的劳模,望周知。由于是第一位社区 commiter 而被大家称为 001。

  10. 听说你还参加了黑客松,那段经历一定很精彩,能否分享一下你在那期间遇到的有趣事情或者特别人呢?

    敏师傅: 在婷姐带领下做了点 FP16 的任务,在花花带领下写了个 API,跟其他大佬比起来,我这基本就是小学生水平,就记得那会 CI 各种拥挤(当然,责任在我,因为我没环境,只能靠 CI,哈哈哈哈)。

  11. 你觉得 Paddle 社区在吸引和培养新的开发者方面做得如何?是否有一些改进的建议或者想法?

    敏师傅: 我觉得一直都很吸引人,梦师傅、花花、酥酥、孙师傅各种活动都能面面俱到(虽然没实地参加,但看照片能看得出)。 建议想法啥的,我这四肢不发达头脑简单的脑子就算了,跟着大家学就好。🙂

  12. 除了 Paddle 之外,您还参与过其他开源项目吗?如果有的话,您觉得 PaddlePaddle 与其他项目相比有哪些独特之处?

    敏师傅: 其他的么,好像真没,MMEngine 算么,当时要找框架,所以提了 1 个还是 2 个 PR 吧,后面就放弃了,因为没有免费算力可以用😀,还是咱飞桨好用。

  13. 在与花花、孙师傅、梦师傅、涛姐和其他 Paddle 大佬的交流中,您学到了哪些知识和经验?对您的技术有哪些影响呢

    敏师傅: 平时怕他们忙,基本不主动找各位大佬。我们这都是点,她(他)们那是面,所以她们的工作量肯定是非常大的,能不打扰就不打扰。

  14. 对于在某甲方公司工作,敏师傅有没有一些摸鱼小技巧可以分享一下呢?你是如何平衡工作和生活的?

    敏师傅: 摸鱼技巧?开会带本书,看看会议就过去了,反正路人甲一个,一般就用“三不”回答:不会、不懂、不知道。领导的决定都是对的,领导的决策都不会错,错了那也是我们马仔理解不够深,执行不彻底,落实不到位。

    平衡工作生活的话,下了班就 不干活,遵守 995,除了大值班,这都得参加,没啥说的。

    编者注✍️:学到了。

  15. 对于那些想要成为开源贡献者的人,您有什么鼓励和建议?

    敏师傅: 不管是不是科班出身,大项目里开源一般有利无害的吧。我毕业太久,现在的应聘肯定卷出了天际,啥力扣 ACM 估计都是基操,能用开源项目加分的话,先进大厂实习再氪肝留大厂也是条路吧。说的不一定对,请客观看待。

  16. 最后,敏师傅还有什么想和大家说的么?

    敏师傅: 有新手怪的话,大佬们给我留点。我还是砍砍史莱姆和稻草人就好😀。

三、著名大型评论平台——虎扑评论专区

敏师傅和太多的人打过交道了。由于篇幅的原因,我们邀请了部分和敏师傅有过合作经历的朋友们,贡献一下他们和敏师傅发生的故事,或者对敏师傅的评价~以下均为真心话,请放心食用!

limin-04

by 孙师傅(sunzhongkai588

  • author image
    孙钟恺
    一开始对敏哥印象深刻,是因为敏哥的微信昵称拼音——讷言敏行(nè yán mǐn xíng),总共 4 个,有位前同事能把其中 2 个读错成 nà ... ... háng。🤣
    之后,从提文档修复的 PR 开始,就能明显感觉到敏哥的进步,再到后来敏哥能一口气把好多快乐开源任务都认领完成了,真的非常厉害。

by 婷姐(zhangting2020

  • author image
    张婷
    敏师傅领题目、push 研发超积极。最厉害的是自己不做测试的,都是一把改完 push 上去看 CI 结果,也不需要 GPU 算力(手动狗头),以充分利用婷姐的脑力资源为主。

by 汪师傅(GreatV

  • author image
    汪昕
    敏师傅,当然是实力超强的摸鱼仙人

by 花花(Tulip-hua

  • author image
    花花
    众所周知,飞桨开源社区分为两股势力:以敏师傅为首的好人阵营,以 002 为首的时好时坏阵营。

编者注✍️:下面这位就是花师傅说的时好时坏的 002 ⬇️

by 张师傅(liyulingyue

  • author image
    张一乔
    敏师傅简直是吾辈楷模,能愉快的摸鱼提 PR,还有老婆,真让人羡慕。

by 独师傅(longranger2

  • author image
    张伟鸿
    敏师傅给我的感觉就如同金庸武侠小说里的扫地僧,活跃在飞桨各大大小小的社区当中,神秘而且武功深不可测,有极高技艺却又深藏不露。嘴上说着摸鱼,但上班的时候提起 PR 毫不手软(敏师傅,咱贵公司还招人吗[可怜])。敏师傅也是一部行走的百科全书,上知天文,下知地理,尤其对吃的颇有造诣,如果你想知道不同地方的美食,问敏师傅就对了。
    不过我也得来吐槽下敏师傅,平时我认领的任务还没开始做的时候,张师傅都是口嗨说要背刺我,但只有敏师傅是来真的,直接把我认领的任务做了,希望敏师傅下次能给我留口汤喝,ball ball you 了😭

by 陈沧夜(mrcangye

  • author image
    陈龙
    敏师傅是我人生重要的领路人之一,每次抉择迷茫时候,敏师傅总会用他经验满满的信息差对我的迷茫分叉口进行降维打击!最后让我拨云见月,酣畅淋漓!

by 梦师傅(Ligoml

  • author image
    梦柳
    敏哥人超好!职场导师+1
梦的证据
敏哥安慰梦师傅的聊天截图

四、敏师傅的佛系养身 TIME~🏃‍♀️🏋️‍♀️⛹️‍♀️🚴‍♀️🤸‍♀️👯‍♂️💪

经历

先设定个小目标,就减肥吧,然后开始了漫长的减肥计划。 一开始 3 公里都难跑及格,啥也不管,先开跑,同时补充氨糖和维生素,免得关节废了。好像从 95 跑到 85 后,各种体测也没问题了。前几个月体重掉的快,后来基本一个月一公斤,逐渐五公里到十公里,最后跑了个半马试试自己的耐力。然后体重就到了瓶颈期,跑步成了热身,体重不减,体脂不减,请教专业人士,开始上力量,原始三件套:深蹲,硬拉,卧推。先慢跑 3 公里,然后负重训练。后来逐渐加上 HIIT,体重最轻的时候到了 70 公斤。

过来人的小 tips💡

总结一下大概如下:热身是必要的,体重大先用有氧减脂,一开始不用太在意体重,练就完了,碳水和蛋白质要保证,氨糖和维生素也是必备,到了某天会发现衣服大了,体重下来了。到了瓶颈期就可以上力量,没有条件就用 HIIT 代替,比如斯巴达 500,虽然痛苦,但是非常有效,提升新陈代谢率,提高心肺功能。在上力量时,如果有体检,会发现尿酸升高,这个是力量训练中常有的,可以暂停一周再复测,正常值后就说明是力量训练导致,就不用担心了。

五、彩蛋 🥚

1. 十项全能的家庭煮夫敏敏子在线狂秀厨艺

  • author image
    敏师傅
    自我宣言:本人手艺还行,刀工一般,之前在某集团时没事跑去炊事班练练手,打打牙祭。煎、炒、烹、炸、焖、炖、溜、熬、蒸、烩、煮、烙、汆、酿、扒、烧都会烧点。
左图:李敏师傅
敏哥做的菜-1
右图:水群摸鱼日常
敏哥做的菜-2

2. 敏哥个人自述

敏哥在采访前也精心写了一份【个人自述】,篇幅过长就不贴在正文了,好奇的话可以读一下哦~

编者注✍️:留个彩蛋!我把它放在了博客 GitHub repo 下的 src/eggs/limin-story/ 文件夹下哦~


写在最后 💡

【开源江湖闲聊录】 是一项专门为 Paddle 社区的开发者打造的特色访谈栏目📚。在这里,我们邀请到每一位别具一格且富有热情的开发者,通过文字或语音的方式进行深入采访 🎙️,探索并展现他们背后独一无二的故事,将他们的经历、见解和创意整理成精彩内容,呈现给整个社区。


+ + + + \ No newline at end of file diff --git a/posts/loaf-sharing.html b/posts/loaf-sharing.html new file mode 100644 index 0000000..4946256 --- /dev/null +++ b/posts/loaf-sharing.html @@ -0,0 +1,31 @@ + + + + + + 如何在开源社区摸 🐟? | 飞桨开源社区博客 + + + + + + + + + + + + + + + + + + + + +
Published on

如何在开源社区摸 🐟?

Authors

本篇博客文章的内容,来源于作者在「第八届中国开源年会」上分享的一次主题为 「如何在开源社区摸 🐟」 的闪电演讲,以下的部分为演讲的具体内容。

loaf-01

01-个人简介

大家好,今天我想分享的主题是 「如何在开源社区摸 🐟」。在演讲开始前先自我介绍一下,我叫孙钟恺,社区里的开发者都称呼我为 孙师傅,下图为我的 Github ID、头像和贡献热力图。

loaf-02

从上面的职业标签可以看出,我是入职百度一年半(0.5🐔年)、目前负责 Paddle 开源社区以及官网文档的飞桨校招产品经理。作为一名新人,我也没有什么特长,唯一擅长的就是摸 🐟 吧~所以在这里也和大家分享一下我的摸 🐟 经验。

02-摸 🐟 经验

我的摸鱼经验其实从这幅图就可以说明白,就是工作上三思而后行

  • 第一,这工作能不能不做
  • 第二,这工作能不能晚点做
  • 第三,这工作能不能交给别人做

loaf-03

但是,理想是丰满的,现实是骨感的。老板的回复也很直接:

  • 第一,你能不能滚蛋;
  • 第二,你能不能早点滚蛋。

不过对于第三点呢,老板似乎不太抗拒(反正不是交给他做🐶)。于是我就在思考,也许可以通过“把工作转交给别人”的方式,来简单摸个 🐟。

那么问题来了,具体交给谁做呢?我看向了我的同事和研发大爷们。经过几百回的试探和心理博弈后,研发大爷们均以“人力不够”、“优先级低”等借口来拒绝我。而且咱们研发工作日做牛做马,一到周末直接原地消失了,一看 GitHub 热力图,周六、周日都是空的。

补充:不过这也说明百度还算是一个遵守劳动法的公司,周末都是双休的~

然后,我把我的目光转向了社区开发者们。哎,发现他们的开源热情似乎还是很高涨的,有的开发者甚至把开源视为人生价值(“工作就是图一乐”、“人生价值实现还得靠开源”)我又翻了翻一些社区开发者的 GitHub 热力图,一看吓一跳 😮,绿油油的一片,7*24 小时全职开源。

loaf-04

至此之后呢,我就把 “把活儿交给社区开发者”,作为我摸 🐟 的核心思想。

loaf-05

但是,怎么“把活儿交给社区开发者”,也是需要讲点基本法的,所以我总结了两条方法~

03-「把活儿交给社区开发者」初级版

首先,我先介绍一下初级版,即把一些 明确的轻量级任务 交给社区开发者做。

怎么理解呢?其实很多问题已经由社区开发者和内部研发进行多轮讨论了,并经过 任务拆解 后,形成了可以直接去上手做的轻量级任务。这些轻量级任务最终会公布到社区,并以 tracking issue 的形式进行发布和追踪,下图右方就是部分的这类任务。

loaf-06

因为这些任务相对简单、好上手,社区开发者反馈其实非常好,有些人可能周末会去做,有些人甚至上班摸鱼的时候也在做。

发布这类任务的优点在于——因为任务比较简单,“啪”的一下做的很快,完成率又特别高。更重要的是,开发者也会很愉悦,比如花一个小时提一个 PR 上来,就能把任务做完了,很容易带来满足感~(而且也会有小礼品)

不过这类任务也有一些缺点——这些任务需要花精力进行任务的拆解、详细的描述,甚至还可能需要指导和大量的 Review。所以这 🐟 虽然摸了,但只摸了一半。

loaf-07

03-「把活儿交给社区开发者」终极摸鱼版

基于上述,我之后又总结了终极摸鱼版的方法,就是 把问题交由社区开发者来主导

怎么理解呢?就是我们飞桨只提供大概的题目和方向,由社区开发者根据问题 自行进行拆解,然后在我们的指导下开展任务。比较典型的是 将 xdoctest 引入飞桨工作流,这个题目是由社区开发者顺师傅(@megemini)来完成的。

xdoctest 是一个文档示例代码的检查工具。

从下面右半边可以看到,顺师傅按自己的理解对任务进行拆解,分为不同的阶段,并有条不紊的完成。并且还衍生出了一些批量的社区任务,比如全量的修改了飞桨一千多个 API 的示例代码。这是一个人完成不了的,需要号召更多的社区开发者来参与,因此这个项目也极大调动了整个社区的氛围和活力。

loaf-08

所以说,其实把问题交给社区开发者主导,会有很多积极的方面~一方面能够帮我们分担了很大的研发精力(帮我们摸 🐟),另一方面也会不经意间对整个社区有正向的影响力。

04-摸 🐟 的前提条件

最后也提一下,其实摸鱼也有很多前提条件,需要有良好的社区氛围丝滑的社区交流研发的大力支持运营的宣传推广...这些条件都是缺一不可的~所以虽然是摸鱼,但也需要遵循很多客观规律。

loaf-09


以上是我演讲的全部内容,感谢大家的观看~

loaf-10

+ + + + \ No newline at end of file diff --git a/posts/nknan-story.html b/posts/nknan-story.html new file mode 100644 index 0000000..e85bfb7 --- /dev/null +++ b/posts/nknan-story.html @@ -0,0 +1,32 @@ + + + + + + 【开源江湖闲聊录】从代码到键盘外的世界,走进 NKNaN 的日常 | 飞桨开源社区博客 + + + + + + + + + + + + + + + + + + + + + +
Published on

【开源江湖闲聊录】从代码到键盘外的世界,走进 NKNaN 的日常

Authors

大家好!这次我们有幸采访到社区中的一位特别的朋友——NKNaN。她不仅是飞桨社区中的佼佼者,对于开发中的难题总能迎刃而解,也是一位才华横溢且性格随和的女性开发者。通过这次的对话,我们将一起走进李睿文的日常生活,了解她在社区背后充满转折和惊喜的个人故事~

一、前言

NKNaN 是我们社区中的一位特别的成员,她不仅是我们社区中少有的女性猛将,更是一个勇敢跨界的探索者。从西安的古城墙到香港的繁华街道,再到可能的北美新生活,她的脚步从未停歇。她的学术之旅横跨金融、数学和计算机科学,每一步都显得那么自然而充满挑战。

NKNaN 的职业生涯同样精彩纷呈——她曾冲动地辞去稳定的工作,追寻博士学位的梦想,但在一年后,她又勇敢地决定放弃,选择重新探索适合自己的道路。无论是在学术界还是生活中,NKNaN 都以她独有的风格和魅力,展示了自己对生活的热情和对技术的执着。

她的故事不仅充满了色彩,还散发着温暖的光芒。让我们一起走进 NKNaN 的世界,看她如何在技术的大潮中保持真我,用代码和智慧编织自己的梦想,享受那份难得的轻松和自在。

二、采访内容

  1. 介绍一下自己吧,Nan 佬!

    NKNaN: 哈喽大家好,我是百度飞桨社区的个人开发者 NKNaN,非常荣幸能够被选中参与这次采访~我老家在西安,本科毕业于香港理工大学金融服务专业,(水)master 毕业于香港科技大学金融科技专业。因为想要出国看看外面的世界,目前正在申请北美的 CS 项目。关于我自己的话,平时比较宅,喜欢室内的活动,撸猫、弹钢琴、看动画片、写代码;偶尔外出,外出的话喜欢随手拍拍风景?MBTI 是 INFJ,还被人誉为 I 人中的 I 人。

    撸猫
    撸猫
    看透一切的猫猫
    看透一切的猫猫
    随拍
    随拍
  2. 看到你本科在香港理工大学就读工商管理专业,可以聊聊当时为什么选择这个专业呀?以及为什么选择去香港读书?

    NKNaN: 专业是家里人给我选的。因为我爸妈都在银行工作,他们就觉得学了这个,以后进银行比较方便呗~

    选择去香港也是父母决定,他们可能觉得香港是亚洲金融中心之类的,更加国际化一点。所以当时高考完了之后,父母告诉我可以选择香港这条路,就用高考成绩给我报了香港的学校。当时香港所有学校都申了,但港前三所都要面试,我英语口语又差,就挂掉了,最后还是选择了港理工。

    但现在回过头看看决策还挺失误的,一开始就没有规划好就选择了去香港。这人生地不熟的,又不能转专业,还是太听父母话了。

    维港
    本科大二最后一次去维港,之后疫情就回家网课了qaq
  3. 觉得失误是因为对本科专业不太喜欢吗?但看你本科专业学的很好、绩点非常高,还获得了学院杰出学术成就奖!

    NKNaN: 这个奖是按每一年小专业的排名发的,如果在本专业排前三的话就能获得。可能我们专业比较废,大部分人都比较菜,像其他那些小专业的获奖大佬,他们的分数就比我高。

    而且其实我的专业算是文科。文科怎么说呢,学和不学感觉好像没啥区别?像我们绝大部分课程的 assessment,很大一部分得分占比是通过写 essay 来拿分,但 essay 人家愿意给你几分就给你几分,纯看人家的心情。所以这边也奉劝大家,如果对自己写文商课小论文的能力没有十足把握千万不要来学商科!!

    另外,商科如果想学得好,英语好是最基础的。家里资源也要好,还不能是 i 人!像做 presentation 的时候,必须要表现的很 expressive,要能说(吹)出来好多东西。但我就是 i 人,不太适合商科这种风格,还是喜欢做一些具象化的成果。

    所以本科的时候就想转计算机了,但学校太坑太死板了,不让转专业,就只能去辅修。当时成绩好的人都会去辅修数学或者计算机(好多人都去辅修计算机)因为我的 GPA 不够,最后就选择辅修数学了~其实自己也想往计算机方面靠,就自学了 Machine Learning 之类的课程,后来读的 master 也是香港科技大学的金融科技专业。

  4. 想学计算机是因为兴趣吗?还是因为赚钱多呀(笑)

    NKNaN: 一开始确实是基于自己兴趣吧,后来发现这个赚钱确实也挺多的~不过感觉对计算机感兴趣的女孩子确实可能比较少一点。

  5. 研究生毕业之后,你在上海某银行的金融科技子公司短暂工作了一年,可以讲讲吗?

    NKNaN: (先给公司打个码)我当时入职了智能风控组,主要是用机器学习模型给风控项目做建模,比较传统和偏业务。但实际上做的事情挺杂的,还会做一些客户信用评分卡评级之类的事,会用到一些统计学习模型,基本就是调调参数。我自己对这种工作没有非常大的热情,想看看能不能读个博提升一下(虽然后来发现读错了),就有点冲动的裸辞了,也不建议大家学习。

    不过那里的团队氛围真心很 nice,大家的关系都很融洽,比较扁平化,入职之后会有很多破冰以及团建的活动,平时也会互相分享技术心得。

    上海某公园团建-1
    上海某公园团建-1
    上海某公园团建-2
    上海某公园团建-2
  6. 冲动是因为受到刺激了吗?

    NKNaN: 对,确实有点受刺激。那份工作工资很少,一个月没有补贴的时候只有 9k,有补贴的时候也只有一万多一点(应届生刚进来的工资),这还是在上海!向上发展的路线我也比较迷茫,走技术路线在那里好像待遇一般,走管理路线又不太适合我。而且杂事也多,像处理一些数据都算正事了,很多时候会做和工作完全无关的事,就比如说组织什么活动、清点一下资产、给部门 HR 做助理……给人分工很不明确的感觉。

    但其实如果一直待在那里也可以安安稳稳的,只是我自己不太喜欢能一眼望得到头的生活,每个人的选择不一样啦。

  7. 那之后去读博是什么感觉~以及读了一年后为什么又选择 quit?

    NKNaN: 在 2023 年 9 月我去港理工攻读 PhD,但工作其实 5 月就辞了,因为那会儿导师已经开始给我做一些数学基础和科研能力的训练(做题和读 paper)。我导师挺 push 的,一周要开三次组会,其中我要主讲两次——一次是论文进度、一次是讲做的习题。然后还有一次相当于旁听,但是旁听也不能只听着,得发表意见参与进来,很累。

    而且我导师是属于应用数学学院下的,她是想把传统的统计学和 Machine Learning 结合,做一些统计迁移学习,而不是用目前流行的 Deep Learning,这就对数学能力要求比较高。虽然我本科辅修了数学,但还是觉得自己的数学基础能力不太够,可能看 paper 的时候理解的会容易一点,不过理解和自己推出来这两者差别是很大的(真的推不了一点)。

    可是我能力太差了,光是训练就把我搞懵了。如果按我当前这个速度去读博,可能得要五年……导师对我期望值也很高,想着三年就毕业吧,弄得我压力很大。而且对于这个方向我也不是很感兴趣,感觉太传统了,所以最后还是决定 quit。

  8. 所以选择 quit 一方面是压力大,另一方面是方向不太合适?

    NKNaN: 是的。除非你本科就是学数学的,已经经过三到四年的严格专业训练,然后再去读这个博士,可能收获会更大吧~或者找一个计算机系的教授,跟着做深度学习可能更适合我。

  9. 你这些年在香港待了也挺久的,喜欢香港文化吗?粤语会说吗?

    NKNaN: 我觉得对香港没有那么喜欢,因为有时候遇到一些比较排外的 local,体验会挺差的。

    粤语的话我到现在还不太会说,可能我语言天赋太差了。像我室友她语言就比我好的多,我跟她一起备考 GRE,她只复习了一两个月就考到了 325,而我当时考的可低了,后面又复习了两个月才考到了这分数。她一开始英语说的就很好,之后粤语学也很快,一两年就学会了,我到现在还会听不懂一些对话。另外主要是自己也不太想学粤语,感觉可难了,音调那么多,粤语的拼音发音又和中文的拼音不一样,不太规则。

    港科食堂
    港科食堂,风景属实不戳
  10. 那在日常生活中,你一般会做什么呀?

    NKNaN: 生活上我感觉因为我是 I 所以就很少社交了,除了前面提到的那些,还喜欢自己研究一些好玩的东西~比如一开始在中国大学慕课网学 Python 编程的时候,就会跟着做一些比较有意思的小项目。在学校里也修了 C++,后面为了找开发工作还学了 Java,顺便自己做了康威生命游戏,就是一个界面,里面有黑白小格子可以点点点,现在看是个挺无聊的一游戏了~其实本来想着学机器学习,但后来跟着做了这些开发项目后,觉得这些语言也挺有意思的,包括最近我还在学习一些前端知识。

    生活-1
    当然也用照片套模型炼过自己(雾)
    生活-2
    为数不多的主角是自己的外出照片
  11. 聊聊开源吧~是什么契机接触飞桨的呀?

    NKNaN: 在去年五六月的时候,我想做一些开源项目提升一下。因为当时抱有一个目的——进大厂,所以觉得做一些开源项目应该是有好处的,然后想做深度学习领域的开源项目,就去 GitHub 搜一些国内的深度学习社区嘛,看到 Paddle 仓库有一个 project —— call for contribution,在里边的列表里看到 PaddleScience 有个题目,需要做 HamiltonianMonteCarlo(HMC)API。MonteCarlo 我肯定是知道的,但对 HMC 不太熟悉,我就搜了一下是啥样子的,感觉应该还挺好实现的,就帮着做了一下。

  12. 像科学计算、API 功能增强之类的开源任务都有一定挑战性的,但对你这样的大佬来说是不是难度不大?

    NKNaN: 难度我觉得对我而言主要还是在于理解这个框架吧,就是理解框架背后的原理。因为像 MonteCarlo 这样的 API 底层本身应该是很好写的,给一个数学公式,如果能看懂就可以写出来吧!但要把它适配到这个框架里面,是需要花一定时间的。我自己的开发经验少,接触的开发项目也少,所以当时半天看不懂为什么这块儿要这么写,那块要那么写~

  13. 身为一名很厉害的女性开发者,你觉得在工作或者学术中会存在大家对女性的一些刻板印象吗?

    NKNaN: 这个我感觉可能国内有的地方确实会有这种现象吧,就是说比如说找工作的时候,像涛姐写的那样,在简历上就不会写上自己的性别。然后不仅是开发者这个职业,包括其他的一些工作,在一些国企里面,好像也更偏向于男生,可能因为出于传统刻板印象,他们觉得女生事儿多,担不起大梁。

    读 PhD 的时候倒是完全没有这类问题,因为导师本身自己也是女性。她也非常提倡有女孩子能来跟她读博,她不会觉得性别是一个做研究上的一个障碍吧。这方面可能在发达地区不会有那么严重的性别歧视。

  14. 之后有什么打算吗?是继续深造还是工作~

    NKNaN: 现在想准备去加拿大读一个 master 之类的,因为想要去国外看看。

    我感觉自己年纪有点大了,都 25 了,也有点年龄焦虑。我父母也会觉得读出来都二十七八了,有点晚了,所以大概率就是读完 master 之后找个开发的工作~

    其实我一开始还挺想去做学术研究的,但是后来发现做研究就得没日没夜,有点不对劲,完全没有 work life balance。你可能每天都得干到晚上 12 点,一点都不快乐,所以现在看起来开发应该会比做研究轻松一点吧~

  15. 最后给我们社区的小伙伴说几句话吧!

    NKNaN: 我感觉来社区里的大家,肯定都是很有自己想法的开发者~我自己也很随性很散漫,所以就希望大家能去做自己想做的,成为自己想成为的人,不要在意外界的闲言碎语,遵从自己的内心就好~

    GitHub头像原图照骗

三、两分钟快问快答

  • author image
    孙师傅
    最喜欢的编程语言?
  • author image
    NKNaN
    Python
  • author image
    孙师傅
    早起还是夜猫子?
  • author image
    NKNaN
    夜猫子
  • author image
    孙师傅
    最喜欢的科技产品?
  • author image
    NKNaN
    平板电脑?
  • author image
    孙师傅
    最常用的app?
  • author image
    NKNaN
    微信
  • author image
    孙师傅
    最近读的一本书?
  • author image
    NKNaN
    海伯利安
  • author image
    孙师傅
    最喜欢的电影或电视剧?
  • author image
    NKNaN
    盗梦空间
  • author image
    孙师傅
    必备的零食?
  • author image
    NKNaN
    可乐
  • author image
    孙师傅
    喜欢的音乐类型或歌手?
  • author image
    NKNaN
    中世纪吟唱风
  • author image
    孙师傅
    喜欢猫还是狗?
  • author image
    NKNaN
  • author image
    孙师傅
    出门必备的三样东西是什么?
  • author image
    NKNaN
    伞,口罩,手机
  • author image
    孙师傅
    如果不做开发,最想尝试的职业?
  • author image
    NKNaN
    自由职业

写在最后 💡

【开源江湖闲聊录】 是一项专门为 Paddle 社区的开发者打造的特色访谈栏目 📚。在这里,我们邀请到每一位别具一格且富有热情的开发者,通过文字或语音的方式进行深入采访 🎙️,探索并展现他们背后独一无二的故事,将他们的经历、见解和创意整理成精彩内容,呈现给整个社区。

如果你有兴趣对社区的开发者进行采访,可以联系孙师傅,急缺助手!


+ + + + \ No newline at end of file diff --git a/posts/paddleocr-release.html b/posts/paddleocr-release.html new file mode 100644 index 0000000..4bd74c2 --- /dev/null +++ b/posts/paddleocr-release.html @@ -0,0 +1,31 @@ + + + + + + 终于等到你!PaddleOCR 新版本发布! | 飞桨开源社区博客 + + + + + + + + + + + + + + + + + + + + +
Published on

终于等到你!PaddleOCR 新版本发布!

Authors

在开源社区的热烈期待与共同努力下,PaddleOCR 迎来了里程碑式的版本更新——v2.8.0!本次更新不仅引入了前沿的 OCR 技术成果,还对项目结构进行了深度优化解决了若干历史疑难问题,旨在为广大开发者提供更加高效、便捷的 OCR 解决方案。让我们一同探索 PaddleOCR v2.8.0 带来的全新体验与无限可能!

顶尖模型引入,引领 OCR 技术潮流

PaddleOCR v2.8.0 版本隆重引入了PaddleOCR 算法模型挑战赛的冠军方案,为 OCR 领域树立了新的标杆。 其中,赛题一“OCR 端到端识别任务”的冠军方案——场景文本识别算法 SVTRv2,以其卓越的识别性能与泛化能力,为用户带来了前所未有的识别体验。

SVTRv2

赛题二“通用表格识别任务”的冠军方案——表格识别算法 SLANet-LCNetV2,则以其精准高效的表格识别能力,为数据处理与分析提供了强有力的支持。

SLANet-LCNetV2

项目结构优化,聚焦 OCR 核心

为了进一步提升 PaddleOCR 项目的专业性与易用性,我们决定将非核心模块 PPOCRLabel 和 StyleText 迁移至新的仓库,使 PaddleOCR 项目更加专注于 OCR 与版面识别的核心技术。这一举措不仅简化了项目结构,也为开发者提供了更加清晰的项目导航与资源访问路径。

详见:Notice of PPOCRLabel and StyleText Project Migration

历史疑难问题解决,提升用户体验

半年多来,PaddleOCR 存在若干历史疑难问题,影响了开发者的使用体验。因此,在新版本中,我们重点解决了更新 Backbone 后无法运行模型、numpy 版本依赖冲突、Mac 系统中运行卡顿等一系列历史疑难问题。部分疑难问题还在解决过程中,欢迎广大开发者一起参与!

详见:【疑难解决】解决 PaddleOCR 历史存在的疑难 Issue

其它优化改进,持续精进

除了上述重大更新外,PaddleOCR v2.8.0 版本还包含了一系列细微但重要的优化改进。包括但不限于:

  1. 解决版面分析中,OCR 结果偶尔丢失的问题
  2. 添加 pyproject.toml,使 PaddleOCR 符合 PEP 518 规范
  3. 对于大图推理,引入滑动窗口操作

这些改进旨在进一步提升软件的稳定性、兼容性和性能表现,确保 PaddleOCR 能够在更广泛的场景中得到应用。

开源共建,共创辉煌

需要特别强调的是,PaddleOCR v2.8.0 版本的每一个进步与成就都离不开开源社区的支持与贡献。在 PMC(Project Management Committee) 的统一管理下,众多社区开发者携手并进、共同努力,才使得 PaddleOCR 能够不断前行、日益完善。这里要特别感谢 PaddleOCR PMC 成员:@GreatV (PMC Chair)、@tink2123 (PMC Chair)、@Topdu@SWHL@Liyulingyue@Sunting78@jzhang533,也感谢虽然暂未加入 PMC 但是作出了大量贡献的热心开发者。

新版本 contributors 列表,贡献者数量创历史新高!

contributors

这里预告一下,为了更好地服务广大开发者,PaddleOCR 文档教程专属站点正在由 PMC 展开建设。该站点将汇集仓库中原先散落在各处的文档资源,支持关键词检索功能,界面优雅舒适,相信大家一定会喜欢。

doc_site

我们诚挚地邀请更多开发者和开源爱好者加入我们的行列,一起将 PaddleOCR 越做越好!

结语

PaddleOCR v2.8.0 版本的发布是我们迈向新征程的重要一步。我们坚信,在未来的日子里,在大家的共同努力下,PaddleOCR 将不断创新、持续进步,为 OCR 领域的发展贡献更多的智慧与力量!

+ + + + \ No newline at end of file diff --git a/posts/pfcc-36th.html b/posts/pfcc-36th.html new file mode 100644 index 0000000..ed1fc03 --- /dev/null +++ b/posts/pfcc-36th.html @@ -0,0 +1,32 @@ + + + + + + 第三十六次 PFCC 会议|Ivy 与 PaConvert 分享 | 飞桨开源社区博客 + + + + + + + + + + + + + + + + + + + + + +
Published on

第三十六次 PFCC 会议|Ivy 与 PaConvert 分享

Authors

在第 36 次 PFCC 会议上,我们有幸邀请了 Ivy 社区的英国小哥 Daniel(@djl11)和 Paddle 社区开发者莱师傅(@RedContritio)分别分享了代码转换工具 Ivy、PaConvert。

会议议程

  1. 如何通过 Ivy 将 PyTorch 和 TensorFlow 模型进行转换,并直接在 Paddle 项目中使用。(35 min) @djl11

    Ivy 模型转换 demo 讲解(截图)
  2. @RedContritio PaConvert 代码转换工具介绍 (10 ~ 20min)

    • PaConvert 介绍
    • QA 环节
    PaConvert 介绍(截图)

会议材料及回放见百度网盘链接: https://pan.baidu.com/s/16vAVoXpCgdrrRK5e_-w7Ig ,提取码见 PFCC 微信群公告。

QA 环节

所有 QA 内容均已记录在「第三十六次 PFCC 会议纪要」中。

Part-1: Ivy (部分)

  • 问题 1: 你有测试过多少模型能够转换成功?

    • author image
      Daniel
      目前测试了 30 个主流模型,均能转换成功。目前我们正在测试更多 hugging face 上的模型,大概 70 ~ 75% 能够转换成功。我们也欢迎和鼓励社区告诉我们哪些模型无法有效转换,我们有信心能够解决这些问题。
  • 问题 2: 对于成功转换的模型,它会影响性能吗?或者可能需要更多的时间来训练嘛?

    • author image
      Daniel
      这是一个好问题,也是我们目前正在测试的东西。我们现在看到在 Paddle 上会有 30% 到 40% 的性能损失, 这是因为在我们的 Paddle 后端上有一些低效,我们目前正在努力解决这个问题。
      性能问题取决于模型,但通常来讲并不会影响训练性能。当我们从 Pytorch 转换到 Tensorflow 时,经常看到训练速度的提高。特别是当我们从一个框架转化到 Jax,经常看到一个大幅度的提升,尤其是在 TPU 上。
      所以可能有一些开销,但总的来讲不会有特别大幅度的降低。即使存在个别问题,我们也会很快修复他们。话说回来,这也是一个长期的过程,因为我们正在开发许多不同的框架,并与许多不同的生态伙伴合作。我们把精力集中在用户反馈的真实用例上,而不是试图修复所有东西。所以当你使用过程中确实出问题了,请在 discord 上联系我们,我们会把它添加到高优先级的列表中,并尽快解决。
  • 问题 3: 请问是否有覆盖率相关的工作,类似 PyTorch 那样对后端支持覆盖率有表单或者对应的 CI 流水线

    • author image
      Daniel
      我们做覆盖的方式是详尽的单元测试,所以答案是有。我们在 Github 上 的 CI 已经达到了最大值,我们一直在运行单元测试,在 CPU 和 GPU 上测试每个框架、每个函数,所以我们确实有扩展函数覆盖范围。
      但在每个设备上,支持每个框架、每个版本的每个功能,是一个非常大的、指数爆炸级的工作。基本上有数百万个这样的测试。所以我们真正关注的是什么?这是一个很长的答案,但就像生活中的许多事情一样,我们需要关注重要的事情。我们把更多的注意力放在真正常见的函数上(relu、add、matmul 等)那些真正不常见的、较少使用的函数,我们关注的比较少。在我们看来,我们可能永远不会达到完全覆盖,但只要覆盖到 99% 的模型就是 OK 的,这比支持每个版本每个函数更重要。
  • 问题 4: PyTorch 大概有两千多个 API,包括很多废弃的、不常见的 API,有多少可以通过 Ivy 转换?

    • author image
      Daniel
      我们只关注当前最新版本的 pytorch,以及其 functional API。 在 ivy/functional/frontends 你可以看到所有这些细节,包括我们在每个框架中都支持什么。
      主要的一点是我们支持 functional API,但我们不支持 ATen。我们并不把转换限制在 ATen 或很小的范围内(比如组成所有函数的函数子集),我们可以这么做,但不这样做的原因是我们想更高级别的代码转换。某种程度上,函数的越高层越好,因为当我们从高层 PyTorch 函数转换到高层 ivy 函数、高层 Tensorflow 函数时,把函数拆分成更小单位仍然是有可能的。但如果将底层 OP 重新创建为目标框架中能被优化的高级函数,要困难得多。这就是为什么我们专注于 functional API 和高级函数更重要(但我们也不重新实现的 class)。
      这是一个很长的回答,但这是有意义的。不过我们看到了良好的覆盖率,看到绝大多数模型都能正确转换。我们鼓励人们尝试它,如果它不起作用,让我们知道,我们会让它起作用。

    编者注:细节戳 ➡️ ivy/functional/frontends

  • 问题 5: 我们刚看到的前端,目前支持了很多。但现在还有很多 API 不能转换,那我该怎么做?怎么处理它们?

    • author image
      Daniel
      基本上,如果我们看到开发者对某 API 有足够的兴趣,届时我们会支持。对于不那么常见的 API,Ivy 也是可以支持这些的。如果有一个模型不能转换成功,而我们有信心能让他转换成功,那么我们可以添加对那些 API 的支持。
      如果用户有自定义的 C++ 代码,那么默认情况下不能转换,但我们提供一个接口,你可以在其中指定 C++ 的 torch 实现,这样就可以转换了。
  • 问题 6: PyTorch API 有很多参数,不同参数可以组成各种组合,如果某些参数不支持,则如何处理?

    • author image
      Daniel
      基本上我们支持 PyTorch 的所有行为,包括所有额外的参数等。我们通过构建基于 Ivy 的统一的 functional API(如 ivy.matmul、ivy.add、ivy.reshape 等),重新创建 PyTorch 函数,以完美模仿 PyTorch 的任何可能行为。这可能需要一个 Ivy 函数来重新创建,但如果是一个具有多种不同模式的复杂 Python 函数,可能就需要十个。然后,使用 Ivy 重新创建所有这些行为,每个 Ivy 函数都有特定的 Paddle 后端。因此,一个 PyTorch 函数可能需要多个 Ivy 函数,而这些 Ivy 函数又可能需要多个 Paddle 函数来完全重新创建该行为。所有变体、额外的参数和边缘情况都可以通过中间表示和 API 得到支持。在这些情况下,需要将其作为 Paddle 函数的组合重新创建,尽管这可能以运行时间速度为代价,但通常不会看到大的损失。
  • 问题 7: 目前大模型很流行。对于预训练的大模型,有大量的预训练权重,是否有更快的方式进行转换。

    • author image
      Daniel
      在从 PyTorch 转换模型到 Paddle 后,因为现在 Paddle 模型就是一个加强版的 PyTorch 模型,转换权重可以相对简单,比如将它们转换为 Numpy 数组,然后加载到 Paddle 中。实际上,Ivy 在模型转换过程中,会自动把所有的 PyTorch 权重转换为 Paddle 权重。
      目前没有更快的转换方式,通常使用 DLPack(张量数据结构的中间表示标准)作为中间件,但由于不同框架对 DLPack 的支持不一致,最终选择使用 Numpy 作为中介。我们把将权重转移到 CPU,以高精度格式存储并转换为 Numpy 数组,然后转移到新框架中,这种方法在 demo 演示中以及对于大型模型都能很好地工作。
      实际上目前的转换是基于 function tracing,如果大型语言模型需要多个 GPU 运行,这可能会有些复杂。不过,我们将很快转向使用纯 symbolic tracing 方法,届时就不需要存储所有权重和中间数组,而是基于符号追踪的代理数组,这将意味着不需要启动大量 GPU 来完成函数追踪。
  • 问题 8: 当引入一个新 API 时,支持新 API 的成本有多大?

    • author image
      Daniel
      从工程成本的角度来看,支持一个新 API 并不困难,也不是我们特别关注的问题。我们大部分时间都花在了 function tracing 的逻辑、抽象语法树(AST)逻辑以及编译器和追踪器上。
      添加一个新的前端功能并不难,做起来相当快速和容易。事实上,所有前端 API 和后端 API 都是完全开源的(Apache 2 许可),任何人都可以为其贡献代码。如果在转换模型时失败,并且报错消息指出模型转换失败是因为缺少来自 Ivy/PyTorch 前端的某个函数,我们还提供了如何提交拉取请求以及如何自行添加该功能的链接。真正困难的部分是处理动态控制流、以可扩展的方式进行函数追踪、获取正确的抽象语法树表示,这些都是与框架无关的工作,我们以一种不特定于任何框架的方式进行这些工作。因此,简短的回答是添加新 API 相对容易,真正困难的是其他部分。
  • 问题 9: Ivy 是有特定的前端 API,还是只转译其他框架?

    • author image
      Daniel
      Ivy 本身也是一个框架,拥有自己的前端 API(如 TensorFlow、PyTorch、JAX 等)以及自己的一套函数。Ivy 的 function API 有两个用途:第一个用途是作为一个中间表示,用于从一个框架转换到另一个框架,即 Ivy 的 API 充当中间表示;第二个用途是作为其自身的框架,允许直接在 Ivy 中编写新代码,可以在 Ivy 中编写整个模型,并使用 Ivy 类和 Ivy 函数,然后可以切换后端,使用 Paddle、TensorFlow、PyTorch 或 JAX 等。因此,Ivy 既能自身作为框架,也能转译其他框架。但我们认为最有价值并且最直接的是转译器功能,因为这样已有的所有代码都可以直接使用,而无需任何人编写新的 Ivy 代码。
  • 问题 10: 听起来和 keras 很相似?

    • author image
      Daniel
      是的!如果忽略前端,Ivy 和 Keras 非常相似。
  • 问题 11: 我们是否需要使用更高的内存来转换模型?因为也许转换模型过程中需要保存中间信息,所以可能会占用一些内存。所以我想问问,像转换 llama 这样的大模型是否 ok?

    • author image
      Daniel
      这是一个很好的问题。目前,鉴于转译器是基于函数追踪(function tracing)的,确实需要调用模型以追踪图(graph),这意味着在转换时需要能够对模型进行推理。现在,转换本身不需要在目标设备上进行,只要你有一台内存足够的机器,就可以在 CPU 上完成转换,并且默认情况下转换是在 CPU 上进行的,因为通常 CPU 有的 RAM 比 GPU 多。
      在转译器的一个很旧的版本中,我们曾同时获取所有 PyTorch 权重和所有 Paddle 权重,并让它们同时存在于内存中,这是非常糟糕的做法。现在,权重从 A 转换到 B 是逐步进行的,我们先取第一个权重,将其转换为 Numpy,然后转换为 Paddle,接着转换第二个权重,这样我们就不会重复获取权重。但是,我们避免尽可能多的函数追踪(function tracing),我们现在有自己的 AST(抽象语法树)方法,这个方法工作得很好、非常稳定,我们正在与几家公司合作开发这一点。
      最终设计基于 AST,基于符号追踪,我们将实际的函数追踪作为最后的手段,因此内存使用将会非常低。但是,正如你所说,现在确实需要一些 RAM 来转换一个非常大的模型,但希望在几个月内,这将不再是问题。
  • 问题 12: 你如何平衡你的生活和工作,以及保持你对开源的热情呢?

    • author image
      Daniel
      平衡生活和工作非常困难,但幸运的是,我真的很热爱我正在做的事情,这是保持我动力的原因。我们不仅仅是在做一个开源项目,还在建立一家公司,需要与客户进行沟通。虽然我是唯一的创始人(并非是原本的设计),而且这确实需要付出大量的工作,但我对统一人工智能领域的景象充满热情,总是对看到的碎片化情况感到沮丧,无论是在 AI 框架还是在大型语言模型(LMM)的领域。目前我们正在努力统一这些领域,保持激情和兴奋是我继续前进的动力,如果我不再感到兴奋,可能就不会那么有趣了。幸好,我始终保持着兴奋感,所以工作并不感觉艰难。确实,因为这些并不感觉像是工作,所以更容易保持。
      此外,帝国理工学院的学习经历非常紧张,这让我掌握了之前缺少的知识教育和时间管理经验。
      但我也要说,我会把周日作为休息日,我认为你也需要休息,否则很快就会感到疲惫不堪。
  • 问题 13: 英国的人工智能环境怎么样?是否会有官方活动之类的?

    • author image
      Daniel
      英国的人工智能环境还是不错的。虽然我经常到处旅行,在欧洲和美国都呆过相当长的时间,所以并不算是英国本地人,但英国的 AI 环境绝对是值得关注的。比如,DeepMind 就设在英国,谷歌的主要 AI 分支也在伦敦。显然,Meta、亚马逊以及其他几家公司也在伦敦设有 AI 办公室。伦敦还有很多有趣的初创公司,所以我觉得很幸运能住在伦敦,特别是在靠近国王十字的伊斯灵顿区,那里可以说是整个科技圈的中心。我遇到的很多很酷的初创公司以及举办的活动数目都令人惊叹,所以我认为这里的环境非常好。我很高兴能在伦敦,与这么多创造酷炫事物的人在一起。
      我认为最大的 AI 人才集中地是旧金山,那里又是另一个水平,但我仍感觉英国很棒,伦敦也很棒,虽然它还没有达到旧金山的水平,但也许将来会有所改变。

Part-2: PaConvert (部分)

  • 问题 1 : PaConvert 是否是根据 AST 转换模型的?

    • author image
      RedContritio
      是的,基于解析 python 源码,然后根据 AST 生成 Paddle 模型。
  • 问题 2 : 是否有中间表示?还是直接将 PyTorch 代码转换成 Paddle ?

    • author image
      RedContritio
      直接转换,没有中间表示。

编者注 ✍️:主要是英国小哥在问莱师傅 😛

会议剪影

cut-3

+ + + + \ No newline at end of file diff --git a/posts/pku-course.html b/posts/pku-course.html new file mode 100644 index 0000000..c64b434 --- /dev/null +++ b/posts/pku-course.html @@ -0,0 +1,31 @@ + + + + + + 飞桨开源社区走进北京大学课堂 | 飞桨开源社区博客 + + + + + + + + + + + + + + + + + + + + +
Published on

飞桨开源社区走进北京大学课堂

Authors

飞桨开源社区走进北京大学课堂

10 月 11 日,飞桨开源社区应北京大学计算机学院周明辉副院长邀请,在周老师的开源软件开发课程的第四次课上,为北大的同学们介绍了飞桨开源社区和飞桨新一代 IR 设计。

Jun 给同学们介绍了飞桨开源社区的基本情况 jun-present

杰师傅给同学们深入浅出的介绍了飞桨新一代 IR 设计。 jie-present

课程材料在线观看

这次课程的 Slides,可以在这里在线浏览:飞桨-北大讲课-2023-10-11

彩蛋 🎊

飞桨开源社区曾经在 Apollo Park 接待过北大的国际留学生,梦师傅曾经全英文给参加北京大学夏季夏令营的牛校的神兽们讲解过飞桨。 apollo-park-allapollo-park-meng-present

+ + + + \ No newline at end of file diff --git a/posts/pytorch-conference-01.html b/posts/pytorch-conference-01.html new file mode 100644 index 0000000..5dfbf30 --- /dev/null +++ b/posts/pytorch-conference-01.html @@ -0,0 +1,31 @@ + + + + + + 【睁眼看世界 🌍】|PyTorch Conference 2023 - State of PyTorch | 飞桨开源社区博客 + + + + + + + + + + + + + + + + + + + + +
Published on

【睁眼看世界 🌍】|PyTorch Conference 2023 - State of PyTorch

Authors

本文是对 PyTorch Conference 2023 中的《State of PyTorch》部分进行了精准的中文翻译和详细的文字总结,旨在向读者介绍 PyTorch 社区的 2023 年动态。同时也特别参考了散步大佬的《PyTorch Conference 2023 翻译系列文章》,在此基础上,进行了细致的校对和优化,确保翻译准确无误。对散步大佬之前的辛勤翻译和对开源社区的贡献,表示衷心的感谢和敬意。


写在最前

【睁眼看世界 🌍】专栏旨在打破知识边界,通过将国际上的优秀文章、会议精华以及高质量学习资料翻译成中文,使得这些宝贵的知识资源能够为广大中文读者所共享,而不是局限于国内的小圈子。

对于对此有兴趣、愿意贡献力量的开发者,也可以联系孙师傅,一同完善这个栏目,共同促进知识的自由流动和技术的共同进步。


Lightning Talk

我的名字是 Alban,是 META 的一名软件工程师,已经在 PyTorch 工作了很长时间,并且主要在 PyTorch 核心库维护方面做了很多工作。

在今天这个快速闪电演讲中,我要给大家介绍一下 PyTorch 的现状。以前参加过大会的人,也许知道我们每年都在进行着类似的讨论。Joe 去年就在这里做了类似演讲。今天我想谈论的是三个重要的 PyTorch 里程碑,以及今年发生的三个重要活动,还会谈论一些有趣的数字。Joe 之前已经给大家展示过其中的一些,但能亲眼看到这些数据总归是很有趣的。而在最后,我会给大家介绍一下如何参与 PyTorch ,以及如何帮助我们一起建设 PyTorch。

PyTorch Milestones

1. PyTorch 2.0

  • 20M+ downloads
  • Adds:
    • torch.compile
    • MPS backend for Apple M1/M2
    • torch.func
    • set_default_device
    • Better transformer

第一个重要的 PyTorch 里程碑是:今年(2023 年)年初发布了 PyTorch 2.0 版本。它在所有平台上下载超过 2000 万次,所以对我们来说,这是一个相当重要的发版。并且,下载数量仍在增加。它添加了一系列非常重要的功能:

  1. torch.compile。我们已经讨论过它很多次,因此在这里不再讨论。
  2. MPS 后端。一个重要功能是支持 MPS 后端,能够充分利用 Apple M1/M2 芯片的 GPU 部分。现在该功能处于测试阶段,随着覆盖范围和稳定性的提升,会支持更多新功能。
  3. torch.func。对于了解这的人来说,它又叫 functorch。和 Jax 类似,它新增支持函数式 API,并且融入在 “PyTorch 世界”中,因此能兼容其他所有 PyTorch 功能。
  4. set_default_device。我不知道大家是否熟悉这个功能。它可以通过改变创建 PyTorch 模型时使用的默认设备,来显著加速初始化(initialization),例如直接在设备上进行初始化。或者如你在一些主题演讲中看到的例子一样,快速的创建模型。通过使用元设备(meta device),即一个没有数据的伪设备(fake device),来跳过模型的初始化过程,直接加载权重。这样就可以避免占用太多内存,进行不必要的初始化等类似事情。
  5. 更好的 transformer。这是由 PyTorch 团队和众多 maintainers 共同努力做出的重大推进,一起改进 PyTorch 中的 transformer 模型。无论是 transofmer 相关的高层 API ,还是底层运算,你都可以拥有目前的最佳实现。

编者注 ✍️:这部分演讲内容是对 PyTorch 2.0 简略概括,详细内容可以看 Blog2.0 Release notes

2. Spring Docathon

  • 27 active partipants
  • 5 new tutorials & examples
  • 45+ PRs merged
  • 53+ issues closed

另一个值得一提的重要里程碑是:今年(2023 年)发起的 Spring Docathon 活动。该活动共吸引了 27 位开发者参与,成功合入了超过 45 个 PR(Pull Request),解决了 53 个 Issues。非常有效地促进了我们 tutorials 仓库的改进,不仅提高了教程的质量,还增加了新的教程内容,确保我们的教程始终保持最新。

编者注 ✍️:其实飞桨也提供了 Paddle Docathon ,活动初衷和 PyTorch 是一样的,但整体难度和质量比起 PyTorch Docathon 来说要低一些。第六期黑客松会有一个专门的赛道:优秀稿件征集与传播,大家也可以敬请期待。

3. First Year of the Foundation

  • Open to new membership June 2023
  • New premier members (IBM, Intel, Hugging-facing)
  • New general members (Graphcore)

最后,正如 Joe 和 Ibrahim 所提到的,今年(2023)是基金会成立的第一年。并且在今年六月,基金会向新成员敞开了大门。面对当前的发展,我们感到无比兴奋。

在我撰写这篇演讲稿时,我们已经迎来了四名新成员,而现在又新增了两名,增长的速度甚至超过了我制作幻灯片的速度。我对我们吸引到的成员的多样性感到非常激动,既有专注于底层组件和后端技术的企业,如 IBM 和 Intel,也有更注重高层应用、面向终端用户的企业,如 Graphcore 和 Hugging Face。看到我们在各个方面都在取得增长,对基金会和整个生态系统来说,确实是非常令人振奋的。

编者注 ✍️:Ibrahim Haddad 是 Linux 基金会副总裁(AI & DATA 方向),也是 PyTorch Foundation 董事会的执行官。

PyTorch in Numbers

接下来,让我们来看一些数字。

1. The pytorch/pytorch codebase

对于那些密切关注代码库的人而言,过去的一年(2022 年),我们总共有 12000 次 commits。并且我们非常高兴看到开源贡献增长了 8%,这里的增长特指来自于除日常核心维护人员之外的开源贡献者。

图表展示了每年我们代码库的 commits 数量。如你所见,它正在不断增长,并且未来也会越来越多。

conference-1

2. The pytorch/pytorch top contributors

所有的开源贡献增长都离不开我们每一位贡献者的共同努力。今年,我们共有 1,128 名贡献者对代码库作出了贡献,相较去年增长了 10%。看到这么多人投身于 PyTorch 的开源工作,实在是让人感到非常振奋。

我在此列出了一些提交量最多的贡献者的 GitHub ID,他们的活跃度非常高。当然,还有许多人虽然只提交了少量代码,但他们对代码的改进和贡献的多样性也极为关键。

这所有的努力共同促成了,GitHub 上使用 PyTorch 的仓库数量超过 600,000 个,比去年增长了 20%。因此,看到越来越多的人不仅使用 PyTorch,还发布基于 PyTorch 实现的代码,这确实非常让人兴奋。

conference-2

3. Driving state-of-the-art AI research

其中,大部分代码来自于科研领域,PyTorch 在推动许多前沿 AI 技术的发展方面发挥了重要作用。今年,已有超过 7,000 个 AI 科研论文相关的 GitHub 仓库用到了 PyTorch。事实上,60%的 AI 研究成果是基于 PyTorch 来实现的。因此,见证这样一个开放、繁荣的科研生态,我们感到无比兴奋。

conference-3

4. Powering the AI indusry

  • 65K+ PyTorch professionals(on LinkedIn)
    • 50%+ YOY increase
  • 3K new jobs requiring PyTorch

如今,PyTorch 在工业界的发展也取得了显著进步,正在迅速弥补之前的落后处境。以 LinkedIn 的统计数据为例,我们观察到将 PyTorch 作为核心技能的求职者每年增长率达到 50%,同时,越来越多的职位也开始要求应聘者掌握 PyTorch。

5. Talk of the town

我们的一切成就,都离不开我们庞大社区的支持。接下来,我想分享一些关于社区的有趣数据。Discuss Forum 是 PyTorch 为用户、开发者及其他所有人提供的互动论坛。每月,我们有大约 400 名新成员加入,网站浏览量超过 200 万次。同时,我们的网站也非常活跃,每月约有 2000 篇新帖子发布。我们非常需要活跃的社区,让更多成员帮忙解答用户和开发者的问题。

conference-4

Join us

在这里,我想呼吁大家加入我们!PyTorch 不仅是一个开源项目,它也是我们共同奋斗的目标。只有依靠一个庞大而活跃的社区,我们才能不断推动 PyTorch 向前发展。因此,我们做了很多工作来尝试巩固我们的社区生态。

1. How to get involved

我们根据社区里很不错的反馈(包括如何帮助新成员融入、如何让他们共同参与到 PyTorch 的建设中来),创建了一个新页面——PyTorch 终极贡献指南。点击下面的链接可以查看,接下来我也会讲一下如何参与其中。

PyTorch 终极贡献指南:https://github.com/pytorch/pytorch/wiki/The-Ultimate-Guide-to-PyTorch-Contributions

2.Non-code contributions

首先我想和大家讲的是,我们是有很多非代码的贡献。所以对 PyTorch 的贡献远不止编写代码,还有很多其他方面的工作。

conference-5

在左边可以看到我之前提到的论坛。同时我们还有一个开发者论坛 Dev-Discuss,在这里,你可以提问、回答问题或与社区成员讨论各种话题。这些都是非常重要的贡献方式,而且每个人都可以参与其中。另外,因为社区中的所有人都可以建设 PyTorch,所以报告问题、提出新功能建议等也是你可以做出的重要贡献。例如,我们非常欢迎大家对我今天提到的新功能提出反馈,无论是 torch.compile 还是其他功能。请告诉我们什么地方做得不够好,什么工作得很好,以及你还需要什么功能。

3. Code contributions

  • Reproduce and investigate issues
  • Bugfix/FeaturePullReguests
  • Review/maintain
  • Documentationch

当然,众所周知,代码贡献自然也是非常重要的。这里我认为第一点(Reproduce and investigate issues)特别有趣,这可能不是每个人都会想到的贡献方式,但帮助复现和调查 issues 是非常非常有价值的一件事情,即使这并不是在“编写代码”,并且也比较耗时。多年前,当我开始为 PyTorch 做贡献时,我做的第一件事就是 debugging issues,并在论坛上回答问题。这不仅有趣,也非常有帮助,因为一旦我们明确了问题所在,接下来的修复 bug 和增加新功能的工作就会变得更加简单。在 PyTorch 社区,提交 bug 修复或新功能的 PR 往往是解决问题过程中最迅速的一步。找到问题所在,弄清楚需要做什么,实际上才是最关键的的。

第三点是,我鼓励任何感兴趣的开发者不只是提交代码,也帮助我们审查代码和维护代码库。现在基金会完全开放了,我们有来自世界各地的许多贡献者帮助我们维护 PyTorch 的子仓库,我们鼓励所有感兴趣的人参与进来。

最后,我们也非常重视文档的编写和改进。我相信许多人都知道我们的文档网站和教程网站,我们也在努力的增加更多文档内容,所以任何文档相关的贡献都非常欢迎。对于那些对此感兴趣的人,我们下个月将举办一个 PyTorch Docathon 文档马拉松活动。如果你想参加,学习新技能并获得认可,请关注我们的博客文章了解更多信息。

conference-6

编者注 ✍️:活动已经结束了哦~

编者最后的碎碎念

  • PyTorch 生态力量非常强大,是目前 Paddle 或者国内任何一个深度学习框架都无法企及的一个高度。
  • Paddle 本身的社区治理结构、运作方式,其实是带有一定国内特色的。
  • 翻译会议真的很花时间,比单纯的翻译文章累多了,散步能翻译到 30 篇后(总共 60 多篇) 的会议内容真的太强了。目前散步在和 Linux 基金会取得联系,可能会有专门的团队进行翻译,有兴趣加入的也可以联系他。
  • 散步做的一个英文转录翻译的工具,可以看看:https://github.com/sanbuphy/WhisperTranslator
+ + + + \ No newline at end of file diff --git a/posts/sanbu-story.html b/posts/sanbu-story.html new file mode 100644 index 0000000..c7c4491 --- /dev/null +++ b/posts/sanbu-story.html @@ -0,0 +1,32 @@ + + + + + + 【开源江湖闲聊录】物理 ➡️ 经济 ➡️ 开源,看散步师傅的曲折求学史~ | 飞桨开源社区博客 + + + + + + + + + + + + + + + + + + + + + +
Published on

【开源江湖闲聊录】物理 ➡️ 经济 ➡️ 开源,看散步师傅的曲折求学史~

Authors

“负暄檐宇下,散步池塘曲”,本期我们邀请到了热情好学的散步 🚶‍♀️ 师傅!你想知道他的人生理想么?你想了解他的学习历程么?你想知道他的日常生活么?你想得到他的真挚祝福么?点击此篇博客,让我们一起走进小散的浪漫人生~

一、个人名片

sanbu-01

编者注✍️:潇某真的有很努力把小散的照片 P 得可爱,想看原图可以私聊 😁,反正肯定不会给滴 🐶!

二、采访内容

  1. 散师傅,给大家介绍一下自己吧!

    小散师傅: 大家好!我是散步🚶(@sanbuphy),菜但是喜欢学。你们可能会在水群之旅中遇到我。如果觉得我话痨了,请喊我去学习;如果你也喜欢讨论问题,欢迎随时找我一起讨论进步 😁😁;如果你觉得我有缺点,很欢迎你直接指出,这是我自省并前进的动力之一;如果你喜欢做开源 & 没事喜欢做一些玩具,那更请你和我一起去快乐开源!!!!

    「散步」 名字由来(用小散原话):因为我想人生就这样 不要那么焦虑,也不要浪费;想要在一个茶足饭饱的午后,在阳光的指引下因生命的跳动而缓缓向前。最好的指代应该是散步,想要向前,但不至于拧巴,就这样的走下去了,也就像生活这般的过下去了。

  2. 大家对你都比较熟悉,一方面是因为你在社区的贡献量,另一方面是因为你经常水群,能不能给大家讲讲 你是怎么做到同时水 5~10 个群的?

    小散师傅: 其实这个很简单。只要你和我一样宅 & 不打游戏 & 没有女朋友 & 打字飞快,就可以一次性水完全部群了!(群保安,不时保卫一下群里的业主们 😂😂)为数不多的好处就是因此可以认识各类大佬。

    小散四件套
  3. 听说不只是 Paddle 的群,你也加了很多别的群,有没有比较有意思的群可以分享?

    小散师傅: 其实我加的大部分群都是技术群。可能也许,我觉得有意思的大家觉得无聊呢。。。 最近觉得比较好玩的是:dlsys 相关的学习群和我自己的一个每周写博客打卡群(不写就发红包 🥹🥹)。但我觉得每一个有大佬愿意和我交流的群都很有趣,能和大佬们在一起学习成长是我的荣幸,也是我的快乐。我可以在聊天中获取对新事物的理解,我沉迷于此。

    编者注✍️:散佬有自己的博客哦 ➡️ https://www.aispacewalk.cn/

  4. 你本科毕业于福州大学,给大家分享一下福大的吃喝玩乐攻略吧!在学校时,有没有什么好玩的事情发生?

    小散师傅:

    • 食堂对面的水果捞,都很好吃 😋😋,阿姨会很诚实的说水果 🍉 酸还是甜;
    • 湖边很好看,草坪很大,适合躺平;
    • 曾经参加学校管弦乐团 🎺,那是我最快乐的时光之一;
    • 水煮肉片 yyds,没有之一;
    • 曾经有一张神图火遍全网(一只狗望着楼梯下的情侣),没错,就是咱们教学楼拍的;
    • 食堂基本上可以随便吃,很难踩雷(我最爱吃的就是食堂)。
    梦的证据
    上述谈到的小狗望情侣照片

    编者注✍️:下面有小散师傅参与管弦乐团的照片哦~

  5. 我了解到:你是物理系出身,当时为什么会选这个专业呢?后来为什么又放弃对物理的学习?

    小散师傅:

    • 选物理专业原因:很简单,每个曾经中二的少年 🧒 都想研究宇宙和量子力学(你想掌握力量吗 😈?)
    • 对于放弃物理的学习:因为发现自己笨而且懒,也许做不出什么有价值的东西了,以及发现自己的本心并不在于物理,而物理应该属于本心就在于它的人,只有这样才配得上一直学下去。光是耍小聪明是不可能被物理之神眷顾的。
  6. 后来你开始学经济,然后才转向深度学习。是什么让你开始学经济,后来又是怎么喜欢上深度学习的呢?

    小散师傅: 学经济是因为:看到了徐高老师的《宏观经济二十五讲》。他的讲课中有一张图让我很是触动且惭愧(我每次想偷懒就翻出来看看👀),我觉得让他们(下方图片中的人)过得更好是我想做的事情。但后来,做了一些经济学相关的事(研究金融危机和大衰退/做经济学实证研究)以及听到了老师说的一句话:“写是一回事,采纳又是一回事”,我就发现:只有能有实际用途和影响力的东西才是重要的。还记得《宏观经济学二十五讲:中国视角》中经典的一句话,凯恩斯说:“从长远看,我们都已死去”。所以,人生实属短暂,我们应当在短时间内接触更有为主义的事情,现在就要让他实现。

    喜欢上深度学习:它足够强,可以在短期内对人有帮助,仅此而已。

    徐高讲课中的图
  7. 在转向深度学习的过程中,有没有遇到什么困难?又是如何克服的?

    小散师傅: 实际上,与学习物理和数学相比,深度学习稍微没那么抗压,难度大的反而在计算机基础。但总的来说,我一直遵守八个字:“不懂就问、不会就学”。我喜欢向所有比我厉害的人学习,只要朝着目标,随机梯度下降就行了。我没有特别的克服什么困难,那样听起来很痛苦;实际上更多的应该是快乐和珍惜,在 🫂 拥抱每一次难题中尝试进步。

  8. 你觉得进入深度学习领域让你感觉到快乐么? 你觉得这一系列的转变对你的职业生涯和个人发展有何影响?

    小散师傅: 总的来说我认为还是快乐的!因为他拥有无限的创造力,也有很大的可能永远地改变人类的生产力。我觉得这个转变是我人生中的随机扰动因子,人生是一场锚定自身性格特质与价值观的随机游走,我们猜不到之后会发生什么,只能让命运沿着自己向前发展,也许等之后发生了各种各样的事情, 我就能找到一条看似靠谱理由回答今天的疑问了。不过,从价值观来说,也许没有影响,只是在愿景上的不同实现方式罢了。

  9. 你提到选择计算机领域的决定源于对提高生产力的渴望,那么在你看来,深度学习和开源社区是如何实现这一目标的?

    小散师傅: 开源社区是深度学习发展的最大加速器之一,而深度学习则是创造力和智力普及化的最大加速器。

  10. 你是怎么与飞桨相遇的呢?你个人对飞桨的印象如何呢?

    小散师傅: 其实我本来是在 OpenMMLab 社区混的,但是看到 Paddle 社区回复勤一点(没有拉踩!研发大哥确实多一些)以及大佬参与被拉入坑,然后发现了新大陆、接触了很多大佬。非常感谢能和 Paddle 相遇。我对 Paddle 的印象就是:在国内你很难找到一个那么多研发大哥和开源大佬陪你一起卷以及发各种奖励的社区了(甚至有时候周末都会回复你)。很多有趣的方向都可以尝试,和飞桨最好的相处方式就是和它一起变的更强。但很惭愧的是我由于太忙,现在参加的频率变低了,其实很多项目都非常好玩,希望大家有时间的话可以当游戏多多参与。

  11. 在开源社区中,您认识了很多开发者或是社区运营者。他们给你留下了什么印象?能具体举例说说么?

    小散师傅: 有太多人所以我只能简短说明,有没提到的朋友我先道哥歉,因为太多了。

    • 黄子豪(@DrRyanHuang)以及林旭(@isLinXu): 主要是我的引路人大哥,没有他们我不会学那么多。
    • 张一乔师傅(@liyulingyue): 让我知道了什么是热情!
    • zrr 老哥(@zrr1999): 让我知道了什么是坚持和热情,以及深耕和专注很重要。
    • 卢畅老哥(@AndSonder): 一直很认真专注,我很想学会拥有他们的水平,可以洋洋洒洒几百上千行代码多文件代码。
    • 花花(@Tulip-hua): 社区顶流运营不必说!
    • 梦师傅(@Ligoml): 每次看到梦师傅就想问头发颜色变了没。
    • 001(@SigureMo): 热情、专注、可怕的强——集三位一体的每一位 Paddle 开源社区老哥的偶像。
    • zbc(@Zheng-Bicheng): 渣男!但是很强。
    • 涛姐(@luotao1): DDL 战士!
    • 军哥(@jzhang533): 深藏功与名的感觉。
    • 其他师傅: 其实很多师傅眼熟,都是我很佩服的人,希望大家能一直在开源社区走下去,大家都是我的老师(认真滴)。
  12. 你在 Paddle 社区中经历过最搞笑的事情是什么?

    小散师傅: 某次黑客松第四期清一色取某人的名字玩梗(咳咳,这里打个谜语)

    编者注✍️:黑客松是百度飞桨社区举办的深度学习领域大型编程活动,鼓励开发者了解与参与飞桨深度学习开源项目,做出自己的代码贡献。

黑客松花花名字梗
  1. 你是否有一些特别喜欢的开源项目或者技术?可以分享一下你喜欢的原因吗?

    小散师傅: 我最喜欢的技术其实没有特别的哪一个,我都很喜欢,都有它独特的美感,能不能都喜欢❤️! 开源项目的话,那肯定是 Paddle ,当然其他开源项目我也很喜欢(比如 OpenVINO),只要拥有社区和快速答复的研发大哥,那一定就是我爱的社区。

  2. 散师傅对开源肯定有自己独特的见解,那么你认为什么样的人才能称得上是一位优秀的开源者?

    小散师傅:

    • 能一个人召集一些贡献者;
    • 文能随手撕几百几千行代码,武能独立开设新仓库包括完整的体系架构建设;
    • 熟读几个开源项目源码(至少一个大项目);
    • 熟练 GitHub 操作(独立开设 CI、review PR、审核 issue 等);
    • 写一个漂亮的 README 而不感到烦躁。
  3. 你的周末一般时这么度过的?会和朋友出去玩还是宅家呢?

    小散师傅: 很显然——宅,主要是每天都觉得自己很菜,还是花时间努力变强吧,向一切大佬们学习。而且,由于我的事情太多,每天几乎都要处理到比较晚,周末也是如此。不过我最开心的事情就是偶尔可以去拍拍照,安慰一下我的艺术脑的创作欲。

    编者注✍️:下方 🈶️ 散师傅的摄影作品。散师傅尤其喜欢运用光影!

  4. 总结一下你最喜欢的一句话!

    小散师傅: 见善从之,闻义则服;见路不走,实事求是;不懂就问,不会就学。

  5. 新的一年开始了~散师傅给我们小小总结一下你的 2023 年,展望一下 2024 年怎么样?

    小散师傅: 2023 有一些务虚,希望 2024 可以更加务实、专注、静下心,不要偷懒,聚焦于做一些长期主义、有用的事情(比如某个方向能够随手成百上千行),链接更多的有缘人并相互成长。希望自己可以变成更从容的人、能帮助别人的人、更阳光开朗的人、能传递快乐与希望的人。

    不过,比起展望自己的 2024,我更希望大家的 2024 都能变得越来越好;人间短暂,希望我们都能走在希望的田野上,无论岁月如何流淌,都能在梦想的道路上互相映照,让生命力在每一处角落绽放。我无比真诚祝愿每一位看过&没看过这篇博客的朋友都能寻找到自己的希翼与幸福。 祝愿每一位人安好。

    编者注✍️:这是小散师傅非常非常认真写的祝福,酝酿了很久很久!

三、小散的十八般武艺

小散爱好词云图

绘画篇 🎨

小散绘画

音乐篇 🪕

最上图为小散参加学校管弦乐队照片 下左为小散的小号 下右为小散为乐队设计的标志
> 编者注✍️:小散师傅超级会拉二胡,还会小号🎺呢!!!

摄影篇 📷

小散的摄影作品集1
小散的摄影作品集2

厨艺篇😋

小散厨艺展示集1
小散厨艺展示集2

四、著名大型评论平台——虎扑评论专区

散师傅很活跃,尤其是在开源群里活跃(都是在问问题!好卷~),因此也就结识了很多朋友 👬。这次我们邀请到和小散师傅有着密切联系的大佬们来谈谈他们对于小散师傅的印象。大家快来看看吧 😄~~

by zrr1999(@zrr1999

  • author image
    zrr师傅
    散师傅作为一个非人工智能相关专业的开发者,对各种新技术都充满热情,大部分时间都是靠业余时间自学新技术,虽然平时休息时间非常少,但是依然愿意花时间参与开源活动,并把自己看到的有趣的、有价值的开源项目分享出来,并留下自己的见解。同时散师傅的知识面也非常广,从半导体技术到计算机软件,再到硬件加速和大模型技术都有所涉猎,属于开发者中的佼佼者。

by 花花(@Tulip-hua

  • author image
    花花
    养成系技术大佬,很有开源热情,厦门见到散师傅感觉散师傅是个很好的人,但是感觉散师傅在互联网上要更E一点哈哈哈哈,线下见面好像话不是特别多。

by 梦柳师傅(@Ligoml

  • author image
    梦柳
    散佬一直是我们社区的自学标兵,经常琢磨一些不同领域的技术问题,带着大家一起讨论学习,摇人参加快乐开源,很不错 👍。

by 卢畅师傅(@AndSonder

  • author image
    卢畅
    散师傅是一个对技术非常有热情的大佬,在各大技术群里都很活跃。白天在公司打工,晚上和周末抽空也会研究新东西。他对技术的热情真的很令人钦佩,与他交流让人感受到他在学习新技术时所迸发的喜悦。

by 涛姐(@luotao1

  • author image
    涛姐
    我是从黑客松 TRT 推理算子中认识散步师傅的,对散步师傅印象比较深的有几个:
    1. 【开源社区对比研究】 以 CI 为例的调研,做的清晰明了;
    2. 在群里常常和 @engineer1109 同学讨论技术问题;
    3. 工作应该是推理方向的,但对性能优化、部署等其他方向也很有兴趣。

by 张一乔师傅(@liyulingyue

  • author image
    张一乔
    一个神秘的大佬!似乎啥都会 🐮!

by 军哥(@jzhang533

  • author image
    军哥
    散步师傅很爱学习,也很会学习。你如果翻看他的个人 blog 和 GitHub 主页,会发现他从系统到算法,无所不学。学会后,他就在飞桨社区里做开源,也就是挖坑和填坑,做了很多很出色的工作。当然可能因为学太多了,以致于,还有些坑他挖了,还没填。我记得他做过很精彩的关于 Python 虚拟机的分享,研究过很长时间 torchdynamo,期待以后能在社区里,挖个大坑,并一起填上。今天,还意外发现他竟然自学过绿导师的操作系统课,这门课非常棒,在这里,也推荐给看到这段文字的读者。

by 文大潇😁(@wenxiaohahaha

  • author image
    wendaxiao
    和小散师傅聊天时,我能感觉到他是一个可爱的人。我从来没有见过那么多可爱的表情包(而我,很多沙雕的表情包,和小散形成鲜明对比)!除了可爱,我觉得小散是一个浪漫主义开源人,他有自己的崇高的理想和抱负(无关权财)。我希望他能坚持下去,实现自己的愿望!当然,他这个每天在群里问问题,清各种 ddl 的卷王,我是相信他的实力的!
    所以,继续闪闪发光吧,小散!
    再提一句:散师傅打字太快了,聊天我根本跟不上节奏!笑死 😆。

写在最后 💡

【开源江湖闲聊录】 是一项专门为 Paddle 社区的开发者打造的特色访谈栏目 📚。在这里,我们邀请到每一位别具一格且富有热情的开发者,通过文字或语音的方式进行深入采访 🎙️,探索并展现他们背后独一无二的故事,将他们的经历、见解和创意整理成精彩内容,呈现给整个社区。


+ + + + \ No newline at end of file diff --git a/posts/shun-story.html b/posts/shun-story.html new file mode 100644 index 0000000..5507623 --- /dev/null +++ b/posts/shun-story.html @@ -0,0 +1,31 @@ + + + + + + 【开源江湖闲聊录】社区掌舵人:顺师傅的 Paddle 之旅 | 飞桨开源社区博客 + + + + + + + + + + + + + + + + + + + + +
Published on

【开源江湖闲聊录】社区掌舵人:顺师傅的 Paddle 之旅

Authors

【开源江湖闲聊录】 是一项专门为 Paddle 社区的开发者打造的特色访谈栏目📚。在这里,我们邀请到每一位别具一格且富有热情的开发者,通过文字或语音的方式进行深入采访 🎙️,探索并展现他们背后独一无二的故事,将他们的经历、见解和创意整理成精彩内容,呈现给整个社区。

一、前言

是谁,能让最摸 🐟 的开发者禁不住 PR 的诱惑,疯狂求 review?又是谁,让向来严于待人、宽以律己的 Paddle 开发者忍不住夸夸?接下来,有请我们的大佬——顺师傅

shun-01

顺师傅是一名 Paddle 的社区开发者,但在社区里,顺师傅不仅仅是一个称呼,更是一股推动力。他主导的项目 【将 xdoctest 引入飞桨工作流】 是 Paddle 社区迄今为止最大的开源活动 🎊。该项目规模极其庞大,涉及超过一千多个 API 示例的整合和数十万行代码的优化,由超过 20 名社区开发者共同完成。顺师傅的领导力不仅显著提升了 API 示例代码的规范性,还极大地促进了整个开源生态的发展和繁荣 🎉。

而顺师傅本身,作为一位经验丰富的资深开发者,也拥有着深厚的技术背景和广泛的知识储备。我们怀着对他的好奇(膜拜)🤩,通过文字采访的形式来深入了解顺师傅的故事,以下是我们与顺师傅的采访内容 📄。

二、采访内容

  1. 可以介绍一下自己吗?平时有什么兴趣爱好?

    顺师傅: 我的 AI Studio 和 GitHub 的账号是 megemini,平时喜欢看看书爬爬山跑跑步~

  2. 作为一名技术佬,你的一天是如何度过的呢? 可以分享一下你的日常生活么?

    顺师傅: 每天都会做的事情,比如写代码、跑步、看书之外,由于最近需要用到 C++,而上一次用 C++ 都是十多年前的事情了,所以近期看一些 C++ 新特性相关的书和视频教程会比较多 ~

  3. 可以简单向大家展示一下你一天的生活作息嘛?

    顺师傅: 家里情况比较特殊,没有什么可参考性~ 不过现在不会熬夜写代码了,晚上一般七八点钟也会出去跑跑~

  4. “上一次用 C++ 都是十多年前的事情了”这句话太有年代感了,是在学生时代用的吗?

    顺师傅: 嗯,工作之后 Java、Python 用的比较多 ~

  5. 你是如何成为 Paddle 社区的开发者的?

    顺师傅: 毫不避讳的说,当初是因为 AI Studio 有比较多的免费算力才接触到 Paddle 社区并真正的开始使用 PaddlePaddle 框架,慢慢的后面才接触到黑客松、快乐开源之类的活动 ~

  6. Paddle 社区开发者都称呼你为“顺师傅”,这个称呼是怎么来的?是谁第一个开始这么称呼你的(笑)?

    顺师傅: 微信的昵称就是「顺」,好像是涛姐还是 001 开始这么叫的 ... ... 惭愧 ... ...

  7. 外界对开发者的固有印象(社恐,直男),你周围的开发者形象是怎样的?你对 Paddle 哪位社区开发者印象最深?

    顺师傅: 开发者都比较坦诚,由于平时基本都是跟技术打交道,所以不管是话多也好、话少也罢,交流起来都是比较简单、热心的感觉~001 对于开源的那种热爱对我印象最为深刻~

    SigureMo 是 Paddle 社区的资深开发者,由于是第一位社区 commiter 而被大家称为 001。

  8. 为什么 001 会给你带来这样深刻的印象?可以分享一下其中的小故事嘛?

    顺师傅: 记得当时为了修改示例代码写了一个小工具,本来还只是想发出来试一下,结果好像第二天 001 的 PR 就来了~技术能力和执行力都太强了,惭愧 ... ...

  9. 你可以谈谈你对开源社区的理解和认识吗?

    顺师傅: 抛开自由、开放不谈,开源项目的参与门槛其实是比较高的,这里主要是针对正规的、规模较大的开源项目、代码类的贡献来说~因此,飞桨能够组织快乐开源、黑客松之类的活动,并且是由中文社区主导,个人感觉是非常有意义的一件事情~

  10. “将 xdoctest 引入飞桨工作流”这个项目是如何诞生的?你可以谈谈这个项目的初衷和目标吗?

    顺师傅: 这个项目是第六届中国软件开源创新大赛 Paddle 挑战赛的一个赛题,主要目标是使用 xdoctest 替换掉 CI 流水线中的不怎么好用的示例代码检查工具~

  11. 你是如何组织和号召其他社区开发者参与这个项目的?在这个过程中遇到了哪些挑战,又是如何克服的?

    顺师傅: 嗯 ... ... 这里应该主要感谢涛姐帮忙摇人吧~~~我所做的只是把事情讲清楚,仅此而已 ~

  12. 这个项目涉及到一千多个 API 示例、数十万行代码的修改,你是如何管理和协调这么大规模的项目的?

    顺师傅: 飞桨开源社区的参与者能力都很强,所以,只要把事情讲清楚,做什么、怎么做,大家自然会把事情做好~期间,001、涛姐、孙师傅、军哥等等很多人,都帮助一起分析如何把这个事情讲清楚,大家目标一致,水到渠成吧~

  13. 这个项目的完成对 Paddle 社区的开源生态有何影响?你认为它在推动开源生态繁荣方面的作用体现在哪里?

    顺师傅: 提升代码质量、对齐主流 Python 解决方案~能够引导更多 “新人” 参与到开源项目中来~

  14. 在你看来,这个项目的最大贡献是什么?为什么?

    顺师傅: 丢掉历史包袱,以后大家都是在统一的 Python 标准下参与贡献,未来的技术选择灵活性都大很多~

  15. 回顾这个项目,有哪些时刻让你印象深刻?为什么?

    顺师傅: 印象最深刻的是当时 RFC 讨论的时候~参与之前本来是抱着试一试、捡漏的心态来的,结果 RFC 一番讨论下来,有种骑虎难下的感觉 ... ... 另外,在发起示例代码修改这个快乐开源活动之后,看到能有这么多开发者参与进来,并且最终把这个项目做了下来,飞桨开源社区号召力之大,属实给了我一次小小的震撼~

  16. 对于未来,你对 Paddle 社区有哪些期待和建议?

    顺师傅: 希望能够引导更多中文社区的开发者参与进来,能够有更多在校的学生参与进来~另外,提一点小小的建议,虽然已经参与飞桨开源社区快一年了,但是,仍然对 Paddle 本身的框架技术路线、技术规划以及一些细节考量非常模糊,希望能有这方面较为系统的文档、视频教程吧~

  17. 作为一名经验丰富的老开发,对于想要参与开源社区,特别是 Paddle 社区的年轻人,你有什么建议或者寄语?

    顺师傅: 只有让更多年轻的开发者不断接过手中的桨,才能将开源社区一直行驶下去,直至星辰大海~

三、“五星评论家麦克阿瑟”专区

我们也邀请了一些和顺师傅很熟悉的、有过合作经历的朋友们,贡献一下和顺师傅相关的故事,或者他们对顺师傅的评价~以下均为真心话,请放心看! shun-05

001(SigureMo

就 Xdoctest 这个任务而言,最开始其实我自己都是没有多少信心的,毕竟是整个框架级别的,光是任务量想想就头疼,而且历史遗留问题特别多,怎么想都做不来吧?当初想着在 RFC 阶段就尽可能抛出我已知的各种坑,让开发者知难而退,这样我也能省心些,要是啥也不懂的我也带不动。

但是顺师傅的出现打破了我的摸鱼计划,顺师傅上千行的 RFC 调研地比我了解的还清楚,对于我提出的各种「劝退」问题也逐一回复了合理的解决方案,这时候我突然觉得,也许真的能成?

RFC 合入后顺师傅有条不紊地推进着整个任务,每一次遇到疑难问题时,顺师傅总能选出合适的解决方案。比如 Paddle Tensor 打印时候 Place 不对齐的问题、输出精度问题、运行环境隔离问题等等,这些都是 Xdoctest 本身存在的诸多问题,经过顺师傅的调整和优化,Xdoctest 已经基本能够完美适配我们 Paddle 了。

此外大家可能比较熟悉顺师傅发放的两个开源任务,也是整个任务耗时最久的部分,顺师傅在开源任务中从开发者转变为了 reviewer,帮助我们 review 了很大一部分的 PR,并且 review 地十分细致且专业。

然后就如大家所见到的,真的成了。

顺师傅太强了~期待下次合作~

涛姐(luotao1

本任务难点在于工程量大、历史包袱重,感谢顺师傅带着所有队员(24 位)用强大的耐心、细心完成了这一旷日持久的推进,你们的工匠精神值得全体同学学习!众人拾柴火焰高,感谢项目的所有参与的同学!

编者注✍️: 涛姐的话太官方了,所以我挑了句重点,希望涛姐能原谅我 🤪

敏师傅(enkilee

有幸通过软件开源创新大赛,结识了顺师傅,他的大赛课题是将 xdoctest 引入到飞桨框架工作流中,为了提升效率,减少错误,还不辞辛苦做了一个简单的转换工具 convert_doctest,极大的节省了修改的工作量,减少了出错成本。

此任务工作量巨大,而且很多 API 历史遗留问题繁杂,顺师傅在工作中展现出的极高的职业素养和敬业精神令我们为之侧目。他对待每一个细节都非常用心,力求做到尽善尽美。在面对复杂的问题时,他总是能够迅速找到解决办法,充分体现了他的专业能力和经验。

此外,顺师傅还具有很强的团队协作能力,他乐于与大家分享经验和技巧,共同提高整个团队的工作效率。在工作中,他总是能够主动承担责任,为团队的发展贡献自己的力量。

川川(gouzil

顺师傅好强,带带弟弟 shun-02 顺师傅的分析能力和组织能力都超强 shun-03

孙师傅(sunzhongkai588

在参与顺师傅的项目过程中,我甚至感觉顺师傅像我的 mentor,因为从他身上切切实实学到了很多东西,比如问题的拆解、项目的组织、技术的交流等...

尤其是看到顺师傅逻辑非常清晰的 RFC 文档后,仅从文档写作方面都让我受益匪浅(因为文档的编写需要非常多的逻辑推理和思考,而像顺师傅一样把事情讲清楚的研发,真的不多,大家感兴趣也可以去看看)功利地说,顺师傅对我的职业发展有非常大的提升,希望顺师傅能够继续加油,影响更多人!

四、结尾

在探索顺师傅的旅程中,我们不仅发现了一个技术上的资深开发者,也见证了一个开源社区领路人的成长和影响力。他的故事和成就展示了开源社区不仅是技术的聚集地,更是所有开发者开源热情的熔炉 🔥。

期待顺师傅在未来的旅程中继续发光发热,为 Paddle 或是其他开源社区带来更多的创新和启示 💡。

最后,应顺师傅要求,就不附照片了,以一棵柳树作为结尾 🌲

shun-04

彩蛋 🥚

往期 blog 有顺师傅真容哦~大家可以去探索一下!

+ + + + \ No newline at end of file diff --git a/posts/starter-camp.html b/posts/starter-camp.html new file mode 100644 index 0000000..7ce96ff --- /dev/null +++ b/posts/starter-camp.html @@ -0,0 +1,31 @@ + + + + + + 新征程 ⛵️ |飞桨「启航计划」集训营圆满落幕 | 飞桨开源社区博客 + + + + + + + + + + + + + + + + + + + + +
Published on

新征程 ⛵️ |飞桨「启航计划」集训营圆满落幕

Authors

在 2023 年的 11 月 14 日,飞桨开源社区开启了一个新项目(新坑)—— 启航计划集训营。经过为期两个月紧张而充实的集训后,启航计划集训营于 1 月 30 日 正式圆满完成所有集训计划。在集训期间,大家出色地完成了三项热身打卡任务,并且有 19 位营员合入了超过 110 个 PR。衷心感谢各位营员的积极参与和卓越贡献!在这里,也向开源社区的各位 “汇报” 一下活动情况~

01 - 启航计划是什么?

「启航计划」 是飞桨社区发起的远程代码集训项目,也是「护航计划」的前置活动。我们以开展为期 2 个月集训营的形式,鼓励开发者积极参与开发 2 个方向的快乐开源任务,以此提升自己的代码实践能力,与社区共同成长 💪。

  • 基础方向:Paddle 核心框架 + Paddle CV 套件的快乐开源任务,将有机会参与社区里最轻松愉快的开源开发活动。
  • 大模型方向:参与 PaddleMIX 跨模态大模型套件的快乐开源任务,将有机会接触社区里最前沿的大模型应用开发与工具建设。

活动详情见 Issue: #58497

starter-01

与护航计划的区别?

  • 不限定开发者背景,企业和学生开发者均可参与。
  • 不进行面试,直接进行简历筛选
  • 集训内容为完成 【快乐开源任务】,合入 1 个 PR 即满足结营条件,相对轻松。
  • 提供高质量集训课程,并以 PR review 交流的形式进行沟通,而非导师一对一带教的形式。
  • 时间周期更短(2 个月),门槛相对更低。

参与者需要做什么?

1. 自选任务,并投递简历报名,通过筛选后即可入营。集训营持续 2 个月,上限 30 人

  • 共有 36 名候选人参与报名并投递简历。内部筛选后,最终通过 29 位学员。
  • 入选学员中,22 名学生(电子科大、西交、杭电、浙大、清华……)、7 名企业开发者。
  • 入选学员中,13 名 PFCC 成员,16 名新人。

入选营员:@NKNaN@shiofjsaio@YangWulve@Hhankyangg@sanbuphy@Atlantisming@GreatV@Tsaiyue@Kaedeharai@wyyang23@jiongjiongli@rhmaaa@cocoshe@zbt78@YibinLiu666@Turingg@ooooo-create@ccsuzzh@zade23@challengewly@zoey333@unicornshell@storm-ice@YinKeYu@Olive-2019@fsczz@jiangziyan-693@isLinXu@jingsongliujing

2. 按兴趣参与集训课程(一周一次)并按时提交双周周报

  • 以实际开发为导向,每周开展一次课程,总计安排 6 次课程。
  • 营员每双周提交一次周报,追踪集训进展和计划,总计提交 4 期双周报。
课程
课程以腾讯会议形式开展
周报
周报截图

3. 完成 3 个打卡任务,并至少合入 1 个快乐开源 PR

  • 打卡任务一:修改飞桨文档。25 人完成
  • 打卡任务二:Paddle 本地编译。13 人完成
  • 打卡任务三:跑通 SD 训练推理。15 人完成
打卡
热身任务打卡情况(部分)

4. 结营期间,可自愿申请一、二、三等奖,并参加答辩

结营考核详情见 Issue:#123

答辩
答辩现场

飞桨官方提供什么?

1. 开发导向的每周课程

  • 由飞桨研发和 PM 根据营员的诉求和实际开发情况,来提供每周的课程。
课程
课程安排

2. 周报管理

  • 助教负责对每双周的周报进行管理,确保提交周报的数量和质量。
周报截图
其中一期周报提及截图

3. 技术答疑

  • 在微信群以及课程中,飞桨研发会针对营员的疑惑进行一一解答。
  • 同时,会有热心、能力强的营员解答别人的问题。

4. 活动运营支持

  • PM 和助教会对活动的各个环节提供支持,保障整体活动的顺利进行。
活动安排
整体活动节奏

5. 成绩评估

  • PM 和助教会根据结营要求,在结营期间对每位学员进行评估,判断是否满足结营条件。
  • 针对一、二、三等奖的答辩,会邀请相应方向的研发导师进行评估。同时,这也是进入护航计划的绝佳机会,因为研发导师会有充足的时间来了解你~

02 - 活动成果

数字上的成果

  1. 共有 19 位营员合入了超过 110 个快乐开源 PR。
  2. 社区新加入 11 名 contributor。
  3. 15 名营员成功通过考核、顺利结营,2 名优秀营员入选护航计划。
  4. @cocoshe 在开发过程中沉淀 1 篇《 PHI 算子库 kernel 注册全流程源码阅读》

数字背后的情况

  1. 共有 19 位营员合入了超过 110 个快乐开源 PR。

完成 80+ 文档、15+ 新 IR 适配、15+ 静态图推全、 5+ cmake 治理、 5+ 复数算子等等题目,文档相关任务约占总体完成任务的一半左右.

  1. 社区新加入 11 名 contributor。

其中 7 名 contributor 只合入了一个文档相关 PR,活动后续缺少延续性。

  1. 15 名营员成功通过考核、顺利结营,2 名优秀营员入选护航计划。

考核通过的营员中,有 10 名是原 PFCC 成员,纯新人通过率不高(31%),猜测是启航计划的活动缺乏引导。

03 - 新的尝试——Docs 偶像女团(精品小团)

是什么?

自愿参与文档开发、维护的社区化小团体,氛围活跃,开发意愿很积极。

由谁组成?

  1. 3 名大二女生(2 名启航计划学员 @Turingg @Kaedeharai,1 名社区开发者@entired),主要负责开发和维护。
  2. 1 名热心社区开发者(O 师傅,大三),负责日常手把手指导 3 名女生。
  3. 2 名飞桨内部同学,负责维持团体运转、答疑解惑。

为什么组成这个团体?

集训期间,2 位女生开发意愿比较强烈,但对具体做什么事情感到迷茫,因此孙师傅就把她们拉入(骗进)了 docs 小组。

运转机制?

  • 每周一次例会,由 3 名女生轮流主持,主要通过每周开发进度、布置新任务,所有人必须参会。
  • 每周一次会议纪要,由会议主持负责写会议内容和 Todo。
  • 如流群日常沟通交流

starter-11

详细资料见:community/docs_group

+ + + + \ No newline at end of file diff --git a/posts/suzhou-kaifangyuanzi.html b/posts/suzhou-kaifangyuanzi.html new file mode 100644 index 0000000..03e5e3f --- /dev/null +++ b/posts/suzhou-kaifangyuanzi.html @@ -0,0 +1,31 @@ + + + + + + PaddleOCR 算法模型挑战赛圆满落幕 & 杭州开发者线下 Meetup | 飞桨开源社区博客 + + + + + + + + + + + + + + + + + + + + +
Published on

PaddleOCR 算法模型挑战赛圆满落幕 & 杭州开发者线下 Meetup

Authors

2024 年 4 月 12 日,开放原子开源大赛 PaddleOCR 算法模型挑战赛 决赛路演在苏州工业园区人工智能产业园 G1 栋 3 楼会议中心顺利举行,并取得圆满成功!🎉价值 15 万元的大奖花落谁家?选手们的技术方案有多硬核?快来看看吧~

BTW,在 4 月 14 日 我们飞桨开源社区的工作人员也顺路来到杭州,在西子湖畔的一家餐厅里举办了杭州开发者线下 Meetup,和众多熟悉又陌生的“网友”成功面基 😊。

大赛背景

开放原子开源基金会 是致力于推动全球开源事业发展的非营利机构。其目标是搭建面向全球开源领域的前沿技术竞争、优秀人才选拔创新成果展示、商业转化引导和对接交流合作平台,广泛传播开源文化、普及开源知识、推广开源项目、提升开源技能,为推进全球开源生态繁荣可持续发展提供动力。

百度飞桨开源社区与开放原子开源基金会的目标和愿景有高度的重合,因此自然而然地达成了合作办赛的意向。继 2023 年百度飞桨联合开放原子共建了「飞桨 PaddlePaddle 开源贡献挑战赛」后(大赛回顾请看 这里),这次飞桨团队再度受邀,发布了「PaddleOCR 算法模型挑战赛」。PaddleOCR 算法模型挑战赛包括两道赛题,分别是 OCR 端到端识别任务与通用表格识别任务,要求选手在 PaddleOCR 的基线模型之上,尽可能提升模型精度,同时保证模型的推理速度与基线模型相当(降速不超过 10%)。

赛题有一定难度,但同时奖金也颇为丰厚🤩:

  • 赛题一:OCR 端到端识别任务
    • 一等奖:1 支队伍,每支队伍奖金 15 万元
    • 二等奖:1 支队伍,每支队伍奖金 4 万元
    • 三等奖:1 支队伍,每支队伍奖金 1 万元
    • 开源贡献奖:7 支队伍,荣誉证书
  • 赛题二:通用表格识别任务
    • 一等奖:1 支队伍,每支队伍奖金 7 万元
    • 二等奖:1 支队伍,每支队伍奖金 2 万元
    • 三等奖:1 支队伍,每支队伍奖金 1 万元
    • 开源贡献奖:7 支队伍,荣誉证书

赛程回顾

大赛从 1 月 15 日上线,启动报名。经过两个半月的紧张打榜后,于 3 月 31 日正式封榜。经过代码审查与线上初审后,最终在 4 月 12 日在美丽的苏州工业园区举行了决赛路演。

在打榜过程中,选手们在官方交流群中积极讨论,互帮互助,还不忘给官方提需求😅。

groupchat

热心选手树先生,无私贡献了针对赛题二快速测试模型精度的脚本,得到了群友们的一致好评!开源精神拉满了!😉

赛题一 B 榜阶段,选手反馈能不能把报错信息展示为实际的报错信息,而不是简单的"没有生成 result.txt",这样才好定位并解决问题。飞桨运营同学快速评估并作出反应,认为这是一个很合理的需求,必须安排!奈何研发人手实在是紧张,直到午夜 1 点多,才完成改动并上线,保证了选手们顺利通关 B 榜。飞桨的研发小姐姐很拼有木有!✊

最终,大赛共报名 211 支团队,总人数达到空前的 671 人。 不过由于赛题本身还是有一定难度,最后 10 支队伍提交了作品,8 支队伍通过了代码审查,5 支队伍入围了决赛答辩。

飞桨官方的模型已经很强了,要在此基础上继续提分,还得保证推理速度不下降,真的很难。👿 ———— 某个不愿透露姓名的选手

路演现场

孙师傅被我抓去现场当主持人,那叫一个专业!😄

host

我则有幸抱住军哥(@jzhang533)和涛姐的大腿,当了一回评审。😎

panelist

选手们的答辩也十分精彩!复旦大学的杜永坤和北京交通大学的赵苗苗,分别针对赛题一和赛题二的模型架构进行了多方面的优化,可以说相当硬核。两位也分别摘得两个赛题的一等奖桂冠,实至名归!

duyongkunc

zhaomiaomiao

令人印象深刻的是,赛题二的「识别先锋」队,是天水师范大学的吴衡老师带领三个本科生来参赛,还都是 AI Studio 的忠实用户🤗。尽管他们的显卡资源并不充裕(据说只有几张消费级显卡),但依然阻止不了他们的参赛热情。在他们的脸上,有一丝羞怯,也洋溢着激动和开心。我从他们身上看到了开源的魅力。

tianshuishifan

路演结束,大合照来一张。

photo_all_together

获奖情况

经过紧张的路演和现场打分,最终决出了我们两个赛题的获奖队伍,如下表所示。

赛题奖项团队名称(括号内为 AI Studio 团队名)仓库地址
赛题一一等奖openocrhttps://atomgit.com/paddleocr_competition/openocr
赛题一二等奖zjj421https://atomgit.com/paddleocr_competition/zjj421
赛题二一等奖ocr 识别队(珍珠小田田的团队)https://atomgit.com/paddleocr_competition/ocr_recognition
赛题二二等奖识别先锋(dudekenny 的团队)https://atomgit.com/paddleocr_competition/RecognitionPioneer
赛题二三等奖豆没有皮吖https://atomgit.com/paddleocr_competition/doumeiyoupiya
赛题二开源贡献奖树先生https://atomgit.com/paddleocr_competition/Mr.Tree
赛题二开源贡献奖几支孤鸭嘎嘎嘎(两只孤鸭嘎嘎嘎的团队)https://atomgit.com/paddleocr_competition/duckgaga
赛题二开源贡献奖长城信息(飞行的的团队)https://atomgit.com/paddleocr_competition/GreatWallInfo_task2

恭喜所有的获奖队伍!🎉🎉🎉你们都是开源创新之路上的佼佼者!🚀🚀🚀

award_ceremony

PaddleOCR 开源共建研讨会

路演结束之后,距离午饭还有一段时间。我们便借着这个机会,邀请了参赛选手们举行了一场主题为「PaddleOCR 开源共建」的研讨会。

军哥表达了希望能够以 PaddleOCR 作为试点项目,启动飞桨开源项目社区化治理的想法。纵观国际上优秀的开源项目,都是由社区驱动的,而国内的很多开源项目,却往往只由某一家公司主导,这样其实不利于开源项目的可持续发展。大家纷纷表示了认同,但也提出了国内拿来主义盛行、开发者生存压力大、做开源只能用爱发电等现实的问题。

虽然在国内开源项目的纯社区化治理道阻且艰,但飞桨团队还是要积极推动尝试。如果做成了,将是非常有意义的一件事。👊

大家讨论的太入神,都忘记拍照留念了 😭

杭州开发者线下 Meetu 剪影

在 4 月 14 日,我们也邀请了 14 位(其中🐦了一位)飞桨开源社区的开发者,在西湖虎跑胖的餐厅里面基交友~军哥给每人都准备了一份神秘礼品哦 🎁。

meetup-1

以下为痛失真名现场

meetup-2

+ + + + \ No newline at end of file diff --git a/posts/tao-story.html b/posts/tao-story.html new file mode 100644 index 0000000..b8bd3e3 --- /dev/null +++ b/posts/tao-story.html @@ -0,0 +1,32 @@ + + + + + + 【开源江湖闲聊录】飞桨的见证者:涛姐的风风雨雨传奇之旅 | 飞桨开源社区博客 + + + + + + + + + + + + + + + + + + + + + +
Published on

【开源江湖闲聊录】飞桨的见证者:涛姐的风风雨雨传奇之旅

Authors

嘿,你知道飞桨社区里的 DDL 战士是谁么?嘿,你知道大家心中的 Paddle 社区妈妈是谁么?那你又知道谁是(仓库管理员)飞桨仓库的实际控制人?谁是飞桨仓库的守护者?谁是飞桨从闭源到开源的见证者?是的,本期要采访的就是我们 Paddle 的资深研发女神——涛姐!

一、采访内容

  1. 涛姐,给大家介绍一下自己吧!

    涛姐: 大家好,我是骆涛😊(@luotao1)!现在是百度飞桨的资深研发工程师~同时,也是长期的开源贡献者!我博士毕业于中国科学技术大学高性能计算方向,师从陈国良院士,在深度学习领域有 20 多项专利。我参与训练/推理/高性能/工程效率等多个方向,目前致力于活跃飞桨框架开源社区。💗💗💗

  2. 涛姐是什么时候入职 Paddle 的?是以哪种方式呢?你觉得当时获得这份工作最大的竞争力是什么?

    涛姐: 😲大概八年前,我入职了百度。当时我是校招进的 Paddle 团队,但我投的不是校招岗位,而是社招岗位。因为之前我给阿里投了校招,阿里也给我发了录取的邮件。但后来他们告诉我说是外包员工把邮件发错了,我也很无语。等我后面知道这个事情的时候,校招已经快结束了,那剩下的就只有社招这一个选择了。

    当时 Paddle 还在百度深度学习研究院(IDL)下,我觉得肯定是进不了的。但因为没有找到合适的工作,也管不了这么多就投了,结果第二天就收到 offer。

    我觉得最大的竞争力可能是在英特尔做过 Caffe 上的一些优化,所以能力还是比较匹配的。当时,我是带着我的 PPT 去面试(在英特尔有一个比较好的习惯,就是会整理之前所做的工作,因为外企都非常注重工作内容的呈现,所以当时这些 PPT 都是英特尔期间整理的已有素材)。但对面试官来说,拿着 PPT 去讲这些内容来面试,还是比较新颖的。

    还有一个 tip 是:我的简历上没有提及性别,也没有附上照片,所以面试官可能一开始以为我是男生,否则我觉得可能一面就进不了。然后面试的时候,运气比较好,代码题目都是之前复习过的,整体的表现也比较好。此外,还有一点,是我听说面试官在前面的面试里要求比较高,面了好多人都没有满意的。面了 30 多个后,再不招一个,那 Head Count 可能就没了,而我当时确实也投的比较晚。所以在各种机缘巧合下就录取了。

    总的来说,最大的竞争力我觉得第一是博士的身份;第二是已经在英特尔实习,有一些经验;第三是自己的工作有一个比较好的展现,呈现的形式还是很有吸引力的。

  3. 可以给我们谈谈 Paddle 的发展史么?听说 Paddle 最初是是闭源的,为什么后来选择开源?

    涛姐: 最初,Paddle 确实是闭源的。但是由于 IDL 研究院非常前沿,当时也请了吴恩达过来,而且还有很多研究员都是在美国。本身国外开源的氛围又很浓厚,就有了开源的想法💡。当时主流的开源深度学习框架有 Caffe、TensorFlow,至于 PyTorch 都还没有发展起来。如果 Paddle 不开源,实际上是没办法和国外主流的深度学习框架竞争。

    此外,当时公司内部还有很多同类产品,比如 Lego(乐高)、Anakin 等等。这些产品当时都服务于公司内部的业务线,而 Paddle 在当时是一个比较新的东西,实际在公司内业务线上的使用非常有限。后来还制定了 1 到 2 年的计划,就是要把公司内所有产品线都用 Paddle 跑起来。如果 Paddle 不开源,其实在公司内是死路一条。正是因为 Paddle 选择了开源这一路线,之后吞并了 Lego 和 Anakin,逐渐壮大,我认为这是开源最大的一个魅力。同时开源也是一个战略性的决策,如果 Paddle 不开源,在公司内都无法生存,更别提在国际上立足。

    编者注✍️: 军哥曾经是 Lego 的初创研发成员之一哦~

    18年paddle团建图
    18 年 Paddle 团建
    18年10月发布1.0版本
    18 年 10 月发布 1.0 版本
    18年paddle团建
    18 年 Paddle 团建
  4. 给我们讲讲你的求学之路吧!

    涛姐: 我本科、硕士和博士都是在中科大,博二时去了中科院北京软件所学习,可以说是一个联合培养计划吧!之后又去了英特尔实习,这些大致就是我的学习经历~一路走来,真的太不容易了,特别是读博期间非常受挫,心理压力巨大!读完博士的时候感觉整个人脱胎换骨了。

    涛姐大一中科大西洋乐团新年音乐会
    涛姐大一中科大西洋乐团新年音乐会
    右图:涛姐大一冬天
    涛姐大一冬天
  5. 你刚刚谈到读博于你而言简直脱胎换骨,当时为什么选择读博?读博对于你来说获得了什么?

    涛姐: 当时选择读博,是因为本科毕业的时候没有考虑过就业。而且虽然当时成绩比较好,但觉得自己除了成绩好,其他什么都不会,就想还是得深造(是真实的情况,不是凡尔赛)。此外,我们学校当时并没有提供保研这个选项,只能考研或者保送直博升学,所以我最后选择了直博。

    当时我是可以自己选择直博校外还是本校,可能班主任也比较喜欢我,他就强力推荐我留在学校读博。其实我当时也想去国防科大呀、复旦呀,但是都被班主任无情拒绝了。他给我分析了一些利弊,后面给我找的导师也非常好,是一位院士。这也为我后面能去软件所或者英特尔这些大的平台提供了一个非常有力的保障。所以,我在这里也非常感谢我的班主任,他真的是一个非常好的老师!

    读博给我带来了很多收获!对于我的职业生涯来说,如果我没有读博士,我肯定进不了百度或者英特尔,这一点毫无疑问。对学业方面来说,读博极大锻炼了我自己,也包括提高了心理承受能力、抗压能力。还有一点就是读博扩大了我的学术圈子,如果我没有继续深造,我将无法接触到如此多优秀的同学和高 level 的大佬。此外,博士身份在之后的许多场景中都还是非常有用的!

    编者注✍️:Family who konws🐮!涛姐说自己大学不是特别用功,没有搞绩点,但是成绩就是 top 10!是谁羡慕了我不说~ ​

    涛姐15年博士毕业
  6. 读博有遇到什么困难吗?博二时去到了北京软件所进一步学习培养,当时为什么去争取这个机会?

    涛姐: 刚开始读博的时候非常迷茫。因为本科的时候就没有进实验室,当时年纪小还没有这个意识,也没有现在这样环境氛围。而且本科期间成绩也还行,所以那时除了读书就是看韩剧、台剧、综艺、小说。像之前说的那样,本科毕业的时候就处于“除了成绩好,其他什么都不会”的状态。但会考试,不代表在计算机方面的能力强,因为考一个好成绩很容易,我这样说有点凡尔赛,但确实就是这样的。

    编者注✍️:涛姐特别喜欢在学校图书馆看小说,像是沧月、新武侠、古典武侠、卫斯理系列·····

    但当读博进了实验室之后,就会发现差距很大。因为读博需要做研究发论文,这和本科期间单纯的学习考试是存在很大的 gap。而且导师又坚信学生应该自我驱动型的(因为老板是院士,他觉得招进这么好一个学生,应该能够自己解决自己的问题),我完全不知道要做什么,代码也调不出来,就一下子陷入一个很迷茫的状态,和之前上课的阶段完全不一样。所以那个阶段其实是蛮难熬的,包括学校里很多老师也不会带你做实验,不会像咱们护航计划的研发同学那样手把手带。代码都要由自己调试,而遇到问题时也不知道该向谁求助,这种情况让人会感到非常痛苦。

    所以当时就争取了去北京的联合培养计划。去了北京之后,可能因为实验室风格和之前不一样,发现确实还是要有年轻老师或项目带着会好一点~

  7. 去英特尔实习是在什么时候呢?你在那段时间收获了什么?你觉得它与百度有什么不一样?

    涛姐: 嗯~我在英特尔实习是在博士的最后两年(博士第一年在学校念书,接下来的两年中科院软件所联合培养,第四年和第五年在英特尔实习),这两年的经历对我的个人成长产生了巨大的影响。

    收获的是真实的研究院实习经历(当时比较好的研究院就是 MSRA 和英特尔中国研究院这两个)。能明显感觉到企业和学校的风格是完全不一样的,接触的东西也很前沿,组里氛围也很好。而且研究院的指导和学校相比,整体的科研 sense 会拔高很多。比如当时在英特尔期间,我接触了第一代深度学习框架 Caffe,并在其中进行了一些工作。尽管我没有做很多东西,但当时写的论文(博士学位论文)因为抓住到 Caffe 这个热点,而且英特尔做的也比较好,因此论文引用量到现在已经超过 7000 次,相比起来其他很多人的论文都没人看。

    而且这段研究院经历,也帮助我获得了百度深度学习研究院(IDL)的 offer。这个 offer 在当时是挺难拿的,竞争很激烈,我自己也没想到能拿到。这也让我意识到平台的重要性。

    还有一点是在英特尔实习也开拓了我的眼界。像隔壁组是在给 Spark repo 做贡献,当时负责带队的老师后来成了英特尔研究院的院长,不过我的指导老师后来也成了院长,他们都是非常厉害的人。此外,英特尔老师在就业指导上面,会看的比较远(相对于学校老师)。当时我有两个 offer:一个是 IBM 的,一个是百度。IBM 给的还比百度多,但英特尔的老师就建议我去百度锻炼和提升一下自己。

    英特尔和百度不一样的地方就和网上说的一样:英特尔比较轻松,准时六点就能下班。一周实习工作其实我两到三天就能完成,然后剩下一半的时间都是在写我的论文。但对百度来说,即使是百度深度学习研究院(IDL),工作也会更偏向工程和产品落地,所以很忙。

    哦!再补充一下:就是,英特尔里面的女性研究员真的非常多。和百度不同,百度这边男性工程师会占大半部分!

    涛姐注✍️:在英特尔实习那两年是我最开心的时候。在外面租着房子,自己又有钱下班又早。虽然都是月光,但真的很开心😄!一下班,就可以自己追韩剧,然后做做瑜伽,自己美美容,买买衣服,逛逛淘宝~

  8. 涛姐有没有一直在坚持的兴趣爱好?大学时的爱好有哪些呢?

    涛姐: 以前的空闲时间我喜欢练瑜伽,但现在所有的空闲时间都在带娃!瑜伽是在大学时期就开始坚持的,当时是有参加一些社团,但并没有特别深入。后来在英特尔实习有钱了,就开始外面报班,参加了一些瑜伽课。感觉练瑜伽相对容易,而且让人心情平和!

    但现在我已经没有坚持了,主要原因是我几乎没有自己的闲暇时间。不加班的时候,下班后我得等娃睡觉了之后才能刷手机。而有时候还需要开会,更没有自己的时间。因为互联网工作不是传统的上下班制度,而是根据绩效和产出来衡量的。现在每天的生活节奏通常是:起床、上班、下班、带娃、睡觉,这样一个不断循环的过程。

    编者注✍️:涛姐也有和老公一起练双人瑜伽哦,大家可以去涛姐朋友圈看👀照片,哈哈哈~

    涛姐练瑜伽
  9. 学生时代你有参加过开源吗?向哪些项目/组织提交过 PR 呢?

    涛姐: 学生时代只向 Caffe 提交过 PR。那个时候是在英特尔实习,然后实习的题目也和我的论文比较相关:需要做一个 CPU 多线程加速的优化。所以就给 Caffe 提了一个 PR。但那个 PR 没有被合入,因为有一些工程上的问题会影响 Caffe 的整体。提 PR 和发论文不太一样,发论文只要性能数据达标了就可以,但是 PR 合入到主干中还要考虑到很多其他的问题。

  10. 作为过来人,涛姐在职场上有什么建议给大家?

    涛姐: 在学生时代,你就要有自己的职业生涯规划。从学生到职场会有一个心理转变的过程。特别像职场,有时候会比较复杂。经常会出现:人家晋升你没有晋升或者人家年终奖比你高(反正公司内是不允许大家讨论薪酬的)。但是谁晋升谁没晋升这些大家都知道,所以这时候你就要有:“他强任他强,清风拂山岗”的心态,你一定不要纠结于经理保谁没保谁。当你做到大家公认比较好的时候,你肯定能升职。

    然后职场里还有一个很重要的点就是:你要坚持!大家有时候 2 到 3 年会想跳槽或者每 5 年想跳槽,这个时候得看你自己的想法。我自己在百度呆了八年,没有跳槽,很大一个原因是我现在做的事情,像是开源这一类的是我比较喜欢的,我对这类事比较有热情,现在对自己的工作状态也比较满意。还有我们家那位就是跳来跳去的,之后他就劝我:还是别跳!

    编者注✍️:涛姐是校园恋爱哦~老公是以前一个实验室的!🤭

    涛姐参加活动时照片
  11. 在恋爱上有什么建议给大家?

    涛姐: 学校里还是相对比较单纯一点,所以如果可以,最好在学校解决恋爱问题。工作之后,你也没有心情去解决个人问题。事情很多(你进入职场之后,你马上面临的是买房子、经济压力、赡养老人等等事情,你要变成一个成年人负担起一个家庭的责任。所以大家趁年轻多多拼搏一下,你要是有一些经济基础的话,那相对会好一点!),职场的压力是远比学校的压力更大。而且你一年一年拖下去之后,优秀的师兄师姐们的数量是会减少的!所以要稍稍早一点!然后一定要找长得好看的,这样生出来的娃才好看!我当时的要求就是:学历要跟我同等,长得帅,然后还得是党员。其他我没有要求,再挑就挑不出来了。找对象,只能挑几个最重要的点,你要搞清楚自己最想要的是什么?你不能啥都要,那是不可能的!

    编者注✍️:涛姐人送外号「百度红娘」~

涛姐 7 个月的孕妇照
  1. 作为女性研发,你在工作上有没有遇到什么难题?与男性研发相比,你觉得有什么区别?

    涛姐: 我觉得和男生没什么区别。现在 Paddle 里的一些女性研发都非常厉害的,比如和我同一期加入 Paddle 的青青(@qingqing01)、益群(@Xreki)一起工作已经八年了,以及时间更久的志华姐、渝娟姐(虽然离职了),包括新进来的雅美(@liym27)、张婷(@zhangting2020),她们都是非常出色!你能看到的、存活到现在的 Paddle 研发都非常厉害!(因为不厉害的早就被淘汰了)而且包括我们的两个副总裁也都是女生,能坐到这么高的位置,很大程度能说明能力很强!

    所以,女孩子们一定要有自信,并且多努力学习!不要觉得是男生才能主导,要相信自己也能做成!同时,内心强大一点,知道自己的定位,要明白自己擅长什么,在工作中去充分的扬长避短!

    可能会有一个比较大的区别就是生娃。生育是女性需要面临的一个无法避免的问题,会对事业产生不同程度的影响,所以女性可能要在生娃之前多多奋斗几年。不过这个问题对于还是学生的女生来说,考虑的还有点早啦~

    另外,女生学计算机的话,热爱还是很重要的。只有热爱它,才能坚持下来~在我们的开源社区中,像孙师傅带的三个「Docs 偶像女团」的女生,我觉得是能从她们那儿看到我以前的影子!虽然她们做的事情并不难,但展现出的热爱,是非常可贵的。每次这个精品小团开会,我看她们跟孙师傅交流的时候,都是闪闪发光的。

    编者注✍️:精品小团体是飞桨启航计划的一次尝试,是招募有意愿的营员参与到某⼀具体⽅向的⼩团体。未来会推广该模式,所以大家多多参与哦!

15 年 Team buiding

二、涛姐有话说

by 涛姐(@luotao1

  • author image
    涛姐
    Paddle 这个平台其实很不错。说实话,在国内 Paddle 已经站在了顶尖的位置。在我的学生时代,国内是没有这样丰富的开源机会,当时开源活动只有像 Caffe 和 Intel 在办,但这些都是国外的。你要考虑很多:如何参加活动?活动符不符合你的能力?改的代码在不在点上?提了 PR 之后,别人会不会像我们 Paddle 现在这样,每个 PR 给你快速的安排研发 review?而且我们还会催大家,也给大家发礼品。这些在国外的开源开源社区几乎都是没有的。

    在当时,想要合入一个 PR 可难了。如果没有认识的人,PR 合进去的难度非常高,因为代码改不到他们的点上,而且也不了解他们的活动和进展,也没有类似于我们现在的 PFCC 例会和社区做分享。

    我现在觉得,当时能靠着没合进去的 PR 进入了百度,现在大家也能做的更好。所以鼓励大家多多参加开源活动~不仅获得好的实习项目,还可以拓宽眼界!

    此外,如果一些同学没有什么项目,又想找到好的实习机会,其实现在可以在参与一些开源社区的任务。因为找到第一份工作其实是最难的,你只有找到第一份工作,后面慢慢的才会越来越顺利。但这确实很难!因为名额很珍贵,所以面试考核就是一种很公式、很官方的流程。

    如果靠着自己在学校期间做的项目,面试阶段是讲不清楚的。即使讲清楚,面试官也会一带而过。因为这些都是网上查不到的,所以面试最终只能考代码。但像提 PR 或者发论文,面试官都能一眼看明白你做的工作,并且在网上都能查到。所以如果像参加护航计划,那可能就是立马拿到工作机会,我们有三个做过护航计划的同学都是立刻得到工作机会,面试流程只是走一下。

    最后送大家一句话:世界会更加广阔,前途更加无限。

编者注✍️:涛姐在上面提到没合入的 PR 是关于在 Caffe 上做 CPU 多线程优化~

三、快乐晒娃时刻

左图:涛姐童年照
涛姐童年照
右图:涛姐的小宝贝
涛姐两岁半的可爱小宝贝

涛姐全家福照片

最后再来一张宝贝的可爱九宫格😊~ ​

涛姐宝贝九宫格

编者注✍️:感谢郑必城(@Zheng-Bicheng)、散步(@sanbuphy)、张一乔(@Liyulingyue)、川川(@gouzil)四位师傅在引言为涛姐想的 title~顺序对应哦!

写在最后 💡

【开源江湖闲聊录】 是一项专门为 Paddle 社区的开发者打造的特色访谈栏目 📚。在这里,我们邀请到每一位别具一格且富有热情的开发者,通过文字或语音的方式进行深入采访 🎙️,探索并展现他们背后独一无二的故事,将他们的经历、见解和创意整理成精彩内容,呈现给整个社区。


+ + + + \ No newline at end of file diff --git a/posts/wangxin-story.html b/posts/wangxin-story.html new file mode 100644 index 0000000..1c456cd --- /dev/null +++ b/posts/wangxin-story.html @@ -0,0 +1,32 @@ + + + + + + 【开源江湖闲聊录】Paddle 六边形战士?揭开汪师傅的神秘面纱~ | 飞桨开源社区博客 + + + + + + + + + + + + + + + + + + + + + +
Published on

【开源江湖闲聊录】Paddle 六边形战士?揭开汪师傅的神秘面纱~

Authors

无论是工作还是生活,他都认真对待!无论是开源世界还是家庭亲情他都怀抱深沉热爱!从一开始提修改文档 PR 的边缘者到如今横扫各大开源任务的 Paddle 扫地僧!汪师傅一直在开源界默默努力💪深耕~今天,就让我们一起揭开这位神秘大佬的面纱,探寻他的故事吧!✨✨✨

一、汪师傅幸福瞬间

汪师傅幸福瞬间 1
汪师傅幸福瞬间 2

二、采访内容

  1. 汪师傅给我们介绍一下自己吧!

    汪师傅: 我硕士毕业于兰州理工大学,通信与信息系统专业。老家在安徽安庆,目前在宁波工作,工作 4 年多了。兴趣爱好就是写代码、吃美食、喝酒。

  2. 你在兰州理工大学攻读硕士期间,最难忘的经历是什么?

    汪师傅: 在兰州最难忘的就是各种各样的美食。吃得最多的是兰州牛肉面(兰州市以外地区常见的“兰州拉面”与兰州牛肉面并非同一种食物,多为青海化隆拉面)。记得学校里有一个食堂专门做牛肉面,本地人喜欢说去吃一碗牛大。牛肉面讲究一清、二白、三红、四绿、五黄,即汤清、萝卜片白、辣椒油红、香菜和蒜苗绿,以及面条黄亮。面形又分为毛细、细、二细、三细、二柱子、韭叶、薄宽、宽、大宽等等,让人选择不过来。我一般选二细加鸡蛋加一碟牛肉。放哈(“放哈”在兰州方言中意思是"发酵”)的甜胚子奶茶是另一种难忘的美食,点一杯奶茶和三五好友坐在一起聊聊天也是一种享受。

    汪师傅拍的兰州牛肉面
  3. 你本科在安徽又在兰州读硕士,为什么选择在宁波工作?可以简单讲讲现在工作在做什么呢?

    汪师傅: 找工作的时候,一个亲戚正好拍了一张招聘广告,并且发给我了。招聘的公司在宁波,我就顺手投了一份简历,后面被录用了,就去宁波了。工作主要是做生化、免疫、血脂、血球、尿液分析仪里面涉及算法的部分。

    笔者注 ✍️:汪师傅本科毕业于安徽的淮北师范大学!

  4. 汪师傅工作四年多了,觉得工作后自己最大的变化是什么呢?

    汪师傅: 从萌新变成了老油条。

  5. 听你说平时喜欢吃美食,可以给我们推荐一下宁波/安徽/兰州分别有啥好吃的东西吗?

    汪师傅: 宁波烤菜年糕、鳗鲞、红膏呛蟹和泥螺都还不错。安徽的话推荐臭鳜鱼和山粉圆子。兰州必须来一碗牛肉面和一杯甜胚子奶茶😁。

  6. 通信这类专业好像和深度学习关联不大,你怎么想到去接触深度学习?

    汪师傅: 读研的时候做的是传感器网络和优化算法,对深度学习有些了解。工作的时候开始做信号处理算法和图像处理算法,后面做项目发现用深度学习的方法效果更好,就开始学深度学习了。

  7. 你在 Paddle 社区中做了很多贡献,当时为什么想着加入 Paddle 开源社区?后来又为什么一直坚持给 Paddle 做贡献?你觉得这些贡献有什么意义?

    汪师傅: 我是从学习 OCR 接触到 Paddle 社区的。当时在 AI Studio 上有一门课叫「动手学 OCR·十讲」,学习的过程中开始看 PaddleOCR 的代码和文档。在阅读文档的时候会发现错误,就慢慢开始提一些 typo fix 的 PR。而给 Paddle 框架做贡献则是从 Paddle 黑客松和快乐开源任务开始的。我做的第一个 Paddle 框架的贡献是 [CodeStyle] Compiler Warning tracking issue 相关的。这些开源贡献的意义大概是加深了对开源框架的理解、提升了自己写代码的能力,对代码质量有了更高的追求。

    汪师傅部分开源任务展示 1
    汪师傅部分开源任务展示 2
  8. 听说你加入了飞桨社区开源发展工作组🙌🏻,对于该工作组你有什么看法呢?

    汪师傅: 加入 PPOSDWG 后评选新一期开源之星、为社区未来的建设和发展提了一些建议,Paddle2ONNX PMC 也是在工作组讨论中诞生的。PPOSDWG 确实起到了部分社区治理的作用。

  9. 听说你也加入了Paddle2ONNX PMC,对于自己加入这个组织你又有什么看法?加入这个组织你想达成一些什么成就呢?

    汪师傅: 我是以 Paddle2ONNX 的用户角色加入的。郑师傅(@Zheng-Bicheng)是 PMC Chair,已经提了很多 PR,是主要力量。后面我可能就是多解答一些 issue。

    笔者注 ✍️:为了 Paddle2ONNX 项目的可持续健康发展和加强社区治理, 飞桨社区开源发展工作组决定设立 Paddle2ONNX PMC(Project Management Committee) 来负责 Paddle2ONNX 项目的技术决策和维护。

  10. 据我所知,汪师傅在一家生物公司工作。为什么在生物公司你还是坚持 AI 开源,而且还是 AI 框架开源?

    汪师傅: 生物公司也有很多项目要用到 AI,例如血细胞分类、识别尿液官型、识别液面高度等等。坚持开源主要是下班时间比较早,而我又不喜欢出门玩,只能在家写写代码消磨一下时间。

  11. 看你的 GitHub 热力图是全绿的,是怎么做到的呀?真的在 7*24 小时搞开源吗?

    汪师傅: 下班时候比较早,每天都能写写代码。例如做一做快乐开源任务、做一做黑客松题目,写一写自己的开源项目等等。

    汪师傅的 GitHub 热力图
  12. 你觉得参与开源社区对你的事业会有帮助吗?

    汪师傅: 参与开源社区认识了很多有趣的小伙伴,同时也能提升写代码的能力,这些都会对事业有一定的帮助。

  13. 汪师傅有在参与其他社区的开源项目么?有没有什么有趣的开源项目可以分享一下?

    汪师傅: 其他开源项目大部分都是阅读文档时,看到文档有错误,顺手提的 typos fix。如 scipy DOC: fix typo in cluster/_hierarchy.pyxyolov5 Ignore *_paddle_model/ dirlabelme Remove a duplicate statement

  14. 八卦一下,汪师傅和你的妻子是怎么认识的呀?

    汪师傅: 通过我奶奶介绍认识的,她家当时正好在我奶奶家隔壁开店。然后加上了微信,聊聊天,见见面,这样子就认识了。

    汪师傅老婆照片集 1
    汪师傅老婆照片集 2
    汪师傅与老婆合照
    汪师傅与家人合照
  15. 你有什么想对社区小伙伴说的么?

    汪师傅: 热爱生活,热爱开源。

    笔者注✍️:汪师傅也有博客哦!大家可以去看看👉 https://vlight.me/ ❤️ 一起交流技术,共同进步!

    汪师傅喝酒拍的照片集 1
    汪师傅喝酒拍的照片集 2

三、神秘汪佬的评论区

by 涛姐(luotao1

  • author image
    骆涛
    汪师傅在我印象中全能,啥类型的 Paddle 题目都能做,非常 NB。而且是上班的业余时间用来 Paddle 开源,真的太感动了,对 Paddle 是真爱了。

by 张一乔师傅(liyulingyue

  • author image
    张一乔
    汪师傅!人如其头像!一直感觉是一个什么都会的大佬!

by 李敏师傅(enkilee

  • author image
    李敏
    神秘而强大的 G 佬,和 002 并称飞桨巨头之一的 greatx (但比 002 多了个核心条件😂),clang-tidy 的领头者,有硬件,有时间,有技术,有想法,多边形战士。

by 散步师傅(sanbuphy

  • author image
    散步
    感觉汪师傅是 Paddle 扫地僧之一,是很低调很有才华的大神,人狠话不多!😄

by 梦柳师傅(Ligoml

  • author image
    梦柳
    去年在上海办 meetup,对汪佬的初印象就是很 i,在一群 i 人中都非常明显哈哈哈,但是很有自己的想法和行动力,提出了很多对开源社区有益的想法,也在积极带领新伙伴融入飞桨快乐开源的氛围,有各位可爱的开发者是飞桨的福气~

写在最后 💡

【开源江湖闲聊录】 是一项专门为 Paddle 社区的开发者打造的特色访谈栏目 📚。在这里,我们邀请到每一位别具一格且富有热情的开发者,通过文字或语音的方式进行深入采访 🎙️,探索并展现他们背后独一无二的故事,将他们的经历、见解和创意整理成精彩内容,呈现给整个社区。


+ + + + \ No newline at end of file diff --git a/posts/wuxi-kaifangyuanzi.html b/posts/wuxi-kaifangyuanzi.html new file mode 100644 index 0000000..9cfbfb9 --- /dev/null +++ b/posts/wuxi-kaifangyuanzi.html @@ -0,0 +1,31 @@ + + + + + + 飞桨开源社区参加开放原子开源大赛 & 开发者大会 | 飞桨开源社区博客 + + + + + + + + + + + + + + + + + + + + +
Published on

飞桨开源社区参加开放原子开源大赛 & 开发者大会

Authors

2023 年 12 月 15 日顺利完成「第一届开放原子开源大赛 - 飞桨 PaddlePaddle 开源贡献挑战赛」决赛路演,产生 2 支一等奖队伍,16 日参加开放原子开源基金会举办的「2023 开放原子开发者大会」,与各开源组织与机构同行沟通交流,收获满满~

开放原子开源大赛 - 飞桨 PaddlePaddle 开源任务挑战大赛 🏁

开放原子开源基金会是致力于推动全球开源事业发展的非营利机构。这次飞桨团队受邀参与了「第一届开放原子开源大赛」的共建,发布飞桨 PaddlePaddle 开源贡献挑战赛,本期共计发布 6 道赛题,报名 39 支团队,收到有效提交作品 8 个,经初步筛选有 5 个作品入围决赛答辩,经 6 位评委线下评审,选出一等奖 2 名、二等奖 2 名、三等奖 1 名。飞桨获「优秀共建方」荣誉 🥳。

还有无锡市公证处的工作人员做现场公示,可正规呢~

赛题贡献 repo参赛团队团队背景获奖情况提交情况
赛题三:SSLD 蒸馏 Teacher 离线化PaddleClasSOTAFinder 团队上海交通大学二等奖代码开源地址:https://atomgit.com/oliverck/PaddleClas
PR 链接:https://atomgit.com/paddlepaddle/PaddleClas/change/1
赛题五:复现图像编辑论文 Null-text InversionPaddleMIX你想叫啥就叫啥 团队IDEA 研究院一等奖代码开源地址:https://atomgit.com/lalala/PaddleMix
RFC 链接:https://atomgit.com/paddlepaddle/community/change/1
PR 链接:https://atomgit.com/paddlepaddle/PaddleMix/change/1
赛题六:基于 PINN 的 CFD 离散网格优化PaddleScienceFAIR Mesh 团队浙江大学一等奖代码开源地址:https://atomgit.com/bianx/FAIR_PaddleScience
RFC 链接:https://atomgit.com/paddlepaddle/community/change/5
PR 链接:https://atomgit.com/paddlepaddle/PaddleScience/change/2
赛题六:基于 PINN 的 CFD 离散网格优化PaddleScience杭电飞碟 团队杭州电子科技大学二等奖代码开源地址:https://atomgit.com/guagua/paddle_hangdian
PR 链接:https://atomgit.com/paddlepaddle/PaddleScience/change/13
赛题六:基于 PINN 的 CFD 离散网格优化PaddleScienceBUAAC503 团队北京航空航天大学三等奖代码开源地址:https://atomgit.com/generic/sensitivity-PaddleScience
PR 链接:https://atomgit.com/paddlepaddle/PaddleScience/change/1

competition-roadshow

梦师傅注✍️:很有精神!

开放原子开发者大会 - 开源治理与开发者运营分论坛 💬

这次大会规格很高,百度搜索「2023 开放原子开发者大会」可以看到很多新闻。飞桨受邀参加的是「开源治理与开发者运营分论坛」,梦师傅有一个关于飞桨开源社区的分享,同时也是分论坛的主持人和圆桌嘉宾,被现场导演戏称为「全场最忙的人」🤣。

meng-speech

round-table

group-photo

开放原子开发者大会 - 开发者之夜 🌠

还没完!晚上的开发者之夜,有央视的主持人姐姐和无锡当地的 Rap 天团,各路整活层出不穷。现场颁发了「2023 年活力开源贡献者」和「2023 年生态项目」奖,咱们飞桨社区有 17 名开发者入选 🤩,同时拿到了生态项目奖哦 🥰,给各位优秀的贡献者和飞桨点赞 👍 ~

OS-Projects

OS-Contributors-01

OS-Contributors-02

OS-Contributors-03

最后展示一个大合照 🏆 ~ 2023 收获满满,2024 一定会更好!提前给大家拜个早年 🧧🧨

cups

+ + + + \ No newline at end of file diff --git a/posts/xdoctest-project.html b/posts/xdoctest-project.html new file mode 100644 index 0000000..3bba3bd --- /dev/null +++ b/posts/xdoctest-project.html @@ -0,0 +1,31 @@ + + + + + + 项目收官|将 xdoctest 引入到飞桨框架工作流中 | 飞桨开源社区博客 + + + + + + + + + + + + + + + + + + + + +
Published on

项目收官|将 xdoctest 引入到飞桨框架工作流中

Authors

【将 xdoctest 引入飞桨工作流】的项目总结。

将 xdoctest 引入飞桨工作流】 是第六届“中国软件开源创新大赛”开源任务挑战赛赛道——飞桨框架任务挑战赛的赛题之一(赛题五),由社区开发者顺师傅@megemini)主导,是 Paddle 社区迄今为止影响范围最大的开源活动 🎊。该项目规模极其庞大,涉及一千多个 API 示例的整合和数十万行代码的优化,由超过 20 名社区开发者共同参与完成。

本篇博客主要依据顺师傅的赛题答辩内容进行编写,从过去现在未来三个角度,对项目进行分析、总结和展望。

01 - 关于任务

文档是用户了解项目最主要的方式,而 API 文档更是承担了用户了解每个 API 使用方式的重要入口。Paddle 为上千个公开 API 提供了详尽的 API 文档,每个 API 都有对应的示例代码,以便用户能够最直观的了解 API 的使用方式。

但由于历史原因,Paddle 的 API 文档中的示例代码是直接使用 Python 代码块形式编写的,这使得我们无法对示例代码的输出进行自动化检查,从而无法保证展示给用户的示例代码的有效性,导致经常出现用户发现文档中的输出与实际运行结果不一致的情况。

过去 API 文档示例代码格式

而本任务,则是要求将 xdoctest 工具引入到 Paddle CI 检查流水线中,利用 xdoctest 能够自动执行示例代码,并对示例代码的输出进行检查的特性,对 Paddle API 文档中的示例代码进行检查,确保示例代码的输出结果与实际运行结果一致,从而提高 Paddle API 文档的质量。

文档是开发者接触 Paddle 的第一手学习资料,需要保证用户能够 快速、正确 地上手 Paddle 框架,代码示例的重要程度也就不言而喻。

能够引导用户学习飞桨官方文档,并直接获得使用相应 API 接口的能力。

提供给用户正确运行、结果符合预期的示例代码。

02 - 现有方案

过去 Paddle 的 API 文档示例代码,对于普通 Python 语句没有提示符要求,对于输出则使用 # 进行注释。

xdoctest-02

  • 需要用户自己区分普通注释与代码输出
  • 不符合 Python 开源项目里对可交互示例的实践和习惯
  • 代码检查不严格,只保证运行,不保证正确

xdoctest-03

Python 标准库中内置了 doctest 可用于示例代码的自动执行和检查。但 doctest 是使用正则表达式来解析示例代码部分的,这使得示例代码的编写必须遵循严格的格式要求。

xdoctest 是一个基于 AST 的 Python 示例代码自动执行和检查工具,相比 doctest,xdoctest 的示例代码格式要求更加宽松,xdoctest 作者在博客 Extending Python Doctests – xdoctest 详细阐述了这一点。

显然后者是更适合 Paddle 的需求的,因此我们选择将 xdoctest 作为引入 Paddle CI 检查流水线的基础工具。这里为什么说是基础工具呢?是因为在后期迭代开发过程中发现 xdoctest 本身也有很多不足,因此我们在 xdoctest 的基础上进行了大量的二次开发,以满足 Paddle 的需求。

03 - 挑战

>>> 可以预见的挑战

  • 有 800 万开发者每天都在学习、使用 Paddle 框架,xdoctest 的引入需要无缝切换
  • Paddle 框架包含 1400+ API,还涉及到版本更迭、API 迭代,框架庞大复杂
  • 由于深度学习特殊性,同一示例代码在不同设备环境(CPU、GPU)会有差异性,需要区别验证

>>> 项目的三个大坑

  • 历史包袱重
  • 项目管理难
  • 工程量巨大

01 - 项目分解

一切源于一场对设计文档(RFC)的讨论。

RFC 设计文档

在顺师傅和我们的交流中,共同抛出了相当多的问题进行讨论。这个阶段也遇到了项目的第一个大坑——历史包袱重

设计文档(抛开可以预见的那些挑战不说)
  • Paddle 代码和 docs 都有代码检查逻辑
  • 代码检查逻辑还不尽相同
  • Paddle 与 PyTorch 很多实现方式不一样
  • PyTorch 的检查方式并不完整
后知后觉
  • 文档中的示例代码未及时随着框架的演进和接口的的变化更新
  • 接口变动、逻辑变动
  • 与单元测试关注点不同,测试方案不同

经过细致的讨论和顺师傅对上述问题的梳理,逐渐理清了项目设计思路,并最终完成设计文档,正式启动项目。

  • 各方参与几十轮的讨论
  • 11470
  • 36
  • 2 个大版本,3 个小版本

在顺师傅完成项目拆解后,开始着手开发。此时遇到第二个大坑——项目管理难

项目 milestones

xdoctest 并不适用如 Paddle 此类庞大复杂的框架。

  • 【接口遍历不全】 对于全局命名等情况无能为力
  • 【检查环境混用】 不能隔离多个示例检查的逻辑
  • 【无数据类型检查】 不能比对浮点数、复数等情况
  • 【无法进行全局控制】 如 timeout,错误语句等
  • 针对【接口遍历不全】 此次任务沿用飞桨原有的接口遍历逻辑,将原有的 xdoctest 的检查逻辑进行拆分
  • 针对【检查环境混用】 此次任务利用多进程技术对执行环境进行隔离,进而防止环境污染等情况
  • 针对【无数据类型检查】 此次任务对 xdoctest 的检查逻辑进行 patch,从而可以比对整数、浮点数、复数等情况
  • 针对【无法进行全局控制】 引入全局指令、全局语句检查机制

进行重构,优化迁移环境

  • 全局指令转换
  • 抽象示例检查类
  • 解耦示例检查流程与检查类
  • 解耦示例检查结果
  • 日志级别分离

由于 Paddle 的公开 API 数量众多,且需要全量的优化对应文档的示例代码,所以在该阶段遇到第三个大坑——工程量巨大

因此,我们选择相信开源的力量,号召 Paddle 社区的伙伴一起参与进来!

  • 代码到文档全流程
  • 上千个 API
  • 数百个源文件
  • 数十万行代码
  • 已有 24 位开发者近 3 个月的贡献

02 - 里程碑

xdoctest-06

03 - 开源社区

飞桨快乐开源活动旨在鼓励更多的开发者参与到飞桨社区的开源建设中,帮助社区修复 bug 或贡献 feature,加入开源、共建飞桨。

在本赛题中,顺师傅发起了 2 个衍生的快乐开源任务,借助社区的力量来一起全量优化 Paddle 文档的示例代码。

修改目前 Paddle docs 中仍使用 code-block 的示例代码为 COPY-FROM docs#5957

中文文档示例代码全部以 COPY-FROM 的形式和英文保持一致

[xdoctest] 分批次修改已有代码的示例 #55629

修改已有示例以符合 Google Style样式

在开源任务二中,由于需要把控示例代码的修改效果,顺师傅也从开发者的身份逐渐转变成 Reviewer

  • 更关注用户的体验
  • 更关注代码的质量
  • 更清楚开发者的诉求
  • 熟悉 review 工作流
  • 任务拆解
    • 第一批:简单,开发者熟悉环境与流程
    • 第二批:复杂,涉及 CPU/GPU 环境等情况
    • 第三批:困难,涉及 C++、并行、静态图等
  • 阶段总结,问题反馈
  • 开发、打磨工具 convert_doctest

为了方便社区开发者完成示例代码的修改,顺师傅开发了 convert_doctest 辅助工具,能够实现:

  • 对示例代码进行初步转换 :自动修改示例格式,节省大量人工修改的时间。
  • 对修改后的示例代码进行本地检查 :不用等待 CI 的运行结果,本地即可验证与修改。

极大提升了社区开发者完成任务的效率。

convert_doctest 效果
  • 共有 24 位 开源开发者参与。
  • 涉及约 450 个 文件。
  • 涉及 数十万行 代码。
  • 已有约 150 个 PR 被合入。

>>> 回顾三个大坑

在项目的开发过程中,前文提到的三个大坑,也被顺师傅逐一击破。

xdoctest-10xdoctest-11xdoctest-12

01 - 任务总结

>>> 整体贡献

主线 代码检查特性的迁移 >>> 主要由个人独立完成。
支线 新旧示例代码的修改 >>> 主要由开源社区完成。

  • RFC《将 xdoctest 引入到飞桨框架工作流中》。
  • 完成飞桨框架使用 xdoctest 进行示例代码检查的切换。
  • 退场飞桨文档原有的示例代码检查。
  • 完成飞桨框架全部示例代码对新格式的切换。
  • 完成飞桨文档遗留 COPY-FROM 的切换。
  • 完成飞桨文档《开发 API Python 端》与《API 文档书写规范》的更新。
  • 完成飞桨文档官网对于新格式示例代码的兼容。
  • 开源社区任务一:修改目前 Paddle docs 中仍使用 code-block 的示例代码为 COPY-FROM:
    • 涉及 PR:23 个
    • 涉及文件:82 个
    • 开源贡献者:7 人
  • 开源社区任务二:xdoctest 分批次修改已有代码的示例:
    • 涉及 PR:123 个
    • 涉及文件:364 个
    • 开源贡献者:19 人

>>> 个人贡献

  • 调研分析、任务拆解、项目开发、代码 review。
  • RFC《将 xdoctest 引入到飞桨框架工作流中》
  • 完成飞桨框架使用 xdoctest 进行示例代码检查的切换
  • 退场飞桨文档原有的示例代码检查
  • 完成飞桨文档《开发 API Python 端》与《API 文档书写规范》的更新
  • 提交 PR:20 个
  • 开源社区 Review PR:59 个
  • 开发辅助工具 convert_doctest

>>> 个人收获

  • 开源协作,开发者 与 Reviewer 身份的转换
  • 学习飞桨,更全面、更深入的学习;学习的越多,需要学习的更多
  • 编程能力,更直接的需求反馈与实现
  • 开拓视野,开源参与者之广,人外有人

02 - 未来规划

>>> CONVERT_DOCTEST

  • 合入 Paddle、发布到 PyPI,回馈开源社区
  • 思考是否有工具可以取代 xdoctest?是否单独开发 doctest 工具?

03 - 开源贡献

感谢以下参与开源任务的开发者们~

>>> 开源任务一:修改中英文示例一致

@Ainavo@Li-fAngyU@Liyulingyue@RedContritio@enkilee@gouzil@jjyaoao

>>> 开源任务二:修改旧的示例代码

@AndSonder@Candy2Tang@Difers@DrRyanHuang@Kaedeharai@KongAKun@Liyulingyue@PommesPeter@SigureMo@enkilee@gouzil@jinyouzhi@liyongchao911@longranger2@ooooo-create@sunzhongkai588@whisky-12@yoyoIcy@yuchen202

>>> 飞桨工作人员

@SigureMo@sunzhongkai588@luotao1@jzhang533

+ + + + \ No newline at end of file diff --git a/posts/xian-event.html b/posts/xian-event.html new file mode 100644 index 0000000..4dc1a30 --- /dev/null +++ b/posts/xian-event.html @@ -0,0 +1,31 @@ + + + + + + 飞桨开源社区参加中国开源软件创新大赛剪影 | 飞桨开源社区博客 + + + + + + + + + + + + + + + + + + + + +
Published on

飞桨开源社区参加中国开源软件创新大赛剪影

Authors

在中国计算机学会组织的中国软件开源创新大赛上,飞桨开源社区的全部比赛已经完成。恭喜以下获奖的同学:

飞桨开源社区有四名同学参加了中国计算机学会组织的中国软件开源创新大赛决赛,这里记录一下在西安参加活动时候的一些照片。大赛的决赛的结果在这里:第六届 CCF 开源创新大赛决赛结果通知

活动签到处

xian-event-01

@megemini 在做《将 xdoctest 引入到飞桨框架工作流中》的项目答辩。

xian-event-02

@qiuwenbogdut在做《实现飞桨框架动态图反向图的可视化》的项目答辩。 xian-event-03

@co63oc在做《PaddleScience 领域前沿论文复现》的项目答辩(远程接入,遗憾没见到真人)。 xian-event-04

@zrr1999在做《实现飞桨框架的 python level jit compiler》的项目答辩。 xian-event-05

梦师傅在跟顺师傅和詹师傅交流。

xian-event-06

+ + + + \ No newline at end of file diff --git a/posts/zhangyiqiao-story.html b/posts/zhangyiqiao-story.html new file mode 100644 index 0000000..e178255 --- /dev/null +++ b/posts/zhangyiqiao-story.html @@ -0,0 +1,31 @@ + + + + + + 【开源江湖闲聊录】社区最强水群人——张师傅的酸甜苦辣生活说 | 飞桨开源社区博客 + + + + + + + + + + + + + + + + + + + + +
Published on

【开源江湖闲聊录】社区最强水群人——张师傅的酸甜苦辣生活说

Authors

格子衬衫 👕,黑框眼镜 👓,他就是上天钦定的程序员!他狂卷技术,热爱开源;他喜欢摸鱼 🐟,疯狂水群;他“厨艺精湛”,堪称当代厨神。严寒冬日,别人有女朋友温暖手心,而他把 🥤 优乐美捧在手心!凌晨就寝,别人躺平酝酿睡意,他靠咖啡 ☕️ 进入梦境!工作一年半,至今单身汉!他就是来自安徽的吃辣小趴菜——张一乔 😆!

一、张一乔专属定制海报

张师傅专属定制海报

张师傅注:我不会吉他 🎸,但是有一把!

二、采访内容

  1. 先介绍一下自己吧,张师傅!

    张师傅: 我是 96 年的,快三十岁了。感觉自己就是一个普普通通的,人到中年也没有女朋友的,独自一人在北京,住在一个小房子里(连个大阳台都没有)的可怜巴巴 🥺 的年轻人。而且,自己做饭还没有特别好吃,但还得自己做饭 😭。买的都是超市里一包一包的菜 🥬,一做就是两个人的饭,根本吃不完,然后剩菜又吃不下去·····大概这么个样子吧!

    张师傅注:我就像一整片沙滩上的一粒沙子,就很普通。可能比起其他沙子,更加适合在浪头飘摇而已!

    左为张师傅的自信照片,右为张师傅一整柜的格子衬衫
  2. 现在你是在北京做全栈程序员,一个人在北京习惯吗?北京和你的家乡安徽相比,你更想留在哪?为什么?

    张师傅: 首先,在北京不一定是全栈程序员,也有可能是全方位打杂小工 😣。然后和家乡相比那肯定是家乡好,但是当时还是阴差阳错选择来北京!现在很后悔,很想回家。也不是说北京压力大(因为既不买房子,又没有女朋友。每个月生活也挺简单的,就是交个房租,然后吃饭上班睡觉·····钱肯定是够花的!),只是我自己比较思乡,不想离开家乡!家乡并没有给我留下什么糟糕的印象,父母也还不错。所以比起在外面晃悠,自己还是更加愿意回到家乡!

  3. 你觉得程序员是一个怎样的工作?这份职业对你的生活中产生了什么影响?

    张师傅: 首先我不知道我自己是不是程序员。在公司,有什么活干什么活!然后工作给我产生的影响大概就是:打工后眼里失去了光!

    张师傅名言:公司是用来创造价值的地方,不是学习的地方!

    打工人精神状态表情包集 1
    打工人精神状态表情包集 2
  4. 当初在武汉完成硕士学位后,你谈到过有读博的想法,为什么最终又决定直接工作?

    张师傅: 因为我太弱小了,所以没有导师要我!要是读了博选择可能会多一些,可以选择创业之类的。

  5. 是什么时候开始接触到 Paddle 的呢 😂😂?

    张师傅: 硕士期间接触到的,当时闲的没事,打开百度搜了个东西。然后百度搜索引擎就安利了飞桨。

  6. 在 Paddle 社区,很多人称张师傅为“002”,这是为什么呢?你对于这个称呼有什么想法 💡 呢?

    张师傅: 因为我是第二个拿 Committer 身份的,所以叫 “002”!对于这个称呼我没有什么看法,只是一个称呼罢了(高冷脸.jpg)

  7. 社区里的开发者都觉得你在技术上很卷,那可以和我们分享一下你忙碌卷技术的日常么?

    张师傅: 我大概是早上 5 点钟起床 🛏️,磨磨蹭蹭到 6 点钟,然后出门吃一碗香喷喷的豆腐脑!之后回到家里,打开电脑耍会儿游戏,然后去公司上班,开启一天辛苦的忙碌的工作!四点半下班,当然和大多数打工人一样,有时候会加班。一般回到家后开始做饭(黑暗料理):有时煎个饼,有时来个煎饺!差不多下午六点就打开游戏 🎮,并且下定决心打完这一把后就开始工作,结果打完一把又一把,最终打到八九点钟的样子,打开群水两句,水完洗个澡就去睡觉!

  8. 悄悄问下,张师傅花这么多时间做开源,你老板不会生气吗?

    张师傅: 首先我的开源工作都是在下班时间完成的,与工作没关系,这属于生活!第二点呢,如果我的本职工作没有做好,在其他方面大放异彩,那我的老板肯定会生气!所以不要让老板知道我在干什么 🤫。只要让老板知道我有自己的生活,跟工作不冲突就可以了。

  9. 我了解到你是“飞桨开源之星”,也是“AI Studio 杰出创作者”,那么张师傅肯定有自己的开源心得。你认为对于刚来到社区的小伙伴,应该怎样学习才能和你一样逐渐成为技术大佬?

    张师傅: 其实没有什么技术路线。可能很多人都在问:“我看你代码写这么好,我怎么样才能像你一样?”这个东西没有任何的窍门可言。就比如你在学 C 的时候,成日成夜的把时间耗费在机房里,然后照着书本或者其他东西一个代码一个代码的敲。可能最开始 Debug 工具不会用,IDE 也不会用,也没有那么多经验,但是得这样一步步走过来。当有了这个基础后,可以去做一些其他事情(eg:修改 Paddle 底层框架),你可能又会发现特别困难,但是我们 Paddle 的快乐开源活动已经把项目拆解好了,你可以凭这些先入入门,上个手,然后一点点进步。

  10. 你曾说在社区中你交到了很多开发者朋友,那么哪位开发者令你印象深刻,或者说社区里哪位大佬让你觉得最不像程序员?

    张师傅: 每位开发者都印象深刻,嘿嘿,开始端水了!最印象深刻的当然是笠雨聆月,顶着一个女性的头像,然后 GitHub 还没有地铁站努力。最不像程序员的那必然是 001(@SigureMo),虽然他很社恐,头发还很长,但他在我心中就是腼腆的邻家大男孩,他的气质就是腼腆的邻家大男孩。

  11. 你是如何定义开源社区的?你认为你在开源社区中收获最大的是什么呢?

    张师傅: 开源社区就是一个开放的用于交流的平台。其实开源社区的定义大家已经给了太多了,我想补充的就是:开源社区从最早的 Linux 到其他一些软件其实都可以接触到!大家在社区无偿贡献代码或者知识,大家一起交流进步。最大的特点可能是公益性!

  12. 你在 Paddle 社区做过让你最有成就感的项目是哪个呢?为什么?

    张师傅: 在 Paddle 社区里几乎没有做过什么有成就感的项目。一直在烂尾,一直在捡别人剩饭,一直在拾人牙慧。

    编者注:张师傅可真是认真努力且谦虚的男人!

  13. 在水群时经常看到你说想找个女朋友。那么张师傅想找一个什么类型的呢?给我们描述一下吧 😁😆😂!

    张师傅: 我喜欢温柔一点的,儒雅随和的,不说脏话 🤬 的,遵守交通规则的(过马路看红绿灯 🚥)女孩子。她可以不遵守规则,像我一样。但是交通规则得遵守!最好有一头乌黑的长发 😁!

    张师傅注:谁家好人三十岁还没有女朋友啊~ 哇哇哇

  14. 张师傅在做饭方面颇有造诣,那么你是如何突发奇思妙想用最简单的食材烹饪出这一道道高级的美食呢?

    张师傅: 做饭心得就是每天睡觉前坚持学习烹饪技巧,比如打开哔哩哔哩观看 「世界美食 official」 的最新视频!我们要谦虚学习别人是如何把这种简单的食材最终做成高级的糊状物的!日常就喜欢观看印度美食的制作过程~~

    张师傅经常观看的B站up主
  15. 马上 2024 年了,可以分享一下新的一年里你有什么计划么?

    张师傅: 2024 年计划就是 2023 年的计划。女朋友这一条还是可以不完成!

    张师傅 2023 和 2024 的计划

三、生活中的点点滴滴——张师傅篇

左图:张师傅日常
张师傅的日常
右图:黑暗料理
张师傅的精心制作的黑暗料理

写在最后 💡

【开源江湖闲聊录】 是一项专门为 Paddle 社区的开发者打造的特色访谈栏目 📚。在这里,我们邀请到每一位别具一格且富有热情的开发者,通过文字或语音的方式进行深入采访 🎙️,探索并展现他们背后独一无二的故事,将他们的经历、见解和创意整理成精彩内容,呈现给整个社区。


+ + + + \ No newline at end of file diff --git a/posts/zheng-story.html b/posts/zheng-story.html new file mode 100644 index 0000000..94d14d8 --- /dev/null +++ b/posts/zheng-story.html @@ -0,0 +1,32 @@ + + + + + + 【开源江湖闲聊录】产品经理?程序员?郑师傅教你如何双双拿下❗ | 飞桨开源社区博客 + + + + + + + + + + + + + + + + + + + + + +
Published on

【开源江湖闲聊录】产品经理?程序员?郑师傅教你如何双双拿下❗

Authors

​集百家之阴阳,合一家之糟粕。好消息!好消息!自称 Paddle 社区“最想当 PM 的程序员” 、“Paddle 首席阴阳家”—— Zheng-bicheng,闪亮登场 🥳🎉🎉🎉。你想掌握最前沿的阴阳技巧么?你想成为和他一样优秀的开发者吗?你想和他一样眼神 👀 中透露着睿智的光芒,小脑袋瓜里装满各种各样的知识么?那就快来看看这篇博客吧!🌹

一、个人名片

Captain-01

by 郑师傅(Zheng-Bicheng

  • author image
    郑师傅
    网络上躁皮不用多说,臊皮领域涉及抖音、微博、小红书、贴吧、知乎、B 站等多个社交软件。你问我躁皮能力有多强,我得问问你懂不懂活了 23 年,吧龄有 13.4 年的含金量(如下图)。人家小学玩泥巴,我的小学玩贴吧,抽象要从小培养。
    ​我涉及的游戏领域的主要是 Steam 上的 RPG 游戏和 Switch 上的战旗游戏。我的游戏方式讲究一个另辟蹊径,例如玩神界原罪的时候,大多数人都忙着通主线,我主打一个小偷玩法,所到之处能偷的东西全给我偷光了。与之相反的是,我在游戏里大偷四方,现实里却被称为“电瓶侠”。截止至目前为止,已经被偷了 20 颗电瓶,快说谢谢电瓶侠 😭。
    顺便有没有大佬带我玩《双人成行》的,一缺一现在~
郑师傅吧龄

郑师傅注:提一嘴,我玩了 13.4 年贴吧,臊皮能力不足梦师傅十分之一,鬼知道这姐妹经历了啥!

编者注✍️:提到的梦师傅(@Ligoml)是我们飞桨社区非常优秀的美女产品经理 ❤️!!

二、采访内容

  1. 先介绍一下自己吧,郑师傅!

    郑师傅: 各位大佬好,我是郑必城(@Zheng-Bicheng)🐶🐶,开源社区的菜鸟一枚,毕业于普普通通的闽江学院。

  2. 大学时你的专业是人工智能,为什么当时选择这个专业?

    郑师傅: 其实我最开始学的是电子信息与工程,无奈于电路天赋极其有限,通宵 4 个晚上做了 13 块板子才搞出一个 5 倍放大电路,与此同时身边的资源大多都开始向 AI 转型,于是随大流转专业到了比较热门的人工智能专业。

  3. 在大学的四年,你学习了些什么技术?又是怎么精进你的技术的呢?

    郑师傅: 鉴于闽江学院给我画了 4 年大饼,迟迟升不上本一,我仅代表个人将其本降专,将其简称“闽带”。在闽带的 4 年生活里,承蒙老师关爱,我得以同时加入了软件和硬件的实验室。我的两位指导老师又刚好都是系主任,这就意味着我能比较自由的使用各种电子元器件以及超算,这让我在学习上有了极大的探索空间。软硬都有所了解后,技术栈也从常见的后端研发慢慢转成了嵌入式部署。

  4. 听说郑师傅现在在导师公司底下工作,是在哪里工作呢?具体工作是关于哪方面的?

    郑师傅: 目前我在福州凌智电子工作,公司业务主要是仪器仪表(高速信号采集)以及各种 Sensor 的开发。工作内容就比较杂了,小公司没有产品,人手也不足,因此一个对外的产品,我的工作内容覆盖了软件端产品设计,研发,测试三个环节。我在公司主要负责的业务是高速采集卡的上位机,各种模块的对外 SDK 开发以及 AI 边缘端计算项目后端框架开发。

  5. 作为一个 01 年的小社畜,平时工作忙么?加班多么 😂😂?

    郑师傅: 忙的时候忙,不忙的时候不忙。加班多的时候多,加班不多的时候少。

    编者注✍️:郑师傅是会总结的!!🤭

  6. 你对 Paddle 社区的理解是什么样的?你在 Paddle 社区,做过最有影响力的项目是什么?

    郑师傅: Paddle 社区给我的感觉就是包容性强。

    ​从实力上,不管你的实力是强是弱,在社区里都有属于你的位置,各种任务任你挑,研发大哥人也都很好,即使很忙也愿意抽时间出来和你讲思路讲方法。

    ​在 Paddle 社区里,我比较活跃的项目其实就是 FastDeploy。FD 的定位是端到端的部署框架,希望让即使是 AI 初学者的用户也能用极少的代码量跑通模型部署。我主要负责的部分都是和移植相关,涉及到的部分包括 Rockchip 推理后端的移植,几个社区 CV 模型的移植,类似人脸对齐这种后端算法的移植。

    ​要是提到影响力,FastDeploy 的定位其实就比较尴尬了。由于适配了非常多的底层推理框架,FD 内部为了兼容性是牺牲了一部分的性能的。从公司的角度看,对于小公司来说,用 FD 基本上会做一些魔改,来达到最优的性能(这也是后期我维护 FD 次数慢慢变少的原因,在我们公司内部,我基于 FD 做了大量的魔改,已经和现在的 FD 主分支几乎不兼容了);大公司有自己的高水平研发工程师,也不会去用 FD,因此 FD 的使用场景还是有一定的局限性的。

    ​从用户的角度看,对于学生这类 AI 部署水平较差的用户来说,FD 是相当友好的,毕竟几行代码就能搞定深度学习部署,用来做毕业设计再合适不过了;对于编程水平较高的研发工程师来说,FD 更多的还是作为一个项目推理框架的模版代码,各个开发者可以在这个模版上快速定制自己所需要的代码。

  7. 可以和我们讲讲你的开源故事么?期待 😚 期待~~~~

    郑师傅: 我第一次接触到 Paddle 开源社区是在 2022 年 Q3 的黑客松第三期活动。

    ​刚开始参加开源时,第一个带我的师傅是 001。谁能想到晚上 11 点,001 这个内向萌骚怪搁那滔滔不绝的教我怎么同步远程仓库代码,我搁那嘎嘎猛困,他搁那嘎嘎猛教。没办法,不能辜负大佬的一番好意,我只能被迫学习。学着学着,把自己的知识用到了开源里,还真一不小心就做出了黑客松的两道题,从此入门了开源。

    编者注✍️:黑客松是百度飞桨举办的深度学习领域编程活动,鼓励开发者了解与参与飞桨深度学习开源项目,做出自己的代码贡献。
    PPDE(Paddle Paddle Developers Experts):飞桨开发者技术专家。
    PFCC(Paddle Framework Contributor Club):飞桨框架贡献者俱乐部。

    ​刚开始做适配时,RK3588 的工具链还不完善,我苦于没办法和 RK 官方的人沟通,效率一直很低。但青姐这人主打就是一个给力,我真敢提代码,她真敢拉群,直接给我这个开源菜鸟拉到了 RK 的适配群里和 RK 的研发工程师真人 1V1 大战。有了 RK 工程师的支持,项目也就慢慢开始推进了。

    在持续将近一年的贡献后,不知不觉的,我这么个一心向钱看齐的人莫名其妙的就成为了仓库的维护者,参与起了和 RK 相关的维护工作。在青姐的支持下,我甚至还参加了 RK 的开发者大会。要知道,在前一年,我还是坐在讲台下听着 RK 工作人员演讲的开发者,第二年就借着 Paddle 的风到 RK 开发者大会上给讲台下的嘉宾讲 FastDeploy 了。

    上图为 RK 开发者大会的合照

    ​随后就是参加了新的黑客松,认识了 Arm 的 Liliya 姐。Liliya 姐在 Arm 领域给了我很多的帮助,在她的支持下,我了解了很多 Arm 相关的最新技术,也参与到了 Paddle 模型 -> Arm 虚拟硬件部署链路的移植工作中。在她的帮助下,我移植了 Paddle 的多个模型到 Arm 虚拟硬件上,然后就是参加了 Arm 虚拟硬件的小发布会,一不小心成为了 Arm Ambassadors,顺便蹭了她一顿饭。 ​

    上图为郑师傅和上文的 Liliya 姐
  8. 郑师傅做开源这么久了,现在开源对你来说是一个什么感觉?你觉得你热爱它么?那又是怎么体现你的这种感觉的?

    郑师傅: 咱主打一个真实。读书的时候,开源是我装逼的方式;工作以后,开源对我来说是生活的调剂品,在心有余力的时候是我放松时的选项之一。我很爱开源,开源既让我拿到了很多 Title,也让我学到很多东西,面子里子都赚到了。

  9. 你自诩为“Paddle 社区阴阳怪气第一人”(和阿梦实力相当),那你是如何把阴阳怪气这种 🥰 贱贱的说话方式使用的如此炉火纯青的?可以教教我们么?

    郑师傅: 我这么正直的人怎么会阴阳怪气呢?比起阴阳怪气和口嗨,李梦柳和神可比我强多了。至于练习阴阳怪气嘛,多亏了啵啵姐。世上本没有阴阳师,阴阳啵啵姐多了,也便成了阴阳师。

    编者注✍️:啵啵姐是指飞桨社区优优优秀的美女运营花花(@Tulip-hua)。

    梦师傅本人注✍️:郑必城根本不会阴阳怪气!

  10. 你口中的“神”是谁? 为什么称他为神呢?

    郑师傅: 神是衍哥,第一次把衍哥叫做神是和梦师傅打嘴炮的时候没过脑子说出来的话。但是后面了解到神的事迹以后,衍哥我只能说比神还神。

  11. 你有谈到想成为一位 PM,那可以和我们简单分享一下你的职业规划么?或者说:你想未来一年在职业上取得什么进展?🆕🆕

    郑师傅: 我职业规划基本上是:先当研发广泛学习,再当产品经理输出价值!

    ​在我的认知里 PM 的知识面首先是广,然后是深。带一个产品,我得懂需求;和研发吵架,我得懂代码大致的底层逻辑;对外输出,我得懂基本商业逻辑;产品的迭代,我得懂客户的工作流程。

    对应我的工作,看上去干的事情和 AI 没啥关系,实际上是 AI 落地的一整套的流程。我的工作涵盖了数据采集,数据标注和数据清洗,模型调参和训练以及模型部署。这几乎覆盖了边缘端 AI 部署的全场景。而其他知识,一般靠和大佬沟通,取长补短搞定。在工作以后,我定期的会去拜访一些上游链路的大佬,如某开发板的硬件负责人,某芯片厂商的事务负责人以及某产商的视觉算法负责人。和大佬沟通是我拓展视野和补充知识面的手段之一,毕竟人能坐到那个位置上,对某个方向一定是有自己的理解的。

    前段时间和百度某个产品已经聊过了。某法师说:"真正要做的事,连神明都不要说,不要告诉别人你的计划,让他们看结果。”对于我要做的事,一般是不立 Flag 的,这里就埋个伏笔。

  12. 相信你也接触到很多飞桨以及其他的 PM,哪位 PM 给你留下来最深的印象?哪位 PM 是你未来职业的模板?

    郑师傅: Paddle 的 PM 大佬们其实都很有特色也都给我留下挺深的印象。比如梦柳不但能力很强,嘴炮也很厉害,看上去很渣,其实比谁都纯;雷青姐经常工作到深夜,非常努力;军哥专业素养很高,表面上话不多像是个糙汉子,接触了以后让我感觉居然像个小文青;衍神表面看上去吊儿郎当的,实际上很强,对各种问题看的很透彻;孙哥表面看上去很能嘴,其实我觉得还有点内敛;佳维姐姐人非常漂亮,普通话也超级标准;凯哥居然能用英语和阿三交流的好好的。

    谁是我职业模版的话,我感觉我这 🐶 脑能把大家的优点全学会是不太可能的,但是都学个 10% 当个及格的 PM 还是有可能的

    左图为参观百度时小度拍的合照,右图为郑师傅最喜欢的喵喵喵雪糕
  13. 最后,你想对和你一样努力 💪 开源的开源者说些什么呢?

    郑师傅: 和张师傅(@liyulingyue)这群开源奋斗逼相比,我实在太摸鱼了。希望大家都能向张师傅学习,在开源中贡献自己的力量。

三、从你的全世界路过——郑师傅篇

​前几篇博客上都有板块谈大家对被采访者的印象,但是今天郑师傅想来个板块单独谈谈他对社区大佬的印象 🤩🤩🤩。由于在 Paddle 社区,大佬实在太多了,郑师傅就抽一部分大佬讲讲他对他们的印象。

001(@SigureMo)

我对 001 的第一印象就是代码能力很强,但是有点闷骚。作为带我入门的大佬,肯定是要感谢 001 的,因为 001 人实在太好了 ❤️,不光带我开源还带我“开原”,属于是工作生活两不误了。

应晟大佬@yingshengBD

应晟大佬是个很帅的糙汉子,刚认识他的时候给我的第一感觉就是相当的程序员,但是他参加直播的时候打理了一下,卧槽,嘎嘎帅啊。在我第一次参加黑客松的时候他给了我非常多的帮助,帮我积极协调了项目的各种进度内容,也让我了解到了一些职场相关的内容。

啵啵姐@Tulip-hua

原谅我管百度唯一指定童工叫姐。刚开始认识她的时候,她说别人叫她“芋泥妹” 👧,我想着我一 00 后也这么叫不是显得我太老了?所以叫她“啵啵姐”,后来发现大家都挺爱这么叫的。这位更是重量级,又能给我开源资源又能带我玩。世界可以没有耶路撒冷,但开源不能没有啵啵姐。

雷青大佬@leiqing1

雷青大佬在我参与开源的初期给了我很大很大的帮助,没有她做为桥梁我就没办法认识到那么多的百度研发工程师。雷青姐人也超级好,还记得她来福州的时候我请她吃饭,结账的时候她觉得不能让我一学生请客,把我手机藏起来买单,这才是神仙姐姐 🙍🏻‍♀️ 啊。算起来已经欠她两顿饭了,有机会一定要还了。

佳军大佬@jiangjiajun

蒋大佬的代码我只能说,牛逼,真他妈牛逼。人跟人的差距真大,一个在我看来很难的问题,他总是能一下子就找到关键点。在我开源生涯中他是各种指点,牛逼,真的牛逼。说起来还画了好多的饼给这位大佬,但是这些饼的工作量都有点大,最后大部分都慢慢不了了之了,现在正在慢慢捡起来做。

延君大佬@DefTruth

延君大佬人很热情,帮我审核了很多的代码,他不但在 coding 上给了我很大的帮助,还对我的职业生涯规划起了很大作用,在我两难的时候给了我很正确的建议。

梦柳姐@Ligoml

这位也是重量级,Paddle 除了神以外的嘴炮王。她在我这 Title 太多,包括但不限于我的 Github 头像拥有者、最帅猫拥有者、最肥猫拥有者、最傻猫拥有者。

孙哥@sunzhongkai588

一见如故,和我一样惨。我是扑克牌里的小王那孙哥就是扑克牌里的大王 🤡。

军哥@jzhang533

很感谢军哥帮忙推动了 Paddle 框架在 Arm 上的 whl 包的适配,没有军哥,Arm 虚拟硬件在百度云上的部署就没办法推动了,就是啥时候能上线 Paddle 官网就更好了。

衍哥(@blazingsiyan)

就一个字,神!

四、郑师傅的名言集

上图为郑师傅经典语录集

写在最后 💡

【开源江湖闲聊录】 是一项专门为 Paddle 社区的开发者打造的特色访谈栏目 📚。在这里,我们邀请到每一位别具一格且富有热情的开发者,通过文字或语音的方式进行深入采访 🎙️,探索并展现他们背后独一无二的故事,将他们的经历、见解和创意整理成精彩内容,呈现给整个社区。


+ + + + \ No newline at end of file diff --git a/sw.js b/sw.js new file mode 100644 index 0000000..f520ca9 --- /dev/null +++ b/sw.js @@ -0,0 +1 @@ +if(!self.define){let s,e={};const l=(l,n)=>(l=new URL(l+".js",n).href,e[l]||new Promise((e=>{if("document"in self){const s=document.createElement("script");s.src=l,s.onload=e,document.head.appendChild(s)}else s=l,importScripts(l),e()})).then((()=>{let s=e[l];if(!s)throw new Error(`Module ${l} didn’t register its module`);return s})));self.define=(n,r)=>{const i=s||("document"in self?document.currentScript.src:"")||location.href;if(e[i])return;let o={};const t=s=>l(s,i),a={module:{uri:i},exports:o,require:t};e[i]=Promise.all(n.map((s=>a[s]||t(s)))).then((s=>(r(...s),o)))}}define(["./workbox-f3e6b16a"],(function(s){"use strict";self.skipWaiting(),s.clientsClaim(),s.precacheAndRoute([{url:"404.html",revision:"f7d0bae3efc7496c68eb19426f4f0694"},{url:"about.html",revision:"7bd177208e0746bd67eeca9fd2aca895"},{url:"assets/about.md.CffTn8Vs.js",revision:null},{url:"assets/about.md.CffTn8Vs.lean.js",revision:null},{url:"assets/app.B1K96np7.js",revision:null},{url:"assets/chunks/first-post.CGto_Bts.js",revision:null},{url:"assets/chunks/framework.CEb3mtFd.js",revision:null},{url:"assets/chunks/MessageBox.BjkmF0_f.js",revision:null},{url:"assets/chunks/theme.C9Uh9Mc2.js",revision:null},{url:"assets/chunks/virtual_pwa-register.C_aq7dbN.js",revision:null},{url:"assets/chunks/workbox-window.prod.es5.DFjpnwFp.js",revision:null},{url:"assets/index.md.Bv6JB4-c.js",revision:null},{url:"assets/index.md.Bv6JB4-c.lean.js",revision:null},{url:"assets/pages_1.md.z66ZHE3n.js",revision:null},{url:"assets/pages_1.md.z66ZHE3n.lean.js",revision:null},{url:"assets/pages_2.md.CX191mJd.js",revision:null},{url:"assets/pages_2.md.CX191mJd.lean.js",revision:null},{url:"assets/pages_3.md.C-RcCS0h.js",revision:null},{url:"assets/pages_3.md.C-RcCS0h.lean.js",revision:null},{url:"assets/posts_2023-os-report.md.CA_G4PCe.js",revision:null},{url:"assets/posts_2023-os-report.md.CA_G4PCe.lean.js",revision:null},{url:"assets/posts_chengdu-kaiyuanshe.md.DFP35aMk.js",revision:null},{url:"assets/posts_chengdu-kaiyuanshe.md.DFP35aMk.lean.js",revision:null},{url:"assets/posts_chuan-story.md.CznaerLd.js",revision:null},{url:"assets/posts_chuan-story.md.CznaerLd.lean.js",revision:null},{url:"assets/posts_first-post.md.BETAI2jl.js",revision:null},{url:"assets/posts_first-post.md.BETAI2jl.lean.js",revision:null},{url:"assets/posts_hackathon-5th-episode01.md.CxQNsjlT.js",revision:null},{url:"assets/posts_hackathon-5th-episode01.md.CxQNsjlT.lean.js",revision:null},{url:"assets/posts_hackathon-5th-episode02.md.BhLuUEr6.js",revision:null},{url:"assets/posts_hackathon-5th-episode02.md.BhLuUEr6.lean.js",revision:null},{url:"assets/posts_hackathon-5th-episode03.md.25C8UpHA.js",revision:null},{url:"assets/posts_hackathon-5th-episode03.md.25C8UpHA.lean.js",revision:null},{url:"assets/posts_huanggua-story.md.vbJ2Gjxx.js",revision:null},{url:"assets/posts_huanggua-story.md.vbJ2Gjxx.lean.js",revision:null},{url:"assets/posts_huangjiyi-story.md.Bdyh1PqX.js",revision:null},{url:"assets/posts_huangjiyi-story.md.Bdyh1PqX.lean.js",revision:null},{url:"assets/posts_limin-story.md.CtGmBrw5.js",revision:null},{url:"assets/posts_limin-story.md.CtGmBrw5.lean.js",revision:null},{url:"assets/posts_loaf-sharing.md.CLynDrU1.js",revision:null},{url:"assets/posts_loaf-sharing.md.CLynDrU1.lean.js",revision:null},{url:"assets/posts_nknan-story.md.C0DqNXs8.js",revision:null},{url:"assets/posts_nknan-story.md.C0DqNXs8.lean.js",revision:null},{url:"assets/posts_paddleocr-release.md.B0ViGL7p.js",revision:null},{url:"assets/posts_paddleocr-release.md.B0ViGL7p.lean.js",revision:null},{url:"assets/posts_pfcc-36th.md.DYTL3ikw.js",revision:null},{url:"assets/posts_pfcc-36th.md.DYTL3ikw.lean.js",revision:null},{url:"assets/posts_pku-course.md.BIsX0K5j.js",revision:null},{url:"assets/posts_pku-course.md.BIsX0K5j.lean.js",revision:null},{url:"assets/posts_pytorch-conference-01.md.BBNDYGg1.js",revision:null},{url:"assets/posts_pytorch-conference-01.md.BBNDYGg1.lean.js",revision:null},{url:"assets/posts_sanbu-story.md.Bbv7dzA3.js",revision:null},{url:"assets/posts_sanbu-story.md.Bbv7dzA3.lean.js",revision:null},{url:"assets/posts_shun-story.md.uWHLiez7.js",revision:null},{url:"assets/posts_shun-story.md.uWHLiez7.lean.js",revision:null},{url:"assets/posts_starter-camp.md.Db9PfhHS.js",revision:null},{url:"assets/posts_starter-camp.md.Db9PfhHS.lean.js",revision:null},{url:"assets/posts_suzhou-kaifangyuanzi.md.BWTb1jy6.js",revision:null},{url:"assets/posts_suzhou-kaifangyuanzi.md.BWTb1jy6.lean.js",revision:null},{url:"assets/posts_tao-story.md.DPMbREGv.js",revision:null},{url:"assets/posts_tao-story.md.DPMbREGv.lean.js",revision:null},{url:"assets/posts_wangxin-story.md.bHMq97Rw.js",revision:null},{url:"assets/posts_wangxin-story.md.bHMq97Rw.lean.js",revision:null},{url:"assets/posts_wuxi-kaifangyuanzi.md.BjTDfesd.js",revision:null},{url:"assets/posts_wuxi-kaifangyuanzi.md.BjTDfesd.lean.js",revision:null},{url:"assets/posts_xdoctest-project.md.DIdZvN6i.js",revision:null},{url:"assets/posts_xdoctest-project.md.DIdZvN6i.lean.js",revision:null},{url:"assets/posts_xian-event.md.CNEXSNi8.js",revision:null},{url:"assets/posts_xian-event.md.CNEXSNi8.lean.js",revision:null},{url:"assets/posts_zhangyiqiao-story.md.DNR0hYA-.js",revision:null},{url:"assets/posts_zhangyiqiao-story.md.DNR0hYA-.lean.js",revision:null},{url:"assets/posts_zheng-story.md.Ck4Zn1Rf.js",revision:null},{url:"assets/posts_zheng-story.md.Ck4Zn1Rf.lean.js",revision:null},{url:"assets/style.CY_1Pjyc.css",revision:null},{url:"index.html",revision:"e8c6d30ec7b328c798ccc3f62e2b3233"},{url:"pages/1.html",revision:"887368171aa21d5401dbd69ce0fe30a5"},{url:"pages/2.html",revision:"8528bbb1c872f922d5798db0f8f32b34"},{url:"pages/3.html",revision:"615a8834cce8e2d8ba679799f718524c"},{url:"posts/2023-os-report.html",revision:"f357be5a7fe2bbeb810841de83e93e08"},{url:"posts/chengdu-kaiyuanshe.html",revision:"e371db633a4d82697e3716da92997eb2"},{url:"posts/chuan-story.html",revision:"b322503e82f0e65845dd365491aebaed"},{url:"posts/first-post.html",revision:"e98f81ceffaf320491cc57371a70e20d"},{url:"posts/hackathon-5th-episode01.html",revision:"94361f297822c3502d6ca7b1808a297d"},{url:"posts/hackathon-5th-episode02.html",revision:"7a288ced03c26ba3c821df1e04602fce"},{url:"posts/hackathon-5th-episode03.html",revision:"8d2e2b96a4e127388eed9a3b1854151f"},{url:"posts/huanggua-story.html",revision:"5a5f67f50c22456435550ca40d8622c4"},{url:"posts/huangjiyi-story.html",revision:"0fc192c85f0458ffbedb2a15c6837973"},{url:"posts/limin-story.html",revision:"c33a3d49c10aedf076b3c5660884703a"},{url:"posts/loaf-sharing.html",revision:"af142d9ca43e6566e8833100e3378b03"},{url:"posts/nknan-story.html",revision:"ac3f0ba75031c147611bb52f05c11659"},{url:"posts/paddleocr-release.html",revision:"89dae9977bb6ce19fe68429619df68de"},{url:"posts/pfcc-36th.html",revision:"ad9b4df827d1c7737ae8669692b0c0b7"},{url:"posts/pku-course.html",revision:"d6939d504a8bcb330e68a1a7c184bc65"},{url:"posts/pytorch-conference-01.html",revision:"eae1140aa3f8cd9109f0380c87a9da1e"},{url:"posts/sanbu-story.html",revision:"6ae27571a6e280ee73e4303efe830e78"},{url:"posts/shun-story.html",revision:"8e08f6a9a16f4e76c0df9ec1648a8f7e"},{url:"posts/starter-camp.html",revision:"096cd58dba81b1449180e25ee014d68c"},{url:"posts/suzhou-kaifangyuanzi.html",revision:"f54f141529f284f60e81956e8e8a70a2"},{url:"posts/tao-story.html",revision:"24af2544cc4a2fa87586d62d95f23d17"},{url:"posts/wangxin-story.html",revision:"1316e2831260c67d4ede03509508c0ee"},{url:"posts/wuxi-kaifangyuanzi.html",revision:"db6adf6309b22fbc8a1469b45de52bd5"},{url:"posts/xdoctest-project.html",revision:"e86ae6f05278ce44a8d0c9f690b1a40f"},{url:"posts/xian-event.html",revision:"3edce2ebdc4fc536d5ac89b24a15af39"},{url:"posts/zhangyiqiao-story.html",revision:"201ef526c9f43628cb3f4b73f2a24716"},{url:"posts/zheng-story.html",revision:"deb5bab0b926259369a5566ecfd81946"},{url:"icons/pwa-64x64.png",revision:"d7568fb849f66efbee8f28a7763667fb"},{url:"icons/pwa-192x192.png",revision:"0fb4e162b2a9b5f5925621f526b8a96b"},{url:"icons/pwa-512x512.png",revision:"a7081bf54878f8b558d2306aa8ca3832"},{url:"icons/maskable-icon-512x512.png",revision:"b540c6d9f398cb87b3baf56342570ba5"},{url:"manifest.webmanifest",revision:"d6116e4c85c1d87a0e9dd3eefa90def3"}],{}),s.cleanupOutdatedCaches(),s.registerRoute(new s.NavigationRoute(s.createHandlerBoundToURL("index.html")))})); diff --git a/workbox-f3e6b16a.js b/workbox-f3e6b16a.js new file mode 100644 index 0000000..8c012bc --- /dev/null +++ b/workbox-f3e6b16a.js @@ -0,0 +1 @@ +define(["exports"],(function(t){"use strict";try{self["workbox:core:7.0.0"]&&_()}catch(t){}const e=(t,...e)=>{let s=t;return e.length>0&&(s+=` :: ${JSON.stringify(e)}`),s};class s extends Error{constructor(t,s){super(e(t,s)),this.name=t,this.details=s}}try{self["workbox:routing:7.0.0"]&&_()}catch(t){}const n=t=>t&&"object"==typeof t?t:{handle:t};class i{constructor(t,e,s="GET"){this.handler=n(e),this.match=t,this.method=s}setCatchHandler(t){this.catchHandler=n(t)}}class r extends i{constructor(t,e,s){super((({url:e})=>{const s=t.exec(e.href);if(s&&(e.origin===location.origin||0===s.index))return s.slice(1)}),e,s)}}class o{constructor(){this.t=new Map,this.i=new Map}get routes(){return this.t}addFetchListener(){self.addEventListener("fetch",(t=>{const{request:e}=t,s=this.handleRequest({request:e,event:t});s&&t.respondWith(s)}))}addCacheListener(){self.addEventListener("message",(t=>{if(t.data&&"CACHE_URLS"===t.data.type){const{payload:e}=t.data,s=Promise.all(e.urlsToCache.map((e=>{"string"==typeof e&&(e=[e]);const s=new Request(...e);return this.handleRequest({request:s,event:t})})));t.waitUntil(s),t.ports&&t.ports[0]&&s.then((()=>t.ports[0].postMessage(!0)))}}))}handleRequest({request:t,event:e}){const s=new URL(t.url,location.href);if(!s.protocol.startsWith("http"))return;const n=s.origin===location.origin,{params:i,route:r}=this.findMatchingRoute({event:e,request:t,sameOrigin:n,url:s});let o=r&&r.handler;const c=t.method;if(!o&&this.i.has(c)&&(o=this.i.get(c)),!o)return;let a;try{a=o.handle({url:s,request:t,event:e,params:i})}catch(t){a=Promise.reject(t)}const h=r&&r.catchHandler;return a instanceof Promise&&(this.o||h)&&(a=a.catch((async n=>{if(h)try{return await h.handle({url:s,request:t,event:e,params:i})}catch(t){t instanceof Error&&(n=t)}if(this.o)return this.o.handle({url:s,request:t,event:e});throw n}))),a}findMatchingRoute({url:t,sameOrigin:e,request:s,event:n}){const i=this.t.get(s.method)||[];for(const r of i){let i;const o=r.match({url:t,sameOrigin:e,request:s,event:n});if(o)return i=o,(Array.isArray(i)&&0===i.length||o.constructor===Object&&0===Object.keys(o).length||"boolean"==typeof o)&&(i=void 0),{route:r,params:i}}return{}}setDefaultHandler(t,e="GET"){this.i.set(e,n(t))}setCatchHandler(t){this.o=n(t)}registerRoute(t){this.t.has(t.method)||this.t.set(t.method,[]),this.t.get(t.method).push(t)}unregisterRoute(t){if(!this.t.has(t.method))throw new s("unregister-route-but-not-found-with-method",{method:t.method});const e=this.t.get(t.method).indexOf(t);if(!(e>-1))throw new s("unregister-route-route-not-registered");this.t.get(t.method).splice(e,1)}}let c;const a=()=>(c||(c=new o,c.addFetchListener(),c.addCacheListener()),c);function h(t,e,n){let o;if("string"==typeof t){const s=new URL(t,location.href);o=new i((({url:t})=>t.href===s.href),e,n)}else if(t instanceof RegExp)o=new r(t,e,n);else if("function"==typeof t)o=new i(t,e,n);else{if(!(t instanceof i))throw new s("unsupported-route-type",{moduleName:"workbox-routing",funcName:"registerRoute",paramName:"capture"});o=t}return a().registerRoute(o),o}const u={googleAnalytics:"googleAnalytics",precache:"precache-v2",prefix:"workbox",runtime:"runtime",suffix:"undefined"!=typeof registration?registration.scope:""},l=t=>[u.prefix,t,u.suffix].filter((t=>t&&t.length>0)).join("-"),f=t=>t||l(u.precache),w=t=>t||l(u.runtime);function d(t,e){const s=e();return t.waitUntil(s),s}try{self["workbox:precaching:7.0.0"]&&_()}catch(t){}function p(t){if(!t)throw new s("add-to-cache-list-unexpected-type",{entry:t});if("string"==typeof t){const e=new URL(t,location.href);return{cacheKey:e.href,url:e.href}}const{revision:e,url:n}=t;if(!n)throw new s("add-to-cache-list-unexpected-type",{entry:t});if(!e){const t=new URL(n,location.href);return{cacheKey:t.href,url:t.href}}const i=new URL(n,location.href),r=new URL(n,location.href);return i.searchParams.set("__WB_REVISION__",e),{cacheKey:i.href,url:r.href}}class y{constructor(){this.updatedURLs=[],this.notUpdatedURLs=[],this.handlerWillStart=async({request:t,state:e})=>{e&&(e.originalRequest=t)},this.cachedResponseWillBeUsed=async({event:t,state:e,cachedResponse:s})=>{if("install"===t.type&&e&&e.originalRequest&&e.originalRequest instanceof Request){const t=e.originalRequest.url;s?this.notUpdatedURLs.push(t):this.updatedURLs.push(t)}return s}}}class g{constructor({precacheController:t}){this.cacheKeyWillBeUsed=async({request:t,params:e})=>{const s=(null==e?void 0:e.cacheKey)||this.h.getCacheKeyForURL(t.url);return s?new Request(s,{headers:t.headers}):t},this.h=t}}let R;async function m(t,e){let n=null;if(t.url){n=new URL(t.url).origin}if(n!==self.location.origin)throw new s("cross-origin-copy-response",{origin:n});const i=t.clone(),r={headers:new Headers(i.headers),status:i.status,statusText:i.statusText},o=e?e(r):r,c=function(){if(void 0===R){const t=new Response("");if("body"in t)try{new Response(t.body),R=!0}catch(t){R=!1}R=!1}return R}()?i.body:await i.blob();return new Response(c,o)}function v(t,e){const s=new URL(t);for(const t of e)s.searchParams.delete(t);return s.href}class q{constructor(){this.promise=new Promise(((t,e)=>{this.resolve=t,this.reject=e}))}}const U=new Set;try{self["workbox:strategies:7.0.0"]&&_()}catch(t){}function L(t){return"string"==typeof t?new Request(t):t}class b{constructor(t,e){this.u={},Object.assign(this,e),this.event=e.event,this.l=t,this.p=new q,this.R=[],this.m=[...t.plugins],this.v=new Map;for(const t of this.m)this.v.set(t,{});this.event.waitUntil(this.p.promise)}async fetch(t){const{event:e}=this;let n=L(t);if("navigate"===n.mode&&e instanceof FetchEvent&&e.preloadResponse){const t=await e.preloadResponse;if(t)return t}const i=this.hasCallback("fetchDidFail")?n.clone():null;try{for(const t of this.iterateCallbacks("requestWillFetch"))n=await t({request:n.clone(),event:e})}catch(t){if(t instanceof Error)throw new s("plugin-error-request-will-fetch",{thrownErrorMessage:t.message})}const r=n.clone();try{let t;t=await fetch(n,"navigate"===n.mode?void 0:this.l.fetchOptions);for(const s of this.iterateCallbacks("fetchDidSucceed"))t=await s({event:e,request:r,response:t});return t}catch(t){throw i&&await this.runCallbacks("fetchDidFail",{error:t,event:e,originalRequest:i.clone(),request:r.clone()}),t}}async fetchAndCachePut(t){const e=await this.fetch(t),s=e.clone();return this.waitUntil(this.cachePut(t,s)),e}async cacheMatch(t){const e=L(t);let s;const{cacheName:n,matchOptions:i}=this.l,r=await this.getCacheKey(e,"read"),o=Object.assign(Object.assign({},i),{cacheName:n});s=await caches.match(r,o);for(const t of this.iterateCallbacks("cachedResponseWillBeUsed"))s=await t({cacheName:n,matchOptions:i,cachedResponse:s,request:r,event:this.event})||void 0;return s}async cachePut(t,e){const n=L(t);var i;await(i=0,new Promise((t=>setTimeout(t,i))));const r=await this.getCacheKey(n,"write");if(!e)throw new s("cache-put-with-no-response",{url:(o=r.url,new URL(String(o),location.href).href.replace(new RegExp(`^${location.origin}`),""))});var o;const c=await this.q(e);if(!c)return!1;const{cacheName:a,matchOptions:h}=this.l,u=await self.caches.open(a),l=this.hasCallback("cacheDidUpdate"),f=l?await async function(t,e,s,n){const i=v(e.url,s);if(e.url===i)return t.match(e,n);const r=Object.assign(Object.assign({},n),{ignoreSearch:!0}),o=await t.keys(e,r);for(const e of o)if(i===v(e.url,s))return t.match(e,n)}(u,r.clone(),["__WB_REVISION__"],h):null;try{await u.put(r,l?c.clone():c)}catch(t){if(t instanceof Error)throw"QuotaExceededError"===t.name&&await async function(){for(const t of U)await t()}(),t}for(const t of this.iterateCallbacks("cacheDidUpdate"))await t({cacheName:a,oldResponse:f,newResponse:c.clone(),request:r,event:this.event});return!0}async getCacheKey(t,e){const s=`${t.url} | ${e}`;if(!this.u[s]){let n=t;for(const t of this.iterateCallbacks("cacheKeyWillBeUsed"))n=L(await t({mode:e,request:n,event:this.event,params:this.params}));this.u[s]=n}return this.u[s]}hasCallback(t){for(const e of this.l.plugins)if(t in e)return!0;return!1}async runCallbacks(t,e){for(const s of this.iterateCallbacks(t))await s(e)}*iterateCallbacks(t){for(const e of this.l.plugins)if("function"==typeof e[t]){const s=this.v.get(e),n=n=>{const i=Object.assign(Object.assign({},n),{state:s});return e[t](i)};yield n}}waitUntil(t){return this.R.push(t),t}async doneWaiting(){let t;for(;t=this.R.shift();)await t}destroy(){this.p.resolve(null)}async q(t){let e=t,s=!1;for(const t of this.iterateCallbacks("cacheWillUpdate"))if(e=await t({request:this.request,response:e,event:this.event})||void 0,s=!0,!e)break;return s||e&&200!==e.status&&(e=void 0),e}}class C{constructor(t={}){this.cacheName=w(t.cacheName),this.plugins=t.plugins||[],this.fetchOptions=t.fetchOptions,this.matchOptions=t.matchOptions}handle(t){const[e]=this.handleAll(t);return e}handleAll(t){t instanceof FetchEvent&&(t={event:t,request:t.request});const e=t.event,s="string"==typeof t.request?new Request(t.request):t.request,n="params"in t?t.params:void 0,i=new b(this,{event:e,request:s,params:n}),r=this.U(i,s,e);return[r,this.L(r,i,s,e)]}async U(t,e,n){let i;await t.runCallbacks("handlerWillStart",{event:n,request:e});try{if(i=await this._(e,t),!i||"error"===i.type)throw new s("no-response",{url:e.url})}catch(s){if(s instanceof Error)for(const r of t.iterateCallbacks("handlerDidError"))if(i=await r({error:s,event:n,request:e}),i)break;if(!i)throw s}for(const s of t.iterateCallbacks("handlerWillRespond"))i=await s({event:n,request:e,response:i});return i}async L(t,e,s,n){let i,r;try{i=await t}catch(r){}try{await e.runCallbacks("handlerDidRespond",{event:n,request:s,response:i}),await e.doneWaiting()}catch(t){t instanceof Error&&(r=t)}if(await e.runCallbacks("handlerDidComplete",{event:n,request:s,response:i,error:r}),e.destroy(),r)throw r}}class E extends C{constructor(t={}){t.cacheName=f(t.cacheName),super(t),this.C=!1!==t.fallbackToNetwork,this.plugins.push(E.copyRedirectedCacheableResponsesPlugin)}async _(t,e){const s=await e.cacheMatch(t);return s||(e.event&&"install"===e.event.type?await this.O(t,e):await this.N(t,e))}async N(t,e){let n;const i=e.params||{};if(!this.C)throw new s("missing-precache-entry",{cacheName:this.cacheName,url:t.url});{const s=i.integrity,r=t.integrity,o=!r||r===s;n=await e.fetch(new Request(t,{integrity:"no-cors"!==t.mode?r||s:void 0})),s&&o&&"no-cors"!==t.mode&&(this.k(),await e.cachePut(t,n.clone()))}return n}async O(t,e){this.k();const n=await e.fetch(t);if(!await e.cachePut(t,n.clone()))throw new s("bad-precaching-response",{url:t.url,status:n.status});return n}k(){let t=null,e=0;for(const[s,n]of this.plugins.entries())n!==E.copyRedirectedCacheableResponsesPlugin&&(n===E.defaultPrecacheCacheabilityPlugin&&(t=s),n.cacheWillUpdate&&e++);0===e?this.plugins.push(E.defaultPrecacheCacheabilityPlugin):e>1&&null!==t&&this.plugins.splice(t,1)}}E.defaultPrecacheCacheabilityPlugin={cacheWillUpdate:async({response:t})=>!t||t.status>=400?null:t},E.copyRedirectedCacheableResponsesPlugin={cacheWillUpdate:async({response:t})=>t.redirected?await m(t):t};class O{constructor({cacheName:t,plugins:e=[],fallbackToNetwork:s=!0}={}){this.K=new Map,this.P=new Map,this.T=new Map,this.l=new E({cacheName:f(t),plugins:[...e,new g({precacheController:this})],fallbackToNetwork:s}),this.install=this.install.bind(this),this.activate=this.activate.bind(this)}get strategy(){return this.l}precache(t){this.addToCacheList(t),this.W||(self.addEventListener("install",this.install),self.addEventListener("activate",this.activate),this.W=!0)}addToCacheList(t){const e=[];for(const n of t){"string"==typeof n?e.push(n):n&&void 0===n.revision&&e.push(n.url);const{cacheKey:t,url:i}=p(n),r="string"!=typeof n&&n.revision?"reload":"default";if(this.K.has(i)&&this.K.get(i)!==t)throw new s("add-to-cache-list-conflicting-entries",{firstEntry:this.K.get(i),secondEntry:t});if("string"!=typeof n&&n.integrity){if(this.T.has(t)&&this.T.get(t)!==n.integrity)throw new s("add-to-cache-list-conflicting-integrities",{url:i});this.T.set(t,n.integrity)}if(this.K.set(i,t),this.P.set(i,r),e.length>0){const t=`Workbox is precaching URLs without revision info: ${e.join(", ")}\nThis is generally NOT safe. Learn more at https://bit.ly/wb-precache`;console.warn(t)}}}install(t){return d(t,(async()=>{const e=new y;this.strategy.plugins.push(e);for(const[e,s]of this.K){const n=this.T.get(s),i=this.P.get(e),r=new Request(e,{integrity:n,cache:i,credentials:"same-origin"});await Promise.all(this.strategy.handleAll({params:{cacheKey:s},request:r,event:t}))}const{updatedURLs:s,notUpdatedURLs:n}=e;return{updatedURLs:s,notUpdatedURLs:n}}))}activate(t){return d(t,(async()=>{const t=await self.caches.open(this.strategy.cacheName),e=await t.keys(),s=new Set(this.K.values()),n=[];for(const i of e)s.has(i.url)||(await t.delete(i),n.push(i.url));return{deletedURLs:n}}))}getURLsToCacheKeys(){return this.K}getCachedURLs(){return[...this.K.keys()]}getCacheKeyForURL(t){const e=new URL(t,location.href);return this.K.get(e.href)}getIntegrityForCacheKey(t){return this.T.get(t)}async matchPrecache(t){const e=t instanceof Request?t.url:t,s=this.getCacheKeyForURL(e);if(s){return(await self.caches.open(this.strategy.cacheName)).match(s)}}createHandlerBoundToURL(t){const e=this.getCacheKeyForURL(t);if(!e)throw new s("non-precached-url",{url:t});return s=>(s.request=new Request(t),s.params=Object.assign({cacheKey:e},s.params),this.strategy.handle(s))}}let x;const N=()=>(x||(x=new O),x);class k extends i{constructor(t,e){super((({request:s})=>{const n=t.getURLsToCacheKeys();for(const i of function*(t,{ignoreURLParametersMatching:e=[/^utm_/,/^fbclid$/],directoryIndex:s="index.html",cleanURLs:n=!0,urlManipulation:i}={}){const r=new URL(t,location.href);r.hash="",yield r.href;const o=function(t,e=[]){for(const s of[...t.searchParams.keys()])e.some((t=>t.test(s)))&&t.searchParams.delete(s);return t}(r,e);if(yield o.href,s&&o.pathname.endsWith("/")){const t=new URL(o.href);t.pathname+=s,yield t.href}if(n){const t=new URL(o.href);t.pathname+=".html",yield t.href}if(i){const t=i({url:r});for(const e of t)yield e.href}}(s.url,e)){const e=n.get(i);if(e){return{cacheKey:e,integrity:t.getIntegrityForCacheKey(e)}}}}),t.strategy)}}t.NavigationRoute=class extends i{constructor(t,{allowlist:e=[/./],denylist:s=[]}={}){super((t=>this.j(t)),t),this.M=e,this.S=s}j({url:t,request:e}){if(e&&"navigate"!==e.mode)return!1;const s=t.pathname+t.search;for(const t of this.S)if(t.test(s))return!1;return!!this.M.some((t=>t.test(s)))}},t.cleanupOutdatedCaches=function(){self.addEventListener("activate",(t=>{const e=f();t.waitUntil((async(t,e="-precache-")=>{const s=(await self.caches.keys()).filter((s=>s.includes(e)&&s.includes(self.registration.scope)&&s!==t));return await Promise.all(s.map((t=>self.caches.delete(t)))),s})(e).then((t=>{})))}))},t.clientsClaim=function(){self.addEventListener("activate",(()=>self.clients.claim()))},t.createHandlerBoundToURL=function(t){return N().createHandlerBoundToURL(t)},t.precacheAndRoute=function(t,e){!function(t){N().precache(t)}(t),function(t){const e=N();h(new k(e,t))}(e)},t.registerRoute=h}));